armaansingh752k1's picture
Rename bot1.py to bot.py
8b4bd9a verified
Raw
History Blame Contribute Delete
14.8 kB
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"""
<!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 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)