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" # Telegram API block များအား ရာနှုန်းပြည့်ကျော်လွှားမည့် HTTPS Proxy များ 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 Engine ကို စတင်တည်ဆောက်ခြင်း bot = telebot.TeleBot(TOKEN, threaded=False) # FastAPI Web Server တည်ဆောက်ခြင်း app = FastAPI() @app.get("/", response_class=HTMLResponse) def dashboard(): """ Hugging Face Space ကို ဝင်ကြည့်လျှင် မြင်တွေ့ရမည့် Live Monitor UI """ html_content = f""" All-in-One Downloader Bot Dashboard
🚀

Gateway Console

Hugging Face Real-Time Webhook Bypass

Server Status ONLINE / READY

💡 လမ်းညွှန်ချက် -

၁။ အောက်ပါ အစိမ်းရောင်ခလုတ်ကို နှိပ်ပါ။

၂။ သင့်ဖုန်း Browser သည် Telegram API ဆီသို့ တိုက်ရိုက်ဆက်သွယ်ပြီး Webhook ကို အောင်မြင်စွာ တပ်ဆင်ပေးသွားမည် ဖြစ်သည်။

""" 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 commands Handlers @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", {}) # TikTok Slide ပုံများဖြစ်ပါက if "images" in data and data["images"]: img_list = [] for img in data["images"]: img_list.append({"url": img, "type": "photo"}) return img_list # TikTok ဗီဒီယိုဖြစ်ပါက (Watermark မပါသော တိုက်ရိုက်လင့်ခ်) 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 = [] # ၁။ TikTok လင့်ခ်ဖြစ်ပါက သီးသန့်တည်ငြိမ်သော Tikwm API ကို အရင်ဆုံးအသုံးပြုပါမည် 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}") # ၂။ TikTok API အဆင်မပြေပါက သို့မဟုတ် Instagram လင့်ခ်ဖြစ်ပါက Cobalt API သုံးမည် 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}") # ၃။ ဒေါင်းလုဒ်ရရှိလာသော Media များအား Telegram ဆီသို့ ပေးပို့ခြင်း try: if media_items: bot.edit_message_text("📤 Telegram ပေါ်သို့ တင်ပေးနေပါပြီ...", chat_id=chat_id, message_id=status_msg.message_id) # ပုံအများကြီးပါဝင်သော Slides/Carousel ဖြစ်ပါက Album (Media Group) စနစ်ဖြင့် ပို့ခြင်း 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: # Telegram ၏ Media Group (Album) ကန့်သတ်ချက်မှာ အများဆုံး ၁၀ ပုံဖြစ်သဖြင့် ၁၀ ပုံစီ ခွဲပို့ပါမည် 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)