Update bot.py
Browse files
bot.py
CHANGED
|
@@ -19,14 +19,12 @@ logger = logging.getLogger(__name__)
|
|
| 19 |
API_ID = int(os.environ.get("API_ID", 0))
|
| 20 |
API_HASH = os.environ.get("API_HASH", "")
|
| 21 |
SESSION_STRING = os.environ.get("SESSION_STRING", "")
|
| 22 |
-
|
| 23 |
|
| 24 |
DATA_DIR = "./data"
|
| 25 |
DOWNLOAD_DIR = os.path.join(DATA_DIR, "downloads")
|
| 26 |
os.makedirs(DOWNLOAD_DIR, exist_ok=True)
|
| 27 |
|
| 28 |
-
logger.info(f"🎯 القناة الهدف: {TARGET_CHAT}")
|
| 29 |
-
|
| 30 |
# ============ العميل ============
|
| 31 |
app = Client(
|
| 32 |
"archiver",
|
|
@@ -40,6 +38,9 @@ app = Client(
|
|
| 40 |
lang_code="ar"
|
| 41 |
)
|
| 42 |
|
|
|
|
|
|
|
|
|
|
| 43 |
# ============ معرفة نوع الملف ============
|
| 44 |
def get_media_info(message):
|
| 45 |
if message.photo:
|
|
@@ -58,7 +59,7 @@ def get_media_info(message):
|
|
| 58 |
return "animation", message.animation.file_size or 0
|
| 59 |
return None, 0
|
| 60 |
|
| 61 |
-
# ============ اسم المصدر
|
| 62 |
def get_source_name(message):
|
| 63 |
chat = message.chat
|
| 64 |
if chat.type in ["channel", "supergroup", "group"]:
|
|
@@ -153,19 +154,17 @@ async def flush_media_group(chat_id, mg_id):
|
|
| 153 |
except:
|
| 154 |
pass
|
| 155 |
|
| 156 |
-
# ============ المعالج الرئيسي
|
| 157 |
@app.on_message(filters.incoming & ~filters.me & filters.media)
|
| 158 |
async def on_media(client, message):
|
| 159 |
chat_id = message.chat.id
|
| 160 |
|
| 161 |
-
|
| 162 |
-
if chat_id == TARGET_CHAT:
|
| 163 |
return
|
| 164 |
|
| 165 |
src_name = get_source_name(message)
|
| 166 |
-
logger.info(f"📥 جديد من {chat_id} | {src_name} | نوع
|
| 167 |
|
| 168 |
-
# إذا ألبوم
|
| 169 |
if message.media_group_id:
|
| 170 |
key = (chat_id, message.media_group_id)
|
| 171 |
async with mg_lock:
|
|
@@ -175,7 +174,6 @@ async def on_media(client, message):
|
|
| 175 |
media_groups[key].append(message)
|
| 176 |
return
|
| 177 |
|
| 178 |
-
# رسالة منفردة
|
| 179 |
m_type, fsize = get_media_info(message)
|
| 180 |
if not m_type:
|
| 181 |
return
|
|
@@ -222,17 +220,36 @@ async def on_media(client, message):
|
|
| 222 |
except:
|
| 223 |
pass
|
| 224 |
|
| 225 |
-
# ============ مراقبة عامة
|
| 226 |
@app.on_message(filters.incoming & ~filters.me)
|
| 227 |
async def monitor_all(client, message):
|
| 228 |
-
if message.chat.id == TARGET_CHAT:
|
| 229 |
return
|
| 230 |
src_name = get_source_name(message)
|
| 231 |
-
logger.info(f"👁️ رسالة
|
| 232 |
-
|
| 233 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 234 |
|
| 235 |
-
# ============ تشغيل Gradio
|
| 236 |
def run_gradio():
|
| 237 |
with gr.Blocks(title="Telegram Archiver") as demo:
|
| 238 |
gr.Markdown("# 📡 Telegram Archiver")
|
|
@@ -240,22 +257,22 @@ def run_gradio():
|
|
| 240 |
|
| 241 |
gr.Textbox(
|
| 242 |
label="الحالة",
|
| 243 |
-
value="✅ نشط - يستقبل من
|
| 244 |
interactive=False
|
| 245 |
)
|
| 246 |
|
| 247 |
gr.Markdown("""
|
| 248 |
-
### 🔧 المتغيرات
|
| 249 |
|
| 250 |
-
| المتغير | ال
|
| 251 |
-
|---------|-------|
|
| 252 |
-
| `API_ID` | م
|
| 253 |
-
| `API_HASH` |
|
| 254 |
-
| `SESSION_STRING` |
|
| 255 |
-
| `TARGET_CHAT` | معر
|
| 256 |
|
| 257 |
-
###
|
| 258 |
-
ال
|
| 259 |
""")
|
| 260 |
|
| 261 |
demo.launch(server_name="0.0.0.0", server_port=7860)
|
|
@@ -264,6 +281,10 @@ def run_gradio():
|
|
| 264 |
async def main():
|
| 265 |
await app.start()
|
| 266 |
me = await app.get_me()
|
|
|
|
|
|
|
|
|
|
|
|
|
| 267 |
logger.info("=" * 50)
|
| 268 |
logger.info(f"🚀 البوت يعمل!")
|
| 269 |
logger.info(f"👤 الحساب: {me.first_name} (@{me.username})")
|
|
|
|
| 19 |
API_ID = int(os.environ.get("API_ID", 0))
|
| 20 |
API_HASH = os.environ.get("API_HASH", "")
|
| 21 |
SESSION_STRING = os.environ.get("SESSION_STRING", "")
|
| 22 |
+
TARGET_CHAT_RAW = os.environ.get("TARGET_CHAT", "me")
|
| 23 |
|
| 24 |
DATA_DIR = "./data"
|
| 25 |
DOWNLOAD_DIR = os.path.join(DATA_DIR, "downloads")
|
| 26 |
os.makedirs(DOWNLOAD_DIR, exist_ok=True)
|
| 27 |
|
|
|
|
|
|
|
| 28 |
# ============ العميل ============
|
| 29 |
app = Client(
|
| 30 |
"archiver",
|
|
|
|
| 38 |
lang_code="ar"
|
| 39 |
)
|
| 40 |
|
| 41 |
+
# متغير عام للقناة الهدف الفعلية (قد تتغير بعد التحقق)
|
| 42 |
+
TARGET_CHAT = None
|
| 43 |
+
|
| 44 |
# ============ معرفة نوع الملف ============
|
| 45 |
def get_media_info(message):
|
| 46 |
if message.photo:
|
|
|
|
| 59 |
return "animation", message.animation.file_size or 0
|
| 60 |
return None, 0
|
| 61 |
|
| 62 |
+
# ============ اسم المصدر ============
|
| 63 |
def get_source_name(message):
|
| 64 |
chat = message.chat
|
| 65 |
if chat.type in ["channel", "supergroup", "group"]:
|
|
|
|
| 154 |
except:
|
| 155 |
pass
|
| 156 |
|
| 157 |
+
# ============ المعالج الرئيسي ============
|
| 158 |
@app.on_message(filters.incoming & ~filters.me & filters.media)
|
| 159 |
async def on_media(client, message):
|
| 160 |
chat_id = message.chat.id
|
| 161 |
|
| 162 |
+
if str(chat_id) == str(TARGET_CHAT):
|
|
|
|
| 163 |
return
|
| 164 |
|
| 165 |
src_name = get_source_name(message)
|
| 166 |
+
logger.info(f"📥 جديد من {chat_id} | {src_name} | نوع: {message.chat.type} | رسالة {message.id} | نوع: {message.media}")
|
| 167 |
|
|
|
|
| 168 |
if message.media_group_id:
|
| 169 |
key = (chat_id, message.media_group_id)
|
| 170 |
async with mg_lock:
|
|
|
|
| 174 |
media_groups[key].append(message)
|
| 175 |
return
|
| 176 |
|
|
|
|
| 177 |
m_type, fsize = get_media_info(message)
|
| 178 |
if not m_type:
|
| 179 |
return
|
|
|
|
| 220 |
except:
|
| 221 |
pass
|
| 222 |
|
| 223 |
+
# ============ مراقبة عامة ============
|
| 224 |
@app.on_message(filters.incoming & ~filters.me)
|
| 225 |
async def monitor_all(client, message):
|
| 226 |
+
if str(message.chat.id) == str(TARGET_CHAT):
|
| 227 |
return
|
| 228 |
src_name = get_source_name(message)
|
| 229 |
+
logger.info(f"👁️ رسالة من {message.chat.id} | نوع: {message.chat.type} | اسم: {src_name}")
|
| 230 |
+
|
| 231 |
+
# ============ التحقق من القناة الهدف ============
|
| 232 |
+
async def resolve_target_chat():
|
| 233 |
+
global TARGET_CHAT
|
| 234 |
+
raw = TARGET_CHAT_RAW
|
| 235 |
+
|
| 236 |
+
if raw.lower() == "me":
|
| 237 |
+
TARGET_CHAT = "me"
|
| 238 |
+
logger.info("🎯 الهدف: Saved Messages (me)")
|
| 239 |
+
return
|
| 240 |
+
|
| 241 |
+
try:
|
| 242 |
+
# جرب كـ integer أولاً
|
| 243 |
+
chat_id_int = int(raw)
|
| 244 |
+
chat = await app.get_chat(chat_id_int)
|
| 245 |
+
TARGET_CHAT = chat_id_int
|
| 246 |
+
logger.info(f"🎯 تم التحقق من القناة: {chat.title} | id: {chat_id_int}")
|
| 247 |
+
except Exception as e:
|
| 248 |
+
logger.error(f"❌ فشل التحقق من القناة {raw}: {e}")
|
| 249 |
+
logger.info("⚠️ سيتم استخدام Saved Messages (me) كاحتياطي")
|
| 250 |
+
TARGET_CHAT = "me"
|
| 251 |
|
| 252 |
+
# ============ تشغيل Gradio ============
|
| 253 |
def run_gradio():
|
| 254 |
with gr.Blocks(title="Telegram Archiver") as demo:
|
| 255 |
gr.Markdown("# 📡 Telegram Archiver")
|
|
|
|
| 257 |
|
| 258 |
gr.Textbox(
|
| 259 |
label="الحالة",
|
| 260 |
+
value="✅ نشط - يستقبل من الكل",
|
| 261 |
interactive=False
|
| 262 |
)
|
| 263 |
|
| 264 |
gr.Markdown("""
|
| 265 |
+
### 🔧 المتغيرات:
|
| 266 |
|
| 267 |
+
| المتغير | القيمة | مثال |
|
| 268 |
+
|---------|--------|------|
|
| 269 |
+
| `API_ID` | رقم | `12345678` |
|
| 270 |
+
| `API_HASH` | نص | `abc123...` |
|
| 271 |
+
| `SESSION_STRING` | نص | `BQAD...` |
|
| 272 |
+
| `TARGET_CHAT` | معرف القناة الخاصة | `-1001234567890` |
|
| 273 |
|
| 274 |
+
### ⚠️ ملاحظة مهمة للقنوات الخاصة:
|
| 275 |
+
الحساب لازم يكون **عضو** في القناة الخاصة. إذا فشل التحقق، يرسل إلى Saved Messages.
|
| 276 |
""")
|
| 277 |
|
| 278 |
demo.launch(server_name="0.0.0.0", server_port=7860)
|
|
|
|
| 281 |
async def main():
|
| 282 |
await app.start()
|
| 283 |
me = await app.get_me()
|
| 284 |
+
|
| 285 |
+
# 🔑 التحقق من القناة الهدف
|
| 286 |
+
await resolve_target_chat()
|
| 287 |
+
|
| 288 |
logger.info("=" * 50)
|
| 289 |
logger.info(f"🚀 البوت يعمل!")
|
| 290 |
logger.info(f"👤 الحساب: {me.first_name} (@{me.username})")
|