Reooiq commited on
Commit
221433a
·
verified ·
1 Parent(s): 5d5e4aa

Update bot.py

Browse files
Files changed (1) hide show
  1. bot.py +47 -26
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
- TARGET_CHAT = int(os.environ.get("TARGET_CHAT", 0))
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} | نوع الدردشة: {message.chat.type} | رسالة {message.id} | نوع: {message.media}")
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"👁️ رسالة واردة من {message.chat.id} | نوع: {message.chat.type} | اسم: {src_name} | نص: {message.text or '[ملف]'}")
232
- if message.media:
233
- logger.info(f" └─ تحتوي على media: {message.media}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
234
 
235
- # ============ تشغيل Gradio في thread منفصلة ============
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` | من my.telegram.org |
253
- | `API_HASH` | من my.telegram.org |
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})")