Spaces:
Runtime error
Runtime error
File size: 9,294 Bytes
498f51d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
import os
import asyncio
from telethon import TelegramClient, events
from telethon.tl.types import Channel, Chat, User
from telethon.tl.functions.channels import GetParticipantRequest
from telethon.errors import ChannelInvalidError, ChannelPrivateError
# تحميل المتغيرات من البيئة
def load_config():
"""تحميل الإعدادات من ملف .env"""
from dotenv import load_dotenv
load_dotenv() # تحميل القيم من ملف .env
api_id = os.getenv('API_ID')
api_hash = os.getenv('API_HASH')
bot_token = os.getenv('BOT_TOKEN')
# إذا لم تكن القيم موجودة، نطلب من المستخدم إدخالها
if not api_id:
api_id = input("🔑 أدخل API_ID: ")
os.environ['API_ID'] = api_id
if not api_hash:
api_hash = input("🔑 أدخل API_HASH: ")
os.environ['API_HASH'] = api_hash
if not bot_token:
bot_token = input("🔑 أدخل BOT_TOKEN: ")
os.environ['BOT_TOKEN'] = bot_token
try:
return int(api_id), api_hash, bot_token
except ValueError:
print("❌ خطأ: API_ID يجب أن يكون رقماً صحيحاً")
exit(1)
# تحميل الإعدادات
api_id, api_hash, bot_token = load_config()
print(f"✅ تم تحميل الإعدادات:")
print(f" API_ID: {api_id}")
print(f" API_HASH: {api_hash}")
print(f" BOT_TOKEN: {bot_token}")
# إنشاء العميل
client = TelegramClient('forward_bot_session', api_id, api_hash).start(bot_token=bot_token)
# قائمة لحفظ القنوات/المجموعات التي البوت مشرف فيها
admin_channels = []
async def get_admin_channels():
"""الحصول على جميع القنوات والمجموعات التي يكون البوت مشرفاً فيها"""
global admin_channels
# إذا كانت القائمة محفوظة بالفعل، نعيدها
if admin_channels:
return admin_channels
admin_chats = []
try:
# بدلاً من iter_dialogs، سنستخدم طريقة بديلة للبوتات
# البوتات يمكنها فقط رؤية الدردشات التي تمت إضافتها إليها
# جلب الدردشات التي البوت عضو فيها (هذه تعمل مع البوتات)
async for dialog in client.iter_dialogs():
if isinstance(dialog.entity, User):
continue
try:
# التحقق إذا كان البوت مشرفاً في هذه الدردشة
if isinstance(dialog.entity, (Channel, Chat)):
try:
participant = await client(GetParticipantRequest(
dialog.entity,
await client.get_input_entity('me')
))
if hasattr(participant.participant, 'admin_rights'):
if participant.participant.admin_rights.post_messages:
admin_chats.append(dialog.entity.id)
print(f"✅ البوت مشرف في: {dialog.name} (ID: {dialog.entity.id})")
elif hasattr(participant.participant, 'rank'):
# بعض أنواع المشرفين
admin_chats.append(dialog.entity.id)
print(f"✅ البوت مشرف في: {dialog.name} (ID: {dialog.entity.id})")
except (ChannelInvalidError, ChannelPrivateError, ValueError):
continue
except Exception as e:
# إذا فشل التحقق، قد يكون البوت مشرفاً لكن مع صلاحيات محدودة
continue
except Exception as e:
continue
except Exception as e:
print(f"❌ خطأ في جلب الدردشات: {e}")
# نستخدم طريقة بديلة: تخزين القنوات يدوياً عند إضافة البوت كمساعد
print("⚠️ يمكنك إضافة القنوات يدوياً عن طريق إرسال /add_channel")
admin_channels = admin_chats
return admin_chats
@client.on(events.NewMessage(incoming=True, func=lambda e: e.is_private))
async def handle_private_message(event):
"""معالجة الرسائل الخاصة الواردة"""
try:
message_text = event.message.text
sender_id = event.sender_id
print(f"📩 رسالة جديدة من {sender_id}: {message_text}")
# التحقق من الأوامر الخاصة
if message_text.startswith('/'):
if message_text.startswith('/add_channel'):
# إضافة قناة يدوياً
if event.message.reply_to_msg_id:
replied_msg = await event.get_reply_message()
if replied_msg.forward_from_chat:
chat_id = replied_msg.forward_from_chat.id
if chat_id not in admin_channels:
admin_channels.append(chat_id)
await event.reply(f"✅ تمت إضافة القناة {chat_id} إلى القائمة")
else:
await event.reply("⚠️ هذه القناة مضافة بالفعل")
return
await event.reply("⚠️ للاستخدام: رد على رسالة من القناة بأمر /add_channel")
return
elif message_text.startswith('/list_channels'):
# عرض القنوات المضافة
if admin_channels:
response = "📋 القنوات/المجموعات المضافة:\n"
for i, chat_id in enumerate(admin_channels, 1):
response += f"{i}. {chat_id}\n"
await event.reply(response)
else:
await event.reply("❌ لا توجد قنوات مضافة بعد")
return
elif message_text.startswith('/clear_channels'):
# مسح القنوات
admin_channels.clear()
await event.reply("✅ تم مسح جميع القنوات من القائمة")
return
# الحصول على القنوات/المجموعات التي البوت مشرف فيها
admin_chats = await get_admin_channels()
if not admin_chats:
print("❌ البوت ليس مشرفاً في أي قناة أو مجموعة")
await event.reply("⚠️ أنا لست مشرفاً في أي قناة أو مجموعة حالياً.\n\nاستخدم /add_channel لإضافة قنوات يدوياً")
return
# إعادة توجيه الرسالة إلى جميع القنوات/المجموعات
success_count = 0
for chat_id in admin_chats:
try:
await client.forward_messages(chat_id, event.message)
print(f"✅ تم إعادة التوجيه إلى الدردشة: {chat_id}")
success_count += 1
except Exception as e:
print(f"❌ فشل الإرسال إلى {chat_id}: {e}")
# إزالة القناة من القائمة إذا فشل الإرسال
if chat_id in admin_channels:
admin_channels.remove(chat_id)
# إرسال تقرير للمستخدم
await event.reply(f"✅ تم إعادة توجيه رسالتك إلى {success_count} من {len(admin_chats)} قناة/مجموعة")
except Exception as e:
print(f"❌ خطأ في معالجة الرسالة: {e}")
await event.reply("⚠️ عذراً، حدث خطأ أثناء معالجة رسالتك.")
async def main():
"""الدالة الرئيسية لتشغيل البوت"""
print("🔍 جاري البحث عن القنوات والمجموعات التي البوت مشرف فيها...")
admin_chats = await get_admin_channels()
if admin_chats:
print(f"✅ البوت مشرف في {len(admin_chats)} قناة/مجموعة")
else:
print("❌ البوت ليس مشرفاً في أي قناة أو مجموعة")
print("💡 يمكنك إضافة قنوات يدوياً باستخدام الأمر /add_channel")
print("🤖 البوت يعمل الآن ويستمع للرسائل...")
print("📋 الأوامر المتاحة:")
print(" /add_channel - إضافة قناة يدوياً (الرد على رسالة من القناة)")
print(" /list_channels - عرض القنوات المضافة")
print(" /clear_channels - مسح جميع القنوات")
# تشغيل البوت
with client:
client.loop.run_until_complete(main())
client.run_until_disconnected()
|