| import os |
| import time |
| import telebot |
| from telebot import apihelper |
| import yt_dlp |
| import uvicorn |
| from fastapi import FastAPI, Request |
| from fastapi.responses import HTMLResponse |
| import requests |
|
|
| |
| TOKEN = os.getenv("BOT_TOKEN") |
| WEBHOOK_URL = "https://armaansingh752k1-all-in-one-downloader.hf.space/webhook" |
|
|
| |
| PROXY_TEMPLATES = [ |
| "https://teleapi.muhammad.workers.dev/bot{0}/{1}", |
| "https://tgproxy.onrender.com/bot{0}/{1}", |
| "https://telegram-api-proxy-anonymous.pages.dev/api/bot{0}/{1}" |
| ] |
|
|
| CURRENT_PROXY_INDEX = 0 |
|
|
| def custom_request_sender(method, url, **kwargs): |
| """ |
| Hugging Face ၏ IP block အား ကျော်လွှားရန် requests အားလုံးကို Web-Proxy Gateways များမှတစ်ဆင့် ဖြတ်သန်းစေသည်။ |
| """ |
| global CURRENT_PROXY_INDEX |
| |
| for i in range(len(PROXY_TEMPLATES)): |
| idx = (CURRENT_PROXY_INDEX + i) % len(PROXY_TEMPLATES) |
| proxy_base = PROXY_TEMPLATES[idx] |
| |
| try: |
| url_parts = url.split("/bot") |
| if len(url_parts) > 1: |
| method_path = f"/bot{url_parts[1]}" |
| else: |
| method_path = f"/bot{TOKEN}/" + url.split("/")[-1] |
| |
| target_url = proxy_base.split("/bot")[0] + method_path |
| except Exception: |
| target_url = url |
|
|
| try: |
| if 'timeout' not in kwargs or kwargs['timeout'] is None: |
| kwargs['timeout'] = (10, 20) |
| |
| response = requests.request(method, target_url, **kwargs) |
| if response.status_code == 200: |
| try: |
| res_json = response.json() |
| if isinstance(res_json, dict) and 'ok' in res_json: |
| CURRENT_PROXY_INDEX = idx |
| return response |
| except Exception: |
| pass |
| except Exception: |
| continue |
| |
| return requests.request(method, url, **kwargs) |
|
|
| apihelper.custom_request_sender = custom_request_sender |
|
|
| |
| bot = telebot.TeleBot(TOKEN, threaded=False) |
|
|
| |
| app = FastAPI() |
|
|
| @app.get("/", response_class=HTMLResponse) |
| def dashboard(): |
| """ |
| Hugging Face Space ကို ဝင်ကြည့်လျှင် မြင်တွေ့ရမည့် Live Monitor UI |
| """ |
| html_content = f""" |
| <!DOCTYPE html> |
| <html> |
| <head> |
| <meta charset="utf-8"> |
| <title>All-in-One Downloader Bot Dashboard</title> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| <script src="https://cdn.tailwindcss.com"></script> |
| <link href="https://fonts.googleapis.com/css2?family=Urbanist:wght@400;600;700&display=swap" rel="stylesheet"> |
| <style> |
| body {{ font-family: 'Urbanist', sans-serif; }} |
| </style> |
| </head> |
| <body class="bg-slate-950 text-slate-100 min-h-screen flex items-center justify-center p-4"> |
| <div class="max-w-xl w-full bg-slate-900 border border-slate-800 rounded-3xl p-6 shadow-2xl"> |
| <div class="text-center mb-6"> |
| <span class="text-4xl">🚀</span> |
| <h1 class="text-2xl font-bold mt-2 text-lime-400 font-mono">Gateway Console</h1> |
| <p class="text-xs text-slate-400 mt-1">Hugging Face Real-Time Webhook Bypass</p> |
| </div> |
| |
| <div class="space-y-4"> |
| <div class="flex justify-between items-center bg-slate-950 p-4 rounded-xl border border-slate-800/50"> |
| <span class="text-slate-400 text-sm">Server Status</span> |
| <span class="px-2.5 py-0.5 bg-lime-500/10 text-lime-400 text-[10px] font-semibold rounded-full border border-lime-500/20">ONLINE / READY</span> |
| </div> |
| |
| <div class="bg-slate-950 p-4 rounded-xl border border-slate-800/50 text-xs text-slate-300 space-y-2"> |
| <p class="font-semibold text-lime-400">💡 လမ်းညွှန်ချက် -</p> |
| <p>၁။ အောက်ပါ အစိမ်းရောင်ခလုတ်ကို နှိပ်ပါ။</p> |
| <p>၂။ သင့်ဖုန်း Browser သည် Telegram API ဆီသို့ တိုက်ရိုက်ဆက်သွယ်ပြီး Webhook ကို အောင်မြင်စွာ တပ်ဆင်ပေးသွားမည် ဖြစ်သည်။</p> |
| </div> |
| |
| <button onclick="activateWebhookClientSide()" class="w-full py-3 bg-gradient-to-r from-lime-500 to-emerald-600 hover:from-lime-400 hover:to-emerald-500 text-slate-950 font-bold rounded-xl shadow-lg transition-all transform hover:scale-[1.01] active:scale-[0.99] text-xs uppercase tracking-wider"> |
| ⚡ Register Webhook (Client-Side Bypass) |
| </button> |
| </div> |
| </div> |
| <script> |
| function activateWebhookClientSide() {{ |
| const token = "{TOKEN}"; |
| const webhookUrl = "{WEBHOOK_URL}"; |
| const telegramUrl = "https://api.telegram.org/bot" + token + "/setWebhook?url=" + encodeURIComponent(webhookUrl); |
| |
| alert("စတင်တပ်ဆင်နေပါပြီ... ခဏစောင့်ပါ..."); |
| |
| fetch(telegramUrl) |
| .then(response => response.json()) |
| .then(data => {{ |
| if (data.ok) {{ |
| alert("✅ Webhook တပ်ဆင်မှု ရာနှုန်းပြည့် အောင်မြင်သွားပါပြီခင်ဗျာ! ယခု Bot ဆီသို့ သွားရောက်စမ်းသပ်နိုင်ပါပြီ။"); |
| }} else {{ |
| alert("❌ တပ်ဆင်မှု မအောင်မြင်ပါ: " + JSON.stringify(data)); |
| }} |
| }}) |
| .catch(error => {{ |
| alert("❌ ချိတ်ဆက်မှု Error: " + error + "\\n(VPN ဖွင့်ထားပါက ခေတ္တပိတ်ပြီး ပြန်လည်စမ်းသပ်ပေးပါ)"); |
| }}); |
| }} |
| </script> |
| </body> |
| </html> |
| """ |
| return html_content |
|
|
| @app.post("/webhook") |
| async def telegram_webhook(request: Request): |
| if request.headers.get('content-type') == 'application/json': |
| json_string = await request.body() |
| update = telebot.types.Update.de_json(json_string.decode('utf-8')) |
| bot.process_new_updates([update]) |
| return {"status": "ok"} |
| return {"status": "error", "message": "Invalid Content-Type"} |
|
|
| |
| @bot.message_handler(commands=['start']) |
| def send_welcome(message): |
| welcome_text = ( |
| "👋 မင်္ဂလာပါ။ အားလုံးအဆင်ပြေမယ့် All-in-One Downloader Bot ပါ။\n\n" |
| "✨ **ဒေါင်းလုဒ်လုပ်ပေးနိုင်သည်များ:**\n" |
| "🔹 TikTok (ဗီဒီယို/ဓာတ်ပုံ/Story) - Watermark မပါဘဲ ✨\n" |
| "🔹 Instagram (ဗီဒီယို/ဓာတ်ပုံ/Story/Reels) - Original Quality ✨\n\n" |
| "လူကြီးမင်း ဒေါင်းလုဒ်ဆွဲလိုသည့် လင့်ခ် (Link) ကို ပို့ပေးလိုက်ပါခင်ဗျာ! 🚀" |
| ) |
| bot.send_message(message.chat.id, welcome_text) |
|
|
| def download_via_tikwm(url): |
| """ |
| TikTok Slides နှင့် ဗီဒီယိုများအား ရာနှုန်းပြည့်အောင်မြင်စွာ ဒေါင်းလုဒ်ဆွဲပေးနိုင်သော Tikwm Dedicated API စနစ် |
| """ |
| api_url = "https://www.tikwm.com/api/" |
| params = {"url": url} |
| try: |
| r = requests.get(api_url, params=params, timeout=15) |
| if r.status_code == 200: |
| res_data = r.json() |
| if res_data.get("code") == 0: |
| data = res_data.get("data", {}) |
| |
| if "images" in data and data["images"]: |
| img_list = [] |
| for img in data["images"]: |
| img_list.append({"url": img, "type": "photo"}) |
| return img_list |
| |
| elif "play" in data: |
| video_url = "https://www.tikwm.com" + data["play"] if data["play"].startswith("/") else data["play"] |
| return [{"url": video_url, "type": "video"}] |
| except Exception as e: |
| print(f"[Tikwm API Error] {e}") |
| return [] |
|
|
| def download_via_cobalt_api(url): |
| """ |
| Instagram နှင့် အခြားလင့်ခ်များအတွက် Cobalt API စနစ် |
| """ |
| api_url = "https://api.cobalt.tools/api/json" |
| headers = { |
| "Accept": "application/json", |
| "Content-Type": "application/json", |
| "Referer": "https://cobalt.tools/" |
| } |
| payload = { |
| "url": url, |
| "videoQuality": "720", |
| "isNoWatermark": True |
| } |
| try: |
| response = requests.post(api_url, json=payload, headers=headers, timeout=15) |
| if response.status_code == 200: |
| data = response.json() |
| status = data.get("status") |
| if status in ["stream", "redirect"]: |
| return [{"url": data.get("url"), "type": "video"}] |
| elif status == "picker": |
| items = [] |
| for p in data.get("picker", []): |
| items.append({"url": p.get("url"), "type": "photo"}) |
| return items |
| except Exception as e: |
| print(f"[Cobalt API Error] {e}") |
| return [] |
|
|
| @bot.message_handler(func=lambda message: True) |
| def process_download_request(message): |
| url = message.text |
| chat_id = message.chat.id |
| |
| if not (url.startswith("http://") or url.startswith("https://")): |
| bot.send_message(chat_id, "⚠️ ကျေးဇူးပြု၍ မှန်ကန်သော Link ကို ပို့ပေးပါခင်ဗျာ။") |
| return |
|
|
| status_msg = bot.send_message(chat_id, "🔎 အချက်အလက်များကို စစ်ဆေးနေပါတယ်... ခဏစောင့်ပေးပါ...") |
|
|
| media_items = [] |
| |
| |
| if "tiktok.com" in url: |
| try: |
| bot.edit_message_text("📥 TikTok API စနစ်ဖြင့် ဒေါင်းလုဒ် ဆွဲနေပါသည်...", chat_id=chat_id, message_id=status_msg.message_id) |
| media_items = download_via_tikwm(url) |
| except Exception as e: |
| print(f"[Tikwm Core Failed] Fallback to Cobalt: {e}") |
|
|
| |
| if not media_items: |
| try: |
| bot.edit_message_text("📥 Cobalt API စနစ်ဖြင့် ဒေါင်းလုဒ် ဆွဲနေပါသည်...", chat_id=chat_id, message_id=status_msg.message_id) |
| media_items = download_via_cobalt_api(url) |
| except Exception as e: |
| print(f"[Cobalt Flow Fail] {e}") |
|
|
| |
| try: |
| if media_items: |
| bot.edit_message_text("📤 Telegram ပေါ်သို့ တင်ပေးနေပါပြီ...", chat_id=chat_id, message_id=status_msg.message_id) |
| |
| |
| photos_to_send = [item["url"] for item in media_items if item["type"] == "photo"] |
| videos_to_send = [item["url"] for item in media_items if item["type"] == "video"] |
|
|
| if photos_to_send: |
| |
| for i in range(0, len(photos_to_send), 10): |
| chunk = photos_to_send[i:i+10] |
| media_group = [telebot.types.InputMediaPhoto(img_url) for img_url in chunk] |
| bot.send_media_group(chat_id, media_group) |
| |
| for video_url in videos_to_send: |
| bot.send_video(chat_id, video=video_url, caption="Original Quality (No Watermark) ✨") |
| |
| bot.delete_message(chat_id=chat_id, message_id=status_msg.message_id) |
| return |
| else: |
| raise Exception("No media items retrieved from APIs.") |
| |
| except Exception as e: |
| print(f"[Download/Send Fail] {e}") |
| bot.edit_message_text( |
| chat_id=chat_id, |
| message_id=status_msg.message_id, |
| text="❌ ဒေါင်းလုဒ်ဆွဲရတာ မအောင်မြင်ပါဘူးခင်ဗျာ။\n\n" |
| "(အကြောင်းရင်း - Instagram/TikTok ၏ လုံခြုံရေး ပိတ်ဆို့မှုအသစ်များ သို့မဟုတ် Private Account လင့်ခ်ဖြစ်နေခြင်းကြောင့် ဖြစ်နိုင်ပါသည်)" |
| ) |
|
|
| if __name__ == '__main__': |
| print("[Server] Starting Fast API Server on Port 7860...") |
| uvicorn.run(app, host="0.0.0.0", port=7860) |
| |