Spaces:
iq7se2
/
5
Sleeping

5 / app.py
iq7se2's picture
Update app.py
83b6a51 verified
import os, time, threading, zipfile, io, re, telebot, requests
from flask import Flask
from playwright.sync_api import sync_playwright
from PIL import Image
import socket
# إضافة هذا السطر لإصلاح مشاكل الاتصال في بعض سيرفرات HF
def run_bot():
while True:
try:
print("Trying to connect to Telegram...")
bot.remove_webhook()
bot.infinity_polling(timeout=20, long_polling_timeout=20)
except Exception as e:
print(f"Network error: {e}. Retrying in 5 seconds...")
time.sleep(5)
# --- الإعدادات ---
BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN")
# ضع آيدي قناتك هنا أو في Secrets
ARCHIVE_CH = os.getenv("ARCHIVE_CHANNEL_ID")
ADMIN_HANDLE = "@svipfast"
bot = telebot.TeleBot(BOT_TOKEN, threaded=False)
app = Flask(__name__)
# قاعدة بيانات بسيطة للحفظ (تصفر عند الرستارت، للأفضل استخدم ملف .txt)
archive_db = {}
@app.route('/')
def home(): return "<h1>System is Online - @svipfast</h1>"
def fetch_with_browser(url):
"""محرك السحب الاحترافي لمحاكاة المتصفح البشري"""
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
context = browser.new_context(user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
page = context.new_page()
try:
page.goto(url, wait_until="networkidle", timeout=60000)
# التمرير لضمان ظهور الصور المخفية
page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
time.sleep(2)
images = page.query_selector_all("img")
img_data = []
for img in images:
src = img.get_attribute("src") or img.get_attribute("data-src")
if src and any(x in src.lower() for x in ['.jpg', '.jpeg', '.png', '.webp']):
if "logo" in src.lower() or "banner" in src.lower(): continue
res = requests.get(src, timeout=10)
if res.status_code == 200 and len(res.content) > 25000:
img_data.append(res.content)
browser.close()
return img_data
except:
browser.close()
return []
@bot.message_handler(func=lambda m: True)
def handle_request(message):
try:
# التنسيق: الرابط 1-5
url, ch_range = message.text.split(' ')
start, end = map(int, ch_range.split('-'))
manga_id = re.sub(r'\W+', '', url.split('/')[-2])
status = bot.reply_to(message, "🔍 جاري الفحص في الأرشيف والسحب الذكي...")
files_to_send = []
for i in range(start, end + 1):
key = f"{manga_id}_{i}"
# إذا كان موجوداً في الأرشيف، نرسله فوراً
if key in archive_db:
files_to_send.append(archive_db[key])
else:
# إذا غير موجود، نشغل المحرك الثقيل للسحب
bot.edit_message_text(f"⏳ الفصل {i} غير مؤرشف.. جاري سحبه الآن من المصدر.", message.chat.id, status.message_id)
target_url = url.rsplit('/', 1)[0] + f"/{i}" # تعديل الرابط تلقائياً
imgs = fetch_with_browser(target_url)
if imgs:
zip_name = f"CH_{i}.zip"
with zipfile.ZipFile(zip_name, 'w') as z:
for idx, data in enumerate(imgs):
z.writestr(f"{idx:03d}.jpg", data)
# الرفع للأرشيف
with open(zip_name, 'rb') as f:
archived = bot.send_document(ARCHIVE_CH, f, caption=f"Manga: {manga_id} | Ch: {i}")
file_id = archived.document.file_id
archive_db[key] = file_id
files_to_send.append(file_id)
os.remove(zip_name)
if files_to_send:
for fid in files_to_send:
bot.send_document(message.chat.id, fid)
bot.delete_message(message.chat.id, status.message_id)
except Exception as e:
bot.reply_to(message, f"❌ حدث خطأ: {str(e)}\nتواصل مع {ADMIN_HANDLE}")
if __name__ == "__main__":
# تثبيت المتصفح عند التشغيل
os.system("playwright install chromium")
threading.Thread(target=lambda: bot.infinity_polling(), daemon=True).start()
app.run(host="0.0.0.0", port=7860)