Spaces:
Runtime error
Runtime error
Upload userbot_noura.py
Browse files- userbot_noura.py +125 -45
userbot_noura.py
CHANGED
|
@@ -36,7 +36,7 @@ load_dotenv()
|
|
| 36 |
API_ID = int(os.getenv("API_ID", 0))
|
| 37 |
API_HASH = os.getenv("API_HASH", "")
|
| 38 |
PHONE = os.getenv("PHONE", "")
|
| 39 |
-
BOT_TOKEN = os.getenv("BOT_TOKEN", "")
|
| 40 |
|
| 41 |
# إعدادات نورا
|
| 42 |
NOURA_API = (os.getenv("NOURA_API_BASE", "http://127.0.0.1:9531")).rstrip("/")
|
|
@@ -848,68 +848,148 @@ async def post_init(app):
|
|
| 848 |
logging.info("Warm-up: تم.")
|
| 849 |
except Exception as e:
|
| 850 |
logging.warning("Warm-up فشل: %s", e)
|
|
|
|
|
|
|
|
|
|
| 851 |
|
| 852 |
# =========================
|
| 853 |
-
# الد
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 854 |
# =========================
|
| 855 |
-
# استبدل دالة main() الحالية:
|
| 856 |
|
| 857 |
async def main():
|
|
|
|
|
|
|
| 858 |
# بدء تيليثون
|
| 859 |
await client.start(phone=PHONE)
|
| 860 |
-
print("✅ ت
|
| 861 |
|
| 862 |
# تحديث قائمة القنوات تلقائياً
|
| 863 |
await refresh_admin_channels()
|
|
|
|
| 864 |
|
| 865 |
-
# بدء تيل
|
| 866 |
-
|
|
|
|
| 867 |
|
| 868 |
-
#
|
|
|
|
| 869 |
app.add_handler(CommandHandler("start", start))
|
| 870 |
app.add_handler(CommandHandler("image", handle_image_command))
|
| 871 |
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
|
| 872 |
app.add_handler(MessageHandler(filters.PHOTO | (filters.Document.IMAGE & filters.CAPTION), handle_images))
|
|
|
|
| 873 |
|
| 874 |
-
# تشغيل البوتي
|
| 875 |
-
await
|
| 876 |
-
|
| 877 |
-
|
| 878 |
-
|
| 879 |
-
|
| 880 |
-
# استبدل دالة main() الحالية بهذا الكود:
|
| 881 |
-
|
| 882 |
-
async def main():
|
| 883 |
-
# بدء تيليثون
|
| 884 |
-
await client.start(phone=PHONE)
|
| 885 |
-
print("✅ تم تشغيل تيليثون بنجاح")
|
| 886 |
-
|
| 887 |
-
# تحديث قائمة القنوات تلقائياً
|
| 888 |
-
await refresh_admin_channels()
|
| 889 |
-
|
| 890 |
-
# بدء تيليجرام بوت في خيط منفصل
|
| 891 |
-
import threading
|
| 892 |
-
|
| 893 |
-
def run_bot():
|
| 894 |
-
# إنشاء تطبيق جديد داخل الخيط
|
| 895 |
-
app = ApplicationBuilder().token(TELEGRAM_TOKEN).build()
|
| 896 |
-
|
| 897 |
-
# إضافة الهاندلرات
|
| 898 |
-
app.add_handler(CommandHandler("start", start))
|
| 899 |
-
app.add_handler(CommandHandler("image", handle_image_command))
|
| 900 |
-
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
|
| 901 |
-
app.add_handler(MessageHandler(filters.PHOTO | (filters.Document.IMAGE & filters.CAPTION), handle_images))
|
| 902 |
-
|
| 903 |
-
# تشغيل البوت
|
| 904 |
-
app.run_polling()
|
| 905 |
-
|
| 906 |
-
# تشغيل البوت في خيط منفصل
|
| 907 |
-
bot_thread = threading.Thread(target=run_bot)
|
| 908 |
-
bot_thread.daemon = True
|
| 909 |
-
bot_thread.start()
|
| 910 |
|
| 911 |
-
# الا
|
|
|
|
| 912 |
await client.run_until_disconnected()
|
| 913 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 914 |
if __name__ == "__main__":
|
| 915 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
API_ID = int(os.getenv("API_ID", 0))
|
| 37 |
API_HASH = os.getenv("API_HASH", "")
|
| 38 |
PHONE = os.getenv("PHONE", "")
|
| 39 |
+
BOT_TOKEN = os.getenv("BOT_TOKEN", "7875784449:AAGlCPmjOmoQHRSku8HShc-cTfaXrkroYN0")
|
| 40 |
|
| 41 |
# إعدادات نورا
|
| 42 |
NOURA_API = (os.getenv("NOURA_API_BASE", "http://127.0.0.1:9531")).rstrip("/")
|
|
|
|
| 848 |
logging.info("Warm-up: تم.")
|
| 849 |
except Exception as e:
|
| 850 |
logging.warning("Warm-up فشل: %s", e)
|
| 851 |
+
import asyncio
|
| 852 |
+
from telethon import TelegramClient, events
|
| 853 |
+
from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters
|
| 854 |
|
| 855 |
# =========================
|
| 856 |
+
# الإعدادات الأساسية
|
| 857 |
+
# =========================
|
| 858 |
+
#API_ID = 'your_api_id'
|
| 859 |
+
#API_HASH = 'your_api_hash'
|
| 860 |
+
#PHONE = 'your_phone_number'
|
| 861 |
+
#TELEGRAM_TOKEN = 'your_telegram_bot_token'
|
| 862 |
+
|
| 863 |
+
# قوائم القنوات (سيتم ملؤها ديناميكياً)
|
| 864 |
+
source_channels = []
|
| 865 |
+
target_channels = []
|
| 866 |
+
|
| 867 |
+
# تهيئة العميل
|
| 868 |
+
client = TelegramClient('session_name', API_ID, API_HASH)
|
| 869 |
+
|
| 870 |
+
# =========================
|
| 871 |
+
# دوال المساعدة
|
| 872 |
+
# =========================
|
| 873 |
+
|
| 874 |
+
async def refresh_admin_channels():
|
| 875 |
+
"""تحديث قائمة القنوات من قنوات الإدارة"""
|
| 876 |
+
global source_channels, target_channels
|
| 877 |
+
try:
|
| 878 |
+
# هنا يتم جلب القنوات من قنوات الإدارة
|
| 879 |
+
# هذا مثال - يجب تعديله حسب طريقة تخزينك للقنوات
|
| 880 |
+
source_channels = [123456, 789012] # أمثلة على معرفات القنوات
|
| 881 |
+
target_channels = [345678, 901234] # أمثلة على معرفات القنوات
|
| 882 |
+
|
| 883 |
+
print(f"🔄 تم تحديث القنوات: {len(source_channels)} مصدر، {len(target_channels)} هدف")
|
| 884 |
+
except Exception as e:
|
| 885 |
+
print(f"❌ خطأ في تحديث القنوات: {e}")
|
| 886 |
+
|
| 887 |
+
async def periodic_channel_refresh(interval_minutes=30):
|
| 888 |
+
"""تحديث قائمة القنوات بشكل دوري"""
|
| 889 |
+
while True:
|
| 890 |
+
await asyncio.sleep(interval_minutes * 60)
|
| 891 |
+
await refresh_admin_channels()
|
| 892 |
+
|
| 893 |
+
# =========================
|
| 894 |
+
# معالجة رسائل القنوات (تليثون)
|
| 895 |
+
# =========================
|
| 896 |
+
|
| 897 |
+
@client.on(events.NewMessage(chats=source_channels))
|
| 898 |
+
async def handle_channel_message(event):
|
| 899 |
+
"""معالجة الرسائل من القنوات المصدر"""
|
| 900 |
+
try:
|
| 901 |
+
print(f"📥 رسالة جديدة من قناة مصدر: {event.chat_id}")
|
| 902 |
+
|
| 903 |
+
# إعادة الإرسال لجميع القنوات الهدف
|
| 904 |
+
success_count = 0
|
| 905 |
+
for target_id in target_channels:
|
| 906 |
+
if target_id != event.chat_id: # عدم الإرسال لنفس القناة
|
| 907 |
+
try:
|
| 908 |
+
await client.forward_messages(target_id, event.message)
|
| 909 |
+
print(f"✅ تم النشر إلى: {target_id}")
|
| 910 |
+
success_count += 1
|
| 911 |
+
await asyncio.sleep(1) # تجنب FloodWait
|
| 912 |
+
except Exception as e:
|
| 913 |
+
print(f"❌ فشل النشر إلى {target_id}: {e}")
|
| 914 |
+
|
| 915 |
+
print(f"✅ تم النشر إلى {success_count} قناة")
|
| 916 |
+
|
| 917 |
+
except Exception as e:
|
| 918 |
+
print(f"❌ خطأ في معالجة الرسالة: {e}")
|
| 919 |
+
|
| 920 |
+
# =========================
|
| 921 |
+
# معالجة أوامر البوت (تليجرام)
|
| 922 |
+
# =========================
|
| 923 |
+
|
| 924 |
+
async def start(update, context):
|
| 925 |
+
"""معالجة أمر /start"""
|
| 926 |
+
await update.message.reply_text("مرحباً! أنا بوت يعمل.")
|
| 927 |
+
|
| 928 |
+
async def handle_image_command(update, context):
|
| 929 |
+
"""معالجة أمر /image"""
|
| 930 |
+
await update.message.reply_text("معالجة صورة...")
|
| 931 |
+
|
| 932 |
+
async def handle_message(update, context):
|
| 933 |
+
"""معالجة الرسائل النصية"""
|
| 934 |
+
await update.message.reply_text(f"تم استلام رسالتك: {update.message.text}")
|
| 935 |
+
|
| 936 |
+
async def handle_images(update, context):
|
| 937 |
+
"""معالجة الصور المرسلة"""
|
| 938 |
+
await update.message.reply_text("تم استلام الصورة!")
|
| 939 |
+
|
| 940 |
+
# =========================
|
| 941 |
+
# الدالة الرئيسية
|
| 942 |
# =========================
|
|
|
|
| 943 |
|
| 944 |
async def main():
|
| 945 |
+
print("🚀 بدء التشغيل...")
|
| 946 |
+
|
| 947 |
# بدء تيليثون
|
| 948 |
await client.start(phone=PHONE)
|
| 949 |
+
print("✅ تيليثون يعمل")
|
| 950 |
|
| 951 |
# تحديث قائمة القنوات تلقائياً
|
| 952 |
await refresh_admin_channels()
|
| 953 |
+
print("✅ تم تحديث القنوات")
|
| 954 |
|
| 955 |
+
# بدء التحديث الدوري للقنوات في الخلفية
|
| 956 |
+
asyncio.create_task(periodic_channel_refresh(30))
|
| 957 |
+
print("✅ التحديث الدوري يعمل")
|
| 958 |
|
| 959 |
+
# بدء بوت التليجرام في الخلفية
|
| 960 |
+
app = ApplicationBuilder().token(TELEGRAM_TOKEN).build()
|
| 961 |
app.add_handler(CommandHandler("start", start))
|
| 962 |
app.add_handler(CommandHandler("image", handle_image_command))
|
| 963 |
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
|
| 964 |
app.add_handler(MessageHandler(filters.PHOTO | (filters.Document.IMAGE & filters.CAPTION), handle_images))
|
| 965 |
+
print("✅ تم إعداد بوت التليجرام")
|
| 966 |
|
| 967 |
+
# تشغيل البوت في الخلفية
|
| 968 |
+
await app.initialize()
|
| 969 |
+
await app.start()
|
| 970 |
+
if app.updater:
|
| 971 |
+
await app.updater.start_polling()
|
| 972 |
+
print("✅ بوت التليجرام يعمل")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 973 |
|
| 974 |
+
# البقاء في الانتظار إلى الأبد
|
| 975 |
+
print("🔄 البوت يعمل الآن - استخدم Ctrl+C لإيقافه")
|
| 976 |
await client.run_until_disconnected()
|
| 977 |
|
| 978 |
+
# =========================
|
| 979 |
+
# نقطة الدخول
|
| 980 |
+
# =========================
|
| 981 |
+
|
| 982 |
if __name__ == "__main__":
|
| 983 |
+
# تشغيل البوت بشكل دائم
|
| 984 |
+
loop = asyncio.new_event_loop()
|
| 985 |
+
asyncio.set_event_loop(loop)
|
| 986 |
+
|
| 987 |
+
try:
|
| 988 |
+
loop.run_until_complete(main())
|
| 989 |
+
except KeyboardInterrupt:
|
| 990 |
+
print("⏹️ تم إيقاف البوت")
|
| 991 |
+
except Exception as e:
|
| 992 |
+
print(f"❌ خطأ: {e}")
|
| 993 |
+
finally:
|
| 994 |
+
print("🔄 جاري الإغلاق...")
|
| 995 |
+
loop.close()
|