aslamalmsry

بوت 1

Sep 29th, 2025
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 40.00 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. import logging
  3. import pyfiglet
  4. import requests
  5. import re
  6. import time
  7. import random
  8. import string
  9. from colorama import init, Fore
  10. from bs4 import BeautifulSoup
  11. from datetime import datetime
  12. import telebot
  13. from telebot import types
  14. from threading import Thread
  15. import json
  16. import os
  17.  
  18. # إعدادات التسجيل
  19. logging.basicConfig(level=logging.INFO)
  20.  
  21. # تفعيل colorama
  22. init(autoreset=False)
  23.  
  24. # توكن البوت
  25. TELEGRAM_BOT_TOKEN = "6636872139:AAGfjgkKTirnN3ZJ6k0ylTDYZBp9tQ2M6-U"
  26.  
  27. # تهيئة البوت
  28. bot = telebot.TeleBot(TELEGRAM_BOT_TOKEN, parse_mode="HTML")
  29.  
  30. # تعريف ألوان
  31. RED = '\x1b[1;31m'
  32. GREEN = '\x1b[1;32m'
  33. YELLOW = '\x1b[1;33m'
  34. BLUE = '\x1b[1;34m'
  35. PURPLE = '\x1b[1;35m'
  36. CYAN = '\x1b[1;36m'
  37. WHITE = '\x1b[1;37m'
  38. RESET = '\x1b[0m'
  39.  
  40. # ملف تخزين المستخدمين
  41. USERS_FILE = 'registered_users.json'
  42. user_data = {}
  43. registered_users = {}
  44.  
  45. # تحميل المستخدمين
  46. def load_users():
  47.     global registered_users
  48.     try:
  49.         if os.path.exists(USERS_FILE):
  50.             with open(USERS_FILE, 'r', encoding='utf-8') as f:
  51.                 registered_users = json.load(f)
  52.     except Exception as e:
  53.         print(f"Error loading users: {e}")
  54.         registered_users = {}
  55.  
  56. def save_users():
  57.     try:
  58.         with open(USERS_FILE, 'w', encoding='utf-8') as f:
  59.             json.dump(registered_users, f, ensure_ascii=False, indent=2)
  60.     except Exception as e:
  61.         print(f"Error saving users: {e}")
  62.  
  63. load_users()
  64.  
  65. # ===== الدوال المساعدة =====
  66. def get_nonce():
  67.     return ''.join(random.choice(string.ascii_lowercase) for _ in range(10))
  68.  
  69. def unified_login(number, password):
  70.     """دالة تسجيل دخول موحدة"""
  71.     with requests.Session() as session:
  72.         try:
  73.             base_url = 'https://web.vodafone.com.eg/auth/realms/vf-realm/protocol/openid-connect/auth'
  74.             redirect_uri = 'https://web.vodafone.com.eg/ar/KClogin'
  75.             nonce = get_nonce()
  76.             url_action = f"{base_url}?client_id=website&redirect_uri={redirect_uri}&state=random_state&response_mode=query&response_type=code&scope=openid&nonce={nonce}&kc_locale=ar"
  77.  
  78.             response_url_action = session.get(url_action)
  79.             soup = BeautifulSoup(response_url_action.content, 'html.parser')
  80.             form_action = soup.find('form').get('action')
  81.  
  82.             data = {'username': number, 'password': password}
  83.             response_login = session.post(form_action, data=data)
  84.  
  85.             if "KClogin" in response_login.url:
  86.                 code = response_login.url.split('code=')[1]
  87.                 data_token = {
  88.                     'code': code,
  89.                     'grant_type': 'authorization_code',
  90.                     'client_id': 'website',
  91.                     'redirect_uri': redirect_uri
  92.                 }
  93.                 token_response = session.post(
  94.                     'https://web.vodafone.com.eg/auth/realms/vf-realm/protocol/openid-connect/token',
  95.                     data=data_token
  96.                 )
  97.                 return token_response.json().get('access_token')
  98.             return None
  99.         except Exception as e:
  100.             return None
  101.  
  102. # ===== نظام التسجيل الدائم =====
  103. def register_user(chat_id, phone, password):
  104.     """تسجيل مستخدم جديد بشكل دائم"""
  105.     registered_users[str(chat_id)] = {
  106.         'phone': phone,
  107.         'password': password,
  108.         'registration_date': datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  109.     }
  110.     save_users()
  111.     return True
  112.  
  113. def is_user_registered(chat_id):
  114.     """التحقق إذا كان المستخدم مسجل"""
  115.     return str(chat_id) in registered_users
  116.  
  117. def get_user_credentials(chat_id):
  118.     """الحصول على بيانات المستخدم المسجل"""
  119.     user = registered_users.get(str(chat_id))
  120.     if user:
  121.         return user['phone'], user['password']
  122.     return None, None
  123.  
  124. def delete_user(chat_id):
  125.     """حذف مستخدم (لعملية إعادة التسجيل)"""
  126.     if str(chat_id) in registered_users:
  127.         del registered_users[str(chat_id)]
  128.         save_users()
  129.         return True
  130.     return False
  131.  
  132. # ===== دوال الخدمات الأساسية =====
  133. def process_vodafone_family_info(username, password, chat_id):
  134.     try:
  135.         token = unified_login(username, password)
  136.         if not token:
  137.             bot.send_message(chat_id, "❌ فشل تسجيل الدخول - تأكد من صحة الرقم وكلمة المرور")
  138.             return
  139.  
  140.         url2 = 'https://mobile.vodafone.com.eg/services/dxl/cg/customerGroupAPI/customerGroup?type=Family'
  141.         headers2 = {
  142.             'channel': 'MOBILE',
  143.             'useCase': 'Promo',
  144.             'Authorization': f'Bearer {token}',
  145.             'api-version': 'v2',
  146.             'x-agent-operatingsystem': '11',
  147.             'clientId': 'AnaVodafoneAndroid',
  148.             'x-agent-device': 'OPPO CPH2059',
  149.             'x-agent-version': '2024.3.3',
  150.             'x-agent-build': '593',
  151.             'msisdn': username,
  152.             'Content-Type': 'application/json',
  153.             'Accept': 'application/json',
  154.             'Accept-Language': 'ar',
  155.             'Host': 'mobile.vodafone.com.eg',
  156.             'Connection': 'Keep-Alive',
  157.             'Accept-Encoding': 'gzip',
  158.             'User-Agent': 'okhttp/4.11.0',
  159.         }
  160.  
  161.         r2 = requests.get(url2, headers=headers2, timeout=10)
  162.         if r2.status_code != 200:
  163.             bot.send_message(chat_id, f"❌ خطأ في الخدمة: {r2.status_code}")
  164.             return
  165.  
  166.         data_resp = r2.json()
  167.         members = []
  168.         if isinstance(data_resp, list) and len(data_resp) > 0:
  169.             parts = data_resp[0].get('parts', {}) if isinstance(data_resp[0], dict) else {}
  170.             members = parts.get('member', []) if isinstance(parts, dict) else []
  171.         else:
  172.             if isinstance(data_resp, dict):
  173.                 parts = data_resp.get('parts', {})
  174.                 members = parts.get('member', [])
  175.             else:
  176.                 members = []
  177.  
  178.         owner_number = None
  179.         member_numbers = []
  180.  
  181.         for member in members:
  182.             if not isinstance(member, dict):
  183.                 continue
  184.             member_type = member.get('type')
  185.             member_id = None
  186.             try:
  187.                 id_field = member.get('id')
  188.                 if isinstance(id_field, list) and len(id_field) > 0 and isinstance(id_field[0], dict):
  189.                     member_id = id_field[0].get('value')
  190.                 elif isinstance(id_field, dict):
  191.                     member_id = id_field.get('value')
  192.                 elif isinstance(id_field, str):
  193.                     member_id = id_field
  194.             except Exception:
  195.                 member_id = None
  196.  
  197.             if member_type == 'Owner':
  198.                 owner_number = member_id
  199.             elif member_type == 'Member' and member_id:
  200.                 member_numbers.append(member_id)
  201.  
  202.         result_message = "🎯 نتائج مجموعة العائلة:\n\n"
  203.         if owner_number:
  204.             result_message += f'👑 المالك (Owner): {owner_number}\n\n'
  205.  
  206.         if member_numbers:
  207.             result_message += '👥 الأعضاء (Members):\n' + '\n'.join([f'• {num}' for num in member_numbers]) + "\n"
  208.  
  209.         if not owner_number and not member_numbers:
  210.             result_message = "❌ لم يتم العثور على أي بيانات للمجموعة."
  211.  
  212.         bot.send_message(chat_id, result_message)
  213.  
  214.     except Exception as e:
  215.         bot.send_message(chat_id, f"❌ حدث خطأ: {str(e)}")
  216.  
  217. def process_line_info(number, password, chat_id):
  218.     token = unified_login(number, password)
  219.     if not token:
  220.         bot.send_message(chat_id, "❌ فشل تسجيل الدخول - تأكد من صحة الرقم وكلمة المرور")
  221.         return
  222.  
  223.     url2 = f'https://web.vodafone.com.eg/services/dxl/sam/serviceAccountManagement/v1/serviceAccount?@type=Profile&$.resources[?(@resourceType%3D%3D%27MSISDN%27)].IDs[0].value={number}'
  224.     headers2 = {
  225.         'channel': 'MOBILE',
  226.         'useCase': 'Promo',
  227.         'Authorization': f'Bearer {token}',
  228.         'api-version': 'v2',
  229.         'x-agent-operatingsystem': '11',
  230.         'clientId': 'AnaVodafoneAndroid',
  231.         'x-agent-device': 'OPPO CPH2059',
  232.         'x-agent-version': '2024.3.3',
  233.         'x-agent-build': '593',
  234.         'msisdn': number,
  235.         'Content-Type': 'application/json',
  236.         'Accept': 'application/json',
  237.         'Accept-Language': 'ar',
  238.         'User-Agent': 'okhttp/4.11.0'
  239.     }
  240.  
  241.     try:
  242.         r2 = requests.get(url2, headers=headers2).json()
  243.         user_info = r2[0]
  244.  
  245.         contact = user_info['contact'][0]
  246.         billing_account = user_info['billingAccount']
  247.         subscriptions = user_info.get('subscriptions', [])
  248.         categories = user_info.get('categories', [])
  249.         contract_id = user_info['IDs'][0]['value']
  250.         status_history = user_info.get('statusHistory', [])
  251.  
  252.         result = f"👤 الاسم: {contact['contactFirstName']} {contact['contactLastName']}\n"
  253.         result += f"🆔 الرقم القومي: {contact.get('nationalID', 'غير متوفر')}\n"
  254.         result += f"🏙️ المدينة: {contact['contactMedium'][0]['city']}\n"
  255.         result += f"💳 رقم الحساب: {billing_account['IDs'][1]['value']}\n"
  256.         result += f"🧾 كود العميل: {billing_account['IDs'][0]['value']}\n"
  257.         result += f"📄 رقم العقد: {contract_id}\n\n"
  258.  
  259.         if categories:
  260.             result += "📌 التصنيفات:\n"
  261.             for cat in categories:
  262.                 result += f" - {cat['listHirarchyId']} : {cat['value']}\n"
  263.  
  264.         if subscriptions:
  265.             result += "\n📜 الاشتراكات:\n"
  266.             for sub in subscriptions:
  267.                 result += f" - {sub['name']}\n"
  268.  
  269.         if status_history:
  270.             result += "\n📶 حالة الخط:\n"
  271.             for st in status_history:
  272.                 status_text = "نشط" if st['status'] == "Active" else "موقوف"
  273.                 result += f" - {status_text} (السبب: {st['statusReason']})\n"
  274.  
  275.         bot.send_message(chat_id, result)
  276.  
  277.     except Exception as e:
  278.         bot.send_message(chat_id, f"❌ فشل في جلب البيانات: {e}")
  279.  
  280. def get_flex_balance(token, number, chat_id):
  281.     """دالة الحصول على نسبة الفليكس"""
  282.     headers = {
  283.         'Accept': 'application/json',
  284.         'Accept-Language': 'EN',
  285.         'Authorization': f"Bearer {token}",
  286.         'Connection': 'keep-alive',
  287.         'Content-Type': 'application/json',
  288.         'Referer': 'https://web.vodafone.com.eg/spa/familySharing',
  289.         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
  290.         'clientId': 'WebsiteConsumer',
  291.         'msisdn': number,
  292.     }
  293.  
  294.     try:
  295.         response = requests.get(
  296.             f'https://web.vodafone.com.eg/services/dxl/usage/usageConsumptionReport?bucket.product.publicIdentifier={number}&@type=aggregated',
  297.             headers=headers,
  298.         )
  299.        
  300.         if response.status_code == 200:
  301.             data = response.json()
  302.             for item in data:
  303.                 if item.get("@type") == "OTHERS":
  304.                     for bucket in item.get("bucket", []):
  305.                         if bucket.get("usageType") == "limit":
  306.                             for balance in bucket.get("bucketBalance", []):
  307.                                 if balance.get("@type") == "Remaining" and balance["remainingValue"]["units"] == "FLEX":
  308.                                     return balance["remainingValue"]["amount"]
  309.             return None
  310.         else:
  311.             return None
  312.     except Exception:
  313.         return None
  314.  
  315. def process_flex_info(number, password, chat_id):
  316.     token = unified_login(number, password)
  317.     if not token:
  318.         bot.send_message(chat_id, "❌ فشل تسجيل الدخول - تأكد من صحة الرقم وكلمة المرور")
  319.         return
  320.  
  321.     flex_balance = get_flex_balance(token, number, chat_id)
  322.     current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  323.    
  324.     if flex_balance is not None:
  325.         result_message = f"🎯 نسبة الفليكس الحالية: {flex_balance} فليكس\n"
  326.         result_message += f"🕒 وقت الاستعلام: {current_time}\n"
  327.         if flex_balance < 1000:
  328.             result_message += "⚠️النسبه فوق 30لاف"
  329.         bot.send_message(chat_id, result_message)
  330.     else:
  331.         bot.send_message(chat_id, "❌ لم يتم العثور على بيانات الفليكس")
  332.  
  333. # ===== دوال إرسال الدعوة والقبول =====
  334. def addMember(owner_number, member_number, token, value=10):
  335.     """إرسال دعوة انضمام للعائلة"""
  336.     headers = {
  337.         'Accept': 'application/json',
  338.         'Accept-Language': 'EN',
  339.         'Authorization': token,
  340.         'Connection': 'keep-alive',
  341.         'Content-Type': 'application/json',
  342.         'Origin': 'https://web.vodafone.com.eg',
  343.         'Referer': 'https://web.vodafone.com.eg/spa/familySharing/manageFamily',
  344.         'Sec-Fetch-Dest': 'empty',
  345.         'Sec-Fetch-Mode': 'cors',
  346.         'Sec-Fetch-Site': 'same-origin',
  347.         "User-Agent": "okhttp/4.11.0",
  348.         "x-agent-operatingsystem": "11",
  349.         "clientId": "AnaVodafoneAndroid",
  350.         "x-agent-device": "Samsung_Galaxy_A52",
  351.         "x-agent-version": "2024.7.1",
  352.         "x-agent-build": "600",
  353.         'msisdn': owner_number,
  354.         'sec-ch-ua': '"Not)A;Brand";v="8", "Chromium";v="138", "Google Chrome";v="138"',
  355.         'sec-ch-ua-mobile': '?0',
  356.     }
  357.  
  358.     json_data = {
  359.         'name': 'FlexFamily',
  360.         'type': 'SendInvitation',
  361.         'category': [
  362.             {
  363.                 'value': '523',
  364.                 'listHierarchyId': 'PackageID',
  365.             },
  366.             {
  367.                 'value': '47',
  368.                 'listHierarchyId': 'TemplateID',
  369.             },
  370.             {
  371.                 'value': '523',
  372.                 'listHierarchyId': 'TierID',
  373.             },
  374.             {
  375.                 'value': 'percentage',
  376.                 'listHierarchyId': 'familybehavior',
  377.             },
  378.         ],
  379.         'parts': {
  380.             'member': [
  381.                 {
  382.                     'id': [
  383.                         {
  384.                             'value': owner_number,
  385.                             'schemeName': 'MSISDN',
  386.                         },
  387.                     ],
  388.                     'type': 'Owner',
  389.                 },
  390.                 {
  391.                     'id': [
  392.                         {
  393.                             'value': member_number,
  394.                             'schemeName': 'MSISDN',
  395.                         },
  396.                     ],
  397.                     'type': 'Member',
  398.                 },
  399.             ],
  400.             'characteristicsValue': {
  401.                 'characteristicsValue': [
  402.                     {
  403.                         'characteristicName': 'quotaDist1',
  404.                         'value': value,
  405.                         'type': 'percentage',
  406.                     },
  407.                 ],
  408.             },
  409.         },
  410.     }
  411.  
  412.     response = requests.patch(
  413.         'https://mobile.vodafone.com.eg/services/dxl/cg/customerGroupAPI/customerGroup',
  414.         headers=headers,
  415.         json=json_data,
  416.     )
  417.    
  418.     if response.status_code in [200, 201]:
  419.         return True, f"✅ تم إرسال الدعوة إلى ({member_number}) بنجاح - النسبة: {value}%"
  420.     else:
  421.         return False, f"❌ فشل إرسال الدعوة إلى ({member_number}) - الكود: {response.status_code}"
  422.  
  423. def accept_invitation(owner_number, member_number, token):
  424.     """قبول دعوة الانضمام للعائلة"""
  425.     if token == "error":
  426.         return False, "❌ توكن غير صالح"
  427.  
  428.     url = "https://mobile.vodafone.com.eg/services/dxl/cg/customerGroupAPI/customerGroup"
  429.     headers = {
  430.         "api-host": "ProductOrderingManagement",
  431.         "useCase": "MIProfile",
  432.         "Authorization": token,
  433.         "api-version": "v2",
  434.         "x-agent-operatingsystem": "11",
  435.         "clientId": "AnaVodafoneAndroid",
  436.         "x-agent-device": "Samsung_Galaxy_A52",
  437.         "x-agent-version": "2024.7.1",
  438.         "x-agent-build": "600",
  439.         "msisdn": member_number,
  440.         "Accept": "application/json",
  441.         "Accept-Language": "ar",
  442.         "Content-Type": "application/json; charset=UTF-8",
  443.         "Host": "mobile.vodafone.com.eg",
  444.         "Connection": "Keep-Alive",
  445.         "Accept-Encoding": "gzip",
  446.         "User-Agent": "okhttp/4.11.0"
  447.     }
  448.    
  449.     data = {
  450.         "category": [{"listHierarchyId": "TemplateID", "value": "47"}],
  451.         "name": "FlexFamily",
  452.         "parts": {
  453.             "member": [
  454.                 {"id": [{"schemeName": "MSISDN", "value": owner_number}], "type": "Owner"},
  455.                 {"id": [{"schemeName": "MSISDN", "value": member_number}], "type": "Member"}
  456.             ]
  457.         },
  458.         "type": "AcceptInvitation"
  459.     }
  460.    
  461.     response = requests.patch(url, headers=headers, json=data)
  462.     response_text = response.text
  463.    
  464.     if response.status_code in [200, 201] or response_text == '{}':
  465.         return True, f"✅ تم قبول الدعوة بنجاح"
  466.     elif "Customer not eligible-Family member" in response_text:
  467.         return True, f"⚠️ ({member_number}) موجود بالفعل في عائلة"
  468.     else:
  469.         return False, f"❌ خطأ في قبول الدعوة - الاستجابة: {response_text}"
  470.  
  471. def انتظار(ثواني, chat_id=None, نص="جاري الانتظار"):
  472.     """دالة الانتظار مع إمكانية إرسال تحديثات للتلجرام"""
  473.     if chat_id:
  474.         bot.send_message(chat_id, f"⏳ {نص} {ثواني} ثانية...")
  475.    
  476.     for متبقي in range(ثواني, 0, -1):
  477.         دقائق, ثواني_متبقية = divmod(متبقي, 60)
  478.         time.sleep(1)
  479.    
  480.     return True
  481.  
  482. def محاولة_إرسال_الدعوة(رقم_الأونر, رقم_الفرد, توكن_الأونر, النسبة, chat_id, عدد_المحاولات=3):
  483.     """محاولة إرسال الدعوة مع إعادة المحاولة"""
  484.     if chat_id:
  485.         bot.send_message(chat_id, f"🚀 بدء محاولات إرسال الدعوة ({عدد_المحاولات} محاولات)...")
  486.    
  487.     for محاولة in range(1, عدد_المحاولات + 1):
  488.         if chat_id:
  489.             bot.send_message(chat_id, f"📤 المحاولة رقم {محاولة} لإرسال الدعوة...")
  490.        
  491.         نجاح, رسالة = addMember(رقم_الأونر, رقم_الفرد, توكن_الأونر, النسبة)
  492.        
  493.         if نجاح:
  494.             if chat_id:
  495.                 bot.send_message(chat_id, f"✅ نجحت المحاولة رقم {محاولة} في إرسال الدعوة")
  496.             return True, رسالة
  497.         else:
  498.             if محاولة < عدد_المحاولات:
  499.                 if chat_id:
  500.                     bot.send_message(chat_id, f"⏳ فشلت المحاولة رقم {محاولة}، جاري الانتظار 60 ثانية للمحاولة التالية...")
  501.                 انتظار(60, chat_id, "انتظار لإعادة إرسال الدعوة")
  502.             else:
  503.                 if chat_id:
  504.                     bot.send_message(chat_id, f"❌ فشلت جميع محاولات إرسال الدعوة بعد {عدد_المحاولات} محاولات")
  505.    
  506.     return False, رسالة
  507.  
  508. def محاولة_قبول_الدعوة(رقم_الأونر, رقم_الفرد, توكن_الفرد, chat_id, عدد_المحاولات=3):
  509.     """محاولة قبول الدعوة مع إعادة المحاولة"""
  510.     if chat_id:
  511.         bot.send_message(chat_id, f"🤝 بدء محاولات قبول الدعوة ({عدد_المحاولات} محاولات)...")
  512.    
  513.     for محاولة in range(1, عدد_المحاولات + 1):
  514.         if chat_id:
  515.             bot.send_message(chat_id, f"✅ المحاولة رقم {محاولة} لقبول الدعوة...")
  516.        
  517.         نجاح, رسالة = accept_invitation(رقم_الأونر, رقم_الفرد, توكن_الفرد)
  518.        
  519.         if نجاح:
  520.             if chat_id:
  521.                 bot.send_message(chat_id, f"✅ نجحت المحاولة رقم {محاولة} في قبول الدعوة")
  522.             return True, رسالة
  523.         else:
  524.             if محاولة < عدد_المحاولات:
  525.                 if chat_id:
  526.                     bot.send_message(chat_id, f"⏳ فشلت المحاولة رقم {محاولة}، جاري الانتظار 60 ثانية للمحاولة التالية...")
  527.                 انتظار(60, chat_id, "انتظار لإعادة قبول الدعوة")
  528.             else:
  529.                 if chat_id:
  530.                     bot.send_message(chat_id, f"❌ فشلت جميع محاولات قبول الدعوة بعد {عدد_المحاولات} محاولات")
  531.    
  532.     return False, رسالة
  533.  
  534. def process_invitation_accept(owner_number, owner_password, member_number, member_password, percentage, chat_id):
  535.     """معالجة عملية إرسال الدعوة والقبول"""
  536.     try:
  537.         bot.send_message(chat_id, "🔐 جاري تسجيل دخول الأونر...")
  538.         owner_token = unified_login(owner_number, owner_password)
  539.        
  540.         if not owner_token:
  541.             bot.send_message(chat_id, "❌ فشل تسجيل دخول الأونر! تأكد من صحة الرقم وكلمة المرور")
  542.             return
  543.        
  544.         bot.send_message(chat_id, "🔐 جاري تسجيل دخول الفرد...")
  545.         member_token = unified_login(member_number, member_password)
  546.        
  547.         if not member_token:
  548.             bot.send_message(chat_id, "❌ فشل تسجيل دخول الفرد! تأكد من صحة الرقم وكلمة المرور")
  549.             return
  550.        
  551.         # إرسال الدعوة
  552.         success_send, send_message = محاولة_إرسال_الدعوة(owner_number, member_number, f"Bearer {owner_token}", percentage, chat_id)
  553.        
  554.         if not success_send:
  555.             bot.send_message(chat_id, "❌ توقف العملية بسبب فشل إرسال الدعوة")
  556.             return
  557.        
  558.         bot.send_message(chat_id, send_message)
  559.        
  560.         # انتظار قبل القبول
  561.         bot.send_message(chat_id, "⏳ جاري الانتظار قبل قبول الدعوة...")
  562.         انتظار(10, chat_id, "انتظار قبل القبول")
  563.        
  564.         # قبول الدعوة
  565.         success_accept, accept_message = محاولة_قبول_الدعوة(owner_number, member_number, f"Bearer {member_token}", chat_id)
  566.        
  567.         bot.send_message(chat_id, accept_message)
  568.        
  569.         if success_accept:
  570.             bot.send_message(chat_id, f"🎉 تمت العملية بنجاح!\n\n"
  571.                                      f"✅ الأونر: {owner_number}\n"
  572.                                      f"✅ الفرد: {member_number}\n"
  573.                                      f"✅ النسبة: {percentage}%\n"
  574.                                      f"✅ الوقت: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
  575.         else:
  576.             bot.send_message(chat_id, f"⚠️ تم إرسال الدعوة ولكن فشل قبولها\n"
  577.                                      f"📱 يمكن للفرد قبول الدعوة يدوياً")
  578.            
  579.     except Exception as e:
  580.         bot.send_message(chat_id, f"❌ حدث خطأ غير متوقع: {str(e)}")
  581.  
  582. # ===== نظام البوت الرئيسي مع التسجيل الدائم =====
  583. @bot.message_handler(commands=['start'])
  584. def send_welcome(message):
  585.     try:
  586.         chat_id = message.chat.id
  587.        
  588.         if is_user_registered(chat_id):
  589.             # إذا كان المستخدم مسجل - عرض القائمة الرئيسية مباشرة
  590.             show_main_menu(message)
  591.         else:
  592.             # إذا لم يكن مسجل - طلب التسجيل
  593.             show_registration_welcome(message)
  594.            
  595.     except Exception as e:
  596.         bot.reply_to(message, f"❌ حدث خطأ: {str(e)}")
  597.  
  598. def show_registration_welcome(message):
  599.     """عرض رسالة ترحيب وطلب التسجيل"""
  600.     welcome_text = "🎯 أهلاً بك في البوت المتكامل لفودافون!\n\n"
  601.     welcome_text += "🔐 يبدو أن هذا هو أول استخدام لك.\n"
  602.     welcome_text += "يجب التسجيل مرة واحدة فقط لاستخدام جميع الخدمات.\n\n"
  603.     welcome_text += "📝 سيتم حفظ بياناتك بشكل آمن ولن تحتاج للتسجيل مرة أخرى."
  604.    
  605.     markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
  606.     btn1 = types.KeyboardButton("📝 التسجيل الآن")
  607.     btn2 = types.KeyboardButton("ℹ️ معلومات عن البوت")
  608.     markup.add(btn1, btn2)
  609.    
  610.     bot.send_message(message.chat.id, welcome_text, reply_markup=markup)
  611.  
  612. @bot.message_handler(func=lambda m: m.text == "📝 التسجيل الآن")
  613. def start_registration(message):
  614.     """بدء عملية التسجيل"""
  615.     msg = bot.send_message(message.chat.id, "📱 يرجى إدخال رقم الهاتف (11 رقم):")
  616.     bot.register_next_step_handler(msg, process_registration_phone)
  617.  
  618. def process_registration_phone(message):
  619.     """معالجة رقم الهاتف للتسجيل"""
  620.     try:
  621.         chat_id = message.chat.id
  622.         phone = message.text.strip()
  623.        
  624.         # التحقق من صحة الرقم
  625.         if not re.match(r'^01[0-9]{9}$', phone):
  626.             msg = bot.send_message(chat_id, "❌ رقم الهاتف غير صحيح. يرجى إدخال رقم مصري صحيح (11 رقم):")
  627.             bot.register_next_step_handler(msg, process_registration_phone)
  628.             return
  629.        
  630.         user_data[chat_id] = {'phone': phone}
  631.         msg = bot.send_message(chat_id, "🔑 يرجى إدخال كلمة المرور:")
  632.         bot.register_next_step_handler(msg, process_registration_password)
  633.        
  634.     except Exception as e:
  635.         bot.send_message(chat_id, f"❌ حدث خطأ: {str(e)}")
  636.  
  637. def process_registration_password(message):
  638.     """معالجة كلمة المرور للتسجيل"""
  639.     try:
  640.         chat_id = message.chat.id
  641.         password = message.text.strip()
  642.        
  643.         if chat_id not in user_data:
  644.             bot.send_message(chat_id, "❌ لم يتم إدخال رقم الهاتف. أرسل /start للبدء من جديد.")
  645.             return
  646.        
  647.         phone = user_data[chat_id]['phone']
  648.        
  649.         # محاولة تسجيل الدخول للتحقق من صحة البيانات
  650.         bot.send_message(chat_id, "⏳ جاري التحقق من بياناتك...")
  651.         token = unified_login(phone, password)
  652.        
  653.         if token:
  654.             # التسجيل ناجح - حفظ البيانات بشكل دائم
  655.             register_user(chat_id, phone, password)
  656.             bot.send_message(chat_id, "✅ تم التسجيل بنجاح!\n\n"
  657.                                      "🔐 تم حفظ بياناتك بشكل آمن.\n"
  658.                                      "⚠️ لن تحتاج للتسجيل مرة أخرى في المستقبل.\n\n"
  659.                                      "يمكنك الآن استخدام جميع الخدمات مباشرة.")
  660.             show_main_menu(message)
  661.         else:
  662.             bot.send_message(chat_id, "❌ بيانات الدخول غير صحيحة. يرجى المحاولة مرة أخرى بأرسال /start")
  663.            
  664.     except Exception as e:
  665.         bot.send_message(chat_id, f"❌ حدث خطأ: {str(e)}")
  666.  
  667. def show_main_menu(message):
  668.     """عرض القائمة الرئيسية للمستخدمين المسجلين"""
  669.     chat_id = message.chat.id
  670.    
  671.     # الحصول على بيانات المستخدم لعرضها
  672.     phone, _ = get_user_credentials(chat_id)
  673.    
  674.     welcome_text = f"🚀 أهلاً بك مرة أخرى!\n\n"
  675.     welcome_text += f"📱 رقمك المسجل: {phone}\n\n"
  676.     welcome_text += "🔍 الخدمات المتاحة:\n\n"
  677.     welcome_text += "📊 بيانات الخط - معلومات الحساب والاشتراكات\n"
  678.     welcome_text += "👥 معرفة الأونر - بيانات مجموعة العائلة\n"
  679.     welcome_text += "💳 نسبة الفليكس - معرفة رصيد الفليكس المتبقي\n"
  680.     welcome_text += "📨 إرسال دعوة - إرسال دعوة انضمام للعائلة\n"
  681.     welcome_text += "👤 إدارة الحساب - تحديث أو حذف البيانات\n\n"
  682.     welcome_text += "اختر الخدمة التي تريدها:"
  683.    
  684.     markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
  685.     btn1 = types.KeyboardButton("📊 بيانات الخط")
  686.     btn2 = types.KeyboardButton("👥 معرفة الأونر")
  687.     btn3 = types.KeyboardButton("💳 نسبة الفليكس")
  688.     btn4 = types.KeyboardButton("📨 إرسال دعوة")
  689.     btn5 = types.KeyboardButton("👤 إدارة الحساب")
  690.     btn6 = types.KeyboardButton("🆘 المساعدة")
  691.     markup.add(btn1, btn2, btn3, btn4, btn5, btn6)
  692.    
  693.     bot.send_message(chat_id, welcome_text, reply_markup=markup)
  694.  
  695. # ===== معالجة الخدمات للمستخدمين المسجلين =====
  696. @bot.message_handler(func=lambda m: m.text in ["📊 بيانات الخط", "👥 معرفة الأونر", "💳 نسبة الفليكس"])
  697. def handle_services(message):
  698.     chat_id = message.chat.id
  699.    
  700.     if not is_user_registered(chat_id):
  701.         bot.send_message(chat_id, "❌ يجب التسجيل أولاً. أرسل /start")
  702.         return
  703.    
  704.     # استخدام البيانات المسجلة مسبقاً
  705.     phone, password = get_user_credentials(chat_id)
  706.    
  707.     service_type = message.text
  708.     bot.send_message(chat_id, "⏳ جاري معالجة طلبك، يرجى الانتظار...")
  709.    
  710.     if service_type == "📊 بيانات الخط":
  711.         thread = Thread(target=process_line_info, args=(phone, password, chat_id))
  712.     elif service_type == "👥 معرفة الأونر":
  713.         thread = Thread(target=process_vodafone_family_info, args=(phone, password, chat_id))
  714.     elif service_type == "💳 نسبة الفليكس":
  715.         thread = Thread(target=process_flex_info, args=(phone, password, chat_id))
  716.     else:
  717.         bot.send_message(chat_id, "❌ خدمة غير معروفة.")
  718.         return
  719.        
  720.     thread.start()
  721.  
  722. @bot.message_handler(func=lambda m: m.text == "📨 إرسال دعوة")
  723. def start_invitation_process(message):
  724.     """بدء عملية إرسال الدعوة"""
  725.     chat_id = message.chat.id
  726.    
  727.     if not is_user_registered(chat_id):
  728.         bot.send_message(chat_id, "❌ يجب التسجيل أولاً. أرسل /start")
  729.         return
  730.    
  731.     msg = bot.send_message(chat_id, "👑 أدخل رقم الأونر:")
  732.     bot.register_next_step_handler(msg, process_owner_number)
  733.  
  734. def process_owner_number(message):
  735.     """معالجة رقم الأونر"""
  736.     chat_id = message.chat.id
  737.     owner_number = message.text.strip()
  738.    
  739.     if not re.match(r'^01[0-9]{9}$', owner_number):
  740.         msg = bot.send_message(chat_id, "❌ رقم الأونر غير صحيح. يرجى إدخال رقم مصري صحيح (11 رقم):")
  741.         bot.register_next_step_handler(msg, process_owner_number)
  742.         return
  743.    
  744.     user_data[chat_id] = {'owner_number': owner_number}
  745.     msg = bot.send_message(chat_id, "🔑 أدخل كلمة سر الأونر:")
  746.     bot.register_next_step_handler(msg, process_owner_password)
  747.  
  748. def process_owner_password(message):
  749.     """معالجة كلمة سر الأونر"""
  750.     chat_id = message.chat.id
  751.     owner_password = message.text.strip()
  752.    
  753.     user_data[chat_id]['owner_password'] = owner_password
  754.     msg = bot.send_message(chat_id, "👤 أدخل رقم الفرد المراد إرسال الدعوة له:")
  755.     bot.register_next_step_handler(msg, process_member_number)
  756.  
  757. def process_member_number(message):
  758.     """معالجة رقم الفرد"""
  759.     chat_id = message.chat.id
  760.     member_number = message.text.strip()
  761.    
  762.     if not re.match(r'^01[0-9]{9}$', member_number):
  763.         msg = bot.send_message(chat_id, "❌ رقم الفرد غير صحيح. يرجى إدخال رقم مصري صحيح (11 رقم):")
  764.         bot.register_next_step_handler(msg, process_member_number)
  765.         return
  766.    
  767.     user_data[chat_id]['member_number'] = member_number
  768.     msg = bot.send_message(chat_id, "🔑 أدخل كلمة سر الفرد:")
  769.     bot.register_next_step_handler(msg, process_member_password)
  770.  
  771. def process_member_password(message):
  772.     """معالجة كلمة سر الفرد"""
  773.     chat_id = message.chat.id
  774.     member_password = message.text.strip()
  775.    
  776.     user_data[chat_id]['member_password'] = member_password
  777.    
  778.     # اختيار النسبة
  779.     markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=3)
  780.     btn1 = types.KeyboardButton("10%")
  781.     btn2 = types.KeyboardButton("20%")
  782.     btn3 = types.KeyboardButton("40%")
  783.     markup.add(btn1, btn2, btn3)
  784.    
  785.     msg = bot.send_message(chat_id, "📊 اختر نسبة التوزيع:", reply_markup=markup)
  786.     bot.register_next_step_handler(msg, process_percentage_selection)
  787.  
  788. def process_percentage_selection(message):
  789.     """معالجة اختيار النسبة"""
  790.     chat_id = message.chat.id
  791.     percentage_text = message.text.strip()
  792.    
  793.     percentage_map = {"10%": 10, "20%": 20, "40%": 40}
  794.     percentage = percentage_map.get(percentage_text, 10)
  795.    
  796.     user_data[chat_id]['percentage'] = percentage
  797.    
  798.     # استعادة القائمة الرئيسية
  799.     show_main_menu(message)
  800.    
  801.     # بدء عملية الإرسال والقبول
  802.     owner_number = user_data[chat_id]['owner_number']
  803.     owner_password = user_data[chat_id]['owner_password']
  804.     member_number = user_data[chat_id]['member_number']
  805.     member_password = user_data[chat_id]['member_password']
  806.    
  807.     bot.send_message(chat_id, f"🎬 بدء عملية إرسال الدعوة والقبول بنسبة {percentage}%...")
  808.    
  809.     # تشغيل في thread منفصل
  810.     thread = Thread(target=process_invitation_accept,
  811.                    args=(owner_number, owner_password, member_number, member_password, percentage, chat_id))
  812.     thread.start()
  813.  
  814. @bot.message_handler(func=lambda m: m.text == "👤 إدارة الحساب")
  815. def manage_account(message):
  816.     """إدارة حساب المستخدم"""
  817.     chat_id = message.chat.id
  818.    
  819.     if not is_user_registered(chat_id):
  820.         bot.send_message(chat_id, "❌ يجب التسجيل أولاً. أرسل /start")
  821.         return
  822.    
  823.     user_info = registered_users.get(str(chat_id), {})
  824.     phone = user_info.get('phone', 'غير معروف')
  825.     reg_date = user_info.get('registration_date', 'غير معروف')
  826.    
  827.     account_text = f"👤 معلومات حسابك:\n\n"
  828.     account_text += f"📱 رقم الهاتف: {phone}\n"
  829.     account_text += f"📅 تاريخ التسجيل: {reg_date}\n\n"
  830.     account_text += "اختر الإجراء المطلوب:"
  831.    
  832.     markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
  833.     btn1 = types.KeyboardButton("🔄 إعادة التسجيل")
  834.     btn2 = types.KeyboardButton("🗑️ حذف الحساب")
  835.     btn3 = types.KeyboardButton("🔙 القائمة الرئيسية")
  836.     markup.add(btn1, btn2, btn3)
  837.    
  838.     bot.send_message(chat_id, account_text, reply_markup=markup)
  839.  
  840. @bot.message_handler(func=lambda m: m.text == "🔄 إعادة التسجيل")
  841. def re_register_account(message):
  842.     """إعادة تسجيل الحساب"""
  843.     chat_id = message.chat.id
  844.     delete_user(chat_id)
  845.     bot.send_message(chat_id, "🔓 تم حذف بياناتك القديمة. يمكنك الآن التسجيل مرة أخرى.")
  846.     show_registration_welcome(message)
  847.  
  848. @bot.message_handler(func=lambda m: m.text == "🗑️ حذف الحساب")
  849. def delete_account(message):
  850.     """حذف حساب المستخدم"""
  851.     chat_id = message.chat.id
  852.    
  853.     if delete_user(chat_id):
  854.         bot.send_message(chat_id, "✅ تم حذف حسابك بنجاح. يمكنك التسجيل مرة أخرى بأرسال /start")
  855.     else:
  856.         bot.send_message(chat_id, "❌ حسابك غير موجود.")
  857.  
  858. @bot.message_handler(func=lambda m: m.text == "🔙 القائمة الرئيسية")
  859. def back_to_main(message):
  860.     """العودة للقائمة الرئيسية"""
  861.     show_main_menu(message)
  862.  
  863. @bot.message_handler(func=lambda m: m.text == "ℹ️ معلومات عن البوت")
  864. def bot_info(message):
  865.     """عرض معلومات عن البوت"""
  866.     info_text = "🤖 البوت المتكامل لفودافون\n\n"
  867.     info_text += "🔍 الخدمات المتاحة:\n"
  868.     info_text += "• بيانات الخط والاشتراكات\n"
  869.     info_text += "• معرفة مالك مجموعة العائلة\n"
  870.     info_text += "• نسبة رصيد الفليكس\n"
  871.     info_text += "• إرسال دعوة انضمام للعائلة\n\n"
  872.     info_text += "🔐 نظام التسجيل:\n"
  873.     info_text += "• تسجيل مرة واحدة فقط\n"
  874.     info_text += "• بيانات آمنة ومشفرة\n"
  875.     info_text += "• لا حاجة لإعادة التسجيل\n\n"
  876.     info_text += "📞 الدعم: 01017143221\n\n"
  877.     info_text += "🔒 نضمن خصوصية وأمان بياناتك"
  878.    
  879.     markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
  880.     btn1 = types.KeyboardButton("📝 التسجيل الآن")
  881.     btn2 = types.KeyboardButton("🔙 الرجوع")
  882.     markup.add(btn1, btn2)
  883.    
  884.     bot.send_message(message.chat.id, info_text, reply_markup=markup)
  885.  
  886. @bot.message_handler(func=lambda m: m.text == "🆘 المساعدة")
  887. def send_help(message):
  888.     help_text = "📖 أوامر البوت:\n\n"
  889.     help_text += "📊 بيانات الخط - معلومات الحساب والاشتراكات\n"
  890.     help_text += "👥 معرفة الأونر - بيانات مجموعة العائلة\n"
  891.     help_text += "💳 نسبة الفليكس - معرفة رصيد الفليكس المتبقي\n"
  892.     help_text += "📨 إرسال دعوة - إرسال دعوة انضمام للعائلة\n"
  893.     help_text += "👤 إدارة الحساب - تحديث أو حذف البيانات\n"
  894.     help_text += "🆘 المساعدة - عرض هذه الرسالة\n\n"
  895.     help_text += "🔐 نظام التسجيل:\n"
  896.     help_text += "• تسجيل مرة واحدة فقط عند أول استخدام\n"
  897.     help_text += "• استخدام الخدمات مباشرة بعد التسجيل\n"
  898.     help_text += "• إعادة التسجيل متاحة من إدارة الحساب\n\n"
  899.     help_text += "📞 للتواصل: 01017143221"
  900.     bot.reply_to(message, help_text)
  901.  
  902. @bot.message_handler(func=lambda m: m.text == "🔙 الرجوع")
  903. def back_command(message):
  904.     if is_user_registered(message.chat.id):
  905.         show_main_menu(message)
  906.     else:
  907.         show_registration_welcome(message)
  908.  
  909. @bot.message_handler(func=lambda message: True)
  910. def handle_message(message):
  911.     if message.text.startswith('/'):
  912.         bot.send_message(message.chat.id, "❌ أمر غير معروف. اختر من القائمة أو أرسل /help للمساعدة.")
  913.     else:
  914.         bot.send_message(message.chat.id, "🔍 اختر الخدمة التي تريدها من القائمة:")
  915.  
  916. # تشغيل البوت
  917. if __name__ == '__main__':
  918.     print("✅ تم تشغيل البوت المتكامل بنجاح...")
  919.     print("🤖 البوت يدعم الآن نظام التسجيل الدائم")
  920.     print("   🔐 تسجيل مرة واحدة فقط")
  921.     print("   📊 بيانات الخط")
  922.     print("   👥 معرفة الأونر")
  923.     print("   💳 نسبة الفليكس")
  924.     print("   📨 إرسال دعوة")
  925.     bot.infinity_polling()
Advertisement
Add Comment
Please, Sign In to add comment