Archives
Trending
Support
Login
clear text
XML
Django
JavaScript
MATLAB
C
C++
C#
Python
SQL
Shell
Bash
Markdown
YAML
JSON
HTML
CSS
PHP
Java
Ruby
Go
Rust
Swift
Kotlin
Arduino
TypeScript
Perl
Autohotkey
Lua
SQF
R
Scala
Haskell
Groovy
Dart
Clojure
VB.NET
Objective-C
PowerShell
Bash
CoffeeScript
Verilog
# -*- coding: utf-8 -*- import logging import pyfiglet import requests import re import time import random import string from colorama import init, Fore from bs4 import BeautifulSoup from datetime import datetime import telebot from telebot import types from threading import Thread import json import os # إعدادات التسجيل logging.basicConfig(level=logging.INFO) # تفعيل colorama init(autoreset=False) # توكن البوت TELEGRAM_BOT_TOKEN = "6636872139:AAGfjgkKTirnN3ZJ6k0ylTDYZBp9tQ2M6-U" # تهيئة البوت bot = telebot.TeleBot(TELEGRAM_BOT_TOKEN, parse_mode="HTML") # تعريف ألوان RED = '\x1b[1;31m' GREEN = '\x1b[1;32m' YELLOW = '\x1b[1;33m' BLUE = '\x1b[1;34m' PURPLE = '\x1b[1;35m' CYAN = '\x1b[1;36m' WHITE = '\x1b[1;37m' RESET = '\x1b[0m' # ملف تخزين المستخدمين USERS_FILE = 'registered_users.json' user_data = {} registered_users = {} # تحميل المستخدمين def load_users(): global registered_users try: if os.path.exists(USERS_FILE): with open(USERS_FILE, 'r', encoding='utf-8') as f: registered_users = json.load(f) except Exception as e: print(f"Error loading users: {e}") registered_users = {} def save_users(): try: with open(USERS_FILE, 'w', encoding='utf-8') as f: json.dump(registered_users, f, ensure_ascii=False, indent=2) except Exception as e: print(f"Error saving users: {e}") load_users() # ===== الدوال المساعدة ===== def get_nonce(): return ''.join(random.choice(string.ascii_lowercase) for _ in range(10)) def unified_login(number, password): """دالة تسجيل دخول موحدة""" with requests.Session() as session: try: base_url = 'https://web.vodafone.com.eg/auth/realms/vf-realm/protocol/openid-connect/auth' redirect_uri = 'https://web.vodafone.com.eg/ar/KClogin' nonce = get_nonce() 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" response_url_action = session.get(url_action) soup = BeautifulSoup(response_url_action.content, 'html.parser') form_action = soup.find('form').get('action') data = {'username': number, 'password': password} response_login = session.post(form_action, data=data) if "KClogin" in response_login.url: code = response_login.url.split('code=')[1] data_token = { 'code': code, 'grant_type': 'authorization_code', 'client_id': 'website', 'redirect_uri': redirect_uri } token_response = session.post( 'https://web.vodafone.com.eg/auth/realms/vf-realm/protocol/openid-connect/token', data=data_token ) return token_response.json().get('access_token') return None except Exception as e: return None # ===== نظام التسجيل الدائم ===== def register_user(chat_id, phone, password): """تسجيل مستخدم جديد بشكل دائم""" registered_users[str(chat_id)] = { 'phone': phone, 'password': password, 'registration_date': datetime.now().strftime("%Y-%m-%d %H:%M:%S") } save_users() return True def is_user_registered(chat_id): """التحقق إذا كان المستخدم مسجل""" return str(chat_id) in registered_users def get_user_credentials(chat_id): """الحصول على بيانات المستخدم المسجل""" user = registered_users.get(str(chat_id)) if user: return user['phone'], user['password'] return None, None def delete_user(chat_id): """حذف مستخدم (لعملية إعادة التسجيل)""" if str(chat_id) in registered_users: del registered_users[str(chat_id)] save_users() return True return False # ===== دوال الخدمات الأساسية ===== def process_vodafone_family_info(username, password, chat_id): try: token = unified_login(username, password) if not token: bot.send_message(chat_id, "❌ فشل تسجيل الدخول - تأكد من صحة الرقم وكلمة المرور") return url2 = 'https://mobile.vodafone.com.eg/services/dxl/cg/customerGroupAPI/customerGroup?type=Family' headers2 = { 'channel': 'MOBILE', 'useCase': 'Promo', 'Authorization': f'Bearer {token}', 'api-version': 'v2', 'x-agent-operatingsystem': '11', 'clientId': 'AnaVodafoneAndroid', 'x-agent-device': 'OPPO CPH2059', 'x-agent-version': '2024.3.3', 'x-agent-build': '593', 'msisdn': username, 'Content-Type': 'application/json', 'Accept': 'application/json', 'Accept-Language': 'ar', 'Host': 'mobile.vodafone.com.eg', 'Connection': 'Keep-Alive', 'Accept-Encoding': 'gzip', 'User-Agent': 'okhttp/4.11.0', } r2 = requests.get(url2, headers=headers2, timeout=10) if r2.status_code != 200: bot.send_message(chat_id, f"❌ خطأ في الخدمة: {r2.status_code}") return data_resp = r2.json() members = [] if isinstance(data_resp, list) and len(data_resp) > 0: parts = data_resp[0].get('parts', {}) if isinstance(data_resp[0], dict) else {} members = parts.get('member', []) if isinstance(parts, dict) else [] else: if isinstance(data_resp, dict): parts = data_resp.get('parts', {}) members = parts.get('member', []) else: members = [] owner_number = None member_numbers = [] for member in members: if not isinstance(member, dict): continue member_type = member.get('type') member_id = None try: id_field = member.get('id') if isinstance(id_field, list) and len(id_field) > 0 and isinstance(id_field[0], dict): member_id = id_field[0].get('value') elif isinstance(id_field, dict): member_id = id_field.get('value') elif isinstance(id_field, str): member_id = id_field except Exception: member_id = None if member_type == 'Owner': owner_number = member_id elif member_type == 'Member' and member_id: member_numbers.append(member_id) result_message = "🎯 نتائج مجموعة العائلة:\n\n" if owner_number: result_message += f'👑 المالك (Owner): {owner_number}\n\n' if member_numbers: result_message += '👥 الأعضاء (Members):\n' + '\n'.join([f'• {num}' for num in member_numbers]) + "\n" if not owner_number and not member_numbers: result_message = "❌ لم يتم العثور على أي بيانات للمجموعة." bot.send_message(chat_id, result_message) except Exception as e: bot.send_message(chat_id, f"❌ حدث خطأ: {str(e)}") def process_line_info(number, password, chat_id): token = unified_login(number, password) if not token: bot.send_message(chat_id, "❌ فشل تسجيل الدخول - تأكد من صحة الرقم وكلمة المرور") return 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}' headers2 = { 'channel': 'MOBILE', 'useCase': 'Promo', 'Authorization': f'Bearer {token}', 'api-version': 'v2', 'x-agent-operatingsystem': '11', 'clientId': 'AnaVodafoneAndroid', 'x-agent-device': 'OPPO CPH2059', 'x-agent-version': '2024.3.3', 'x-agent-build': '593', 'msisdn': number, 'Content-Type': 'application/json', 'Accept': 'application/json', 'Accept-Language': 'ar', 'User-Agent': 'okhttp/4.11.0' } try: r2 = requests.get(url2, headers=headers2).json() user_info = r2[0] contact = user_info['contact'][0] billing_account = user_info['billingAccount'] subscriptions = user_info.get('subscriptions', []) categories = user_info.get('categories', []) contract_id = user_info['IDs'][0]['value'] status_history = user_info.get('statusHistory', []) result = f"👤 الاسم: {contact['contactFirstName']} {contact['contactLastName']}\n" result += f"🆔 الرقم القومي: {contact.get('nationalID', 'غير متوفر')}\n" result += f"🏙️ المدينة: {contact['contactMedium'][0]['city']}\n" result += f"💳 رقم الحساب: {billing_account['IDs'][1]['value']}\n" result += f"🧾 كود العميل: {billing_account['IDs'][0]['value']}\n" result += f"📄 رقم العقد: {contract_id}\n\n" if categories: result += "📌 التصنيفات:\n" for cat in categories: result += f" - {cat['listHirarchyId']} : {cat['value']}\n" if subscriptions: result += "\n📜 الاشتراكات:\n" for sub in subscriptions: result += f" - {sub['name']}\n" if status_history: result += "\n📶 حالة الخط:\n" for st in status_history: status_text = "نشط" if st['status'] == "Active" else "موقوف" result += f" - {status_text} (السبب: {st['statusReason']})\n" bot.send_message(chat_id, result) except Exception as e: bot.send_message(chat_id, f"❌ فشل في جلب البيانات: {e}") def get_flex_balance(token, number, chat_id): """دالة الحصول على نسبة الفليكس""" headers = { 'Accept': 'application/json', 'Accept-Language': 'EN', 'Authorization': f"Bearer {token}", 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Referer': 'https://web.vodafone.com.eg/spa/familySharing', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'clientId': 'WebsiteConsumer', 'msisdn': number, } try: response = requests.get( f'https://web.vodafone.com.eg/services/dxl/usage/usageConsumptionReport?bucket.product.publicIdentifier={number}&@type=aggregated', headers=headers, ) if response.status_code == 200: data = response.json() for item in data: if item.get("@type") == "OTHERS": for bucket in item.get("bucket", []): if bucket.get("usageType") == "limit": for balance in bucket.get("bucketBalance", []): if balance.get("@type") == "Remaining" and balance["remainingValue"]["units"] == "FLEX": return balance["remainingValue"]["amount"] return None else: return None except Exception: return None def process_flex_info(number, password, chat_id): token = unified_login(number, password) if not token: bot.send_message(chat_id, "❌ فشل تسجيل الدخول - تأكد من صحة الرقم وكلمة المرور") return flex_balance = get_flex_balance(token, number, chat_id) current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") if flex_balance is not None: result_message = f"🎯 نسبة الفليكس الحالية: {flex_balance} فليكس\n" result_message += f"🕒 وقت الاستعلام: {current_time}\n" if flex_balance < 1000: result_message += "⚠️النسبه فوق 30لاف" bot.send_message(chat_id, result_message) else: bot.send_message(chat_id, "❌ لم يتم العثور على بيانات الفليكس") # ===== دوال إرسال الدعوة والقبول ===== def addMember(owner_number, member_number, token, value=10): """إرسال دعوة انضمام للعائلة""" headers = { 'Accept': 'application/json', 'Accept-Language': 'EN', 'Authorization': token, 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Origin': 'https://web.vodafone.com.eg', 'Referer': 'https://web.vodafone.com.eg/spa/familySharing/manageFamily', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'same-origin', "User-Agent": "okhttp/4.11.0", "x-agent-operatingsystem": "11", "clientId": "AnaVodafoneAndroid", "x-agent-device": "Samsung_Galaxy_A52", "x-agent-version": "2024.7.1", "x-agent-build": "600", 'msisdn': owner_number, 'sec-ch-ua': '"Not)A;Brand";v="8", "Chromium";v="138", "Google Chrome";v="138"', 'sec-ch-ua-mobile': '?0', } json_data = { 'name': 'FlexFamily', 'type': 'SendInvitation', 'category': [ { 'value': '523', 'listHierarchyId': 'PackageID', }, { 'value': '47', 'listHierarchyId': 'TemplateID', }, { 'value': '523', 'listHierarchyId': 'TierID', }, { 'value': 'percentage', 'listHierarchyId': 'familybehavior', }, ], 'parts': { 'member': [ { 'id': [ { 'value': owner_number, 'schemeName': 'MSISDN', }, ], 'type': 'Owner', }, { 'id': [ { 'value': member_number, 'schemeName': 'MSISDN', }, ], 'type': 'Member', }, ], 'characteristicsValue': { 'characteristicsValue': [ { 'characteristicName': 'quotaDist1', 'value': value, 'type': 'percentage', }, ], }, }, } response = requests.patch( 'https://mobile.vodafone.com.eg/services/dxl/cg/customerGroupAPI/customerGroup', headers=headers, json=json_data, ) if response.status_code in [200, 201]: return True, f"✅ تم إرسال الدعوة إلى ({member_number}) بنجاح - النسبة: {value}%" else: return False, f"❌ فشل إرسال الدعوة إلى ({member_number}) - الكود: {response.status_code}" def accept_invitation(owner_number, member_number, token): """قبول دعوة الانضمام للعائلة""" if token == "error": return False, "❌ توكن غير صالح" url = "https://mobile.vodafone.com.eg/services/dxl/cg/customerGroupAPI/customerGroup" headers = { "api-host": "ProductOrderingManagement", "useCase": "MIProfile", "Authorization": token, "api-version": "v2", "x-agent-operatingsystem": "11", "clientId": "AnaVodafoneAndroid", "x-agent-device": "Samsung_Galaxy_A52", "x-agent-version": "2024.7.1", "x-agent-build": "600", "msisdn": member_number, "Accept": "application/json", "Accept-Language": "ar", "Content-Type": "application/json; charset=UTF-8", "Host": "mobile.vodafone.com.eg", "Connection": "Keep-Alive", "Accept-Encoding": "gzip", "User-Agent": "okhttp/4.11.0" } data = { "category": [{"listHierarchyId": "TemplateID", "value": "47"}], "name": "FlexFamily", "parts": { "member": [ {"id": [{"schemeName": "MSISDN", "value": owner_number}], "type": "Owner"}, {"id": [{"schemeName": "MSISDN", "value": member_number}], "type": "Member"} ] }, "type": "AcceptInvitation" } response = requests.patch(url, headers=headers, json=data) response_text = response.text if response.status_code in [200, 201] or response_text == '{}': return True, f"✅ تم قبول الدعوة بنجاح" elif "Customer not eligible-Family member" in response_text: return True, f"⚠️ ({member_number}) موجود بالفعل في عائلة" else: return False, f"❌ خطأ في قبول الدعوة - الاستجابة: {response_text}" def انتظار(ثواني, chat_id=None, نص="جاري الانتظار"): """دالة الانتظار مع إمكانية إرسال تحديثات للتلجرام""" if chat_id: bot.send_message(chat_id, f"⏳ {نص} {ثواني} ثانية...") for متبقي in range(ثواني, 0, -1): دقائق, ثواني_متبقية = divmod(متبقي, 60) time.sleep(1) return True def محاولة_إرسال_الدعوة(رقم_الأونر, رقم_الفرد, توكن_الأونر, النسبة, chat_id, عدد_المحاولات=3): """محاولة إرسال الدعوة مع إعادة المحاولة""" if chat_id: bot.send_message(chat_id, f"🚀 بدء محاولات إرسال الدعوة ({عدد_المحاولات} محاولات)...") for محاولة in range(1, عدد_المحاولات + 1): if chat_id: bot.send_message(chat_id, f"📤 المحاولة رقم {محاولة} لإرسال الدعوة...") نجاح, رسالة = addMember(رقم_الأونر, رقم_الفرد, توكن_الأونر, النسبة) if نجاح: if chat_id: bot.send_message(chat_id, f"✅ نجحت المحاولة رقم {محاولة} في إرسال الدعوة") return True, رسالة else: if محاولة < عدد_المحاولات: if chat_id: bot.send_message(chat_id, f"⏳ فشلت المحاولة رقم {محاولة}، جاري الانتظار 60 ثانية للمحاولة التالية...") انتظار(60, chat_id, "انتظار لإعادة إرسال الدعوة") else: if chat_id: bot.send_message(chat_id, f"❌ فشلت جميع محاولات إرسال الدعوة بعد {عدد_المحاولات} محاولات") return False, رسالة def محاولة_قبول_الدعوة(رقم_الأونر, رقم_الفرد, توكن_الفرد, chat_id, عدد_المحاولات=3): """محاولة قبول الدعوة مع إعادة المحاولة""" if chat_id: bot.send_message(chat_id, f"🤝 بدء محاولات قبول الدعوة ({عدد_المحاولات} محاولات)...") for محاولة in range(1, عدد_المحاولات + 1): if chat_id: bot.send_message(chat_id, f"✅ المحاولة رقم {محاولة} لقبول الدعوة...") نجاح, رسالة = accept_invitation(رقم_الأونر, رقم_الفرد, توكن_الفرد) if نجاح: if chat_id: bot.send_message(chat_id, f"✅ نجحت المحاولة رقم {محاولة} في قبول الدعوة") return True, رسالة else: if محاولة < عدد_المحاولات: if chat_id: bot.send_message(chat_id, f"⏳ فشلت المحاولة رقم {محاولة}، جاري الانتظار 60 ثانية للمحاولة التالية...") انتظار(60, chat_id, "انتظار لإعادة قبول الدعوة") else: if chat_id: bot.send_message(chat_id, f"❌ فشلت جميع محاولات قبول الدعوة بعد {عدد_المحاولات} محاولات") return False, رسالة def process_invitation_accept(owner_number, owner_password, member_number, member_password, percentage, chat_id): """معالجة عملية إرسال الدعوة والقبول""" try: bot.send_message(chat_id, "🔐 جاري تسجيل دخول الأونر...") owner_token = unified_login(owner_number, owner_password) if not owner_token: bot.send_message(chat_id, "❌ فشل تسجيل دخول الأونر! تأكد من صحة الرقم وكلمة المرور") return bot.send_message(chat_id, "🔐 جاري تسجيل دخول الفرد...") member_token = unified_login(member_number, member_password) if not member_token: bot.send_message(chat_id, "❌ فشل تسجيل دخول الفرد! تأكد من صحة الرقم وكلمة المرور") return # إرسال الدعوة success_send, send_message = محاولة_إرسال_الدعوة(owner_number, member_number, f"Bearer {owner_token}", percentage, chat_id) if not success_send: bot.send_message(chat_id, "❌ توقف العملية بسبب فشل إرسال الدعوة") return bot.send_message(chat_id, send_message) # انتظار قبل القبول bot.send_message(chat_id, "⏳ جاري الانتظار قبل قبول الدعوة...") انتظار(10, chat_id, "انتظار قبل القبول") # قبول الدعوة success_accept, accept_message = محاولة_قبول_الدعوة(owner_number, member_number, f"Bearer {member_token}", chat_id) bot.send_message(chat_id, accept_message) if success_accept: bot.send_message(chat_id, f"🎉 تمت العملية بنجاح!\n\n" f"✅ الأونر: {owner_number}\n" f"✅ الفرد: {member_number}\n" f"✅ النسبة: {percentage}%\n" f"✅ الوقت: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") else: bot.send_message(chat_id, f"⚠️ تم إرسال الدعوة ولكن فشل قبولها\n" f"📱 يمكن للفرد قبول الدعوة يدوياً") except Exception as e: bot.send_message(chat_id, f"❌ حدث خطأ غير متوقع: {str(e)}") # ===== نظام البوت الرئيسي مع التسجيل الدائم ===== @bot.message_handler(commands=['start']) def send_welcome(message): try: chat_id = message.chat.id if is_user_registered(chat_id): # إذا كان المستخدم مسجل - عرض القائمة الرئيسية مباشرة show_main_menu(message) else: # إذا لم يكن مسجل - طلب التسجيل show_registration_welcome(message) except Exception as e: bot.reply_to(message, f"❌ حدث خطأ: {str(e)}") def show_registration_welcome(message): """عرض رسالة ترحيب وطلب التسجيل""" welcome_text = "🎯 أهلاً بك في البوت المتكامل لفودافون!\n\n" welcome_text += "🔐 يبدو أن هذا هو أول استخدام لك.\n" welcome_text += "يجب التسجيل مرة واحدة فقط لاستخدام جميع الخدمات.\n\n" welcome_text += "📝 سيتم حفظ بياناتك بشكل آمن ولن تحتاج للتسجيل مرة أخرى." markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2) btn1 = types.KeyboardButton("📝 التسجيل الآن") btn2 = types.KeyboardButton("ℹ️ معلومات عن البوت") markup.add(btn1, btn2) bot.send_message(message.chat.id, welcome_text, reply_markup=markup) @bot.message_handler(func=lambda m: m.text == "📝 التسجيل الآن") def start_registration(message): """بدء عملية التسجيل""" msg = bot.send_message(message.chat.id, "📱 يرجى إدخال رقم الهاتف (11 رقم):") bot.register_next_step_handler(msg, process_registration_phone) def process_registration_phone(message): """معالجة رقم الهاتف للتسجيل""" try: chat_id = message.chat.id phone = message.text.strip() # التحقق من صحة الرقم if not re.match(r'^01[0-9]{9}$', phone): msg = bot.send_message(chat_id, "❌ رقم الهاتف غير صحيح. يرجى إدخال رقم مصري صحيح (11 رقم):") bot.register_next_step_handler(msg, process_registration_phone) return user_data[chat_id] = {'phone': phone} msg = bot.send_message(chat_id, "🔑 يرجى إدخال كلمة المرور:") bot.register_next_step_handler(msg, process_registration_password) except Exception as e: bot.send_message(chat_id, f"❌ حدث خطأ: {str(e)}") def process_registration_password(message): """معالجة كلمة المرور للتسجيل""" try: chat_id = message.chat.id password = message.text.strip() if chat_id not in user_data: bot.send_message(chat_id, "❌ لم يتم إدخال رقم الهاتف. أرسل /start للبدء من جديد.") return phone = user_data[chat_id]['phone'] # محاولة تسجيل الدخول للتحقق من صحة البيانات bot.send_message(chat_id, "⏳ جاري التحقق من بياناتك...") token = unified_login(phone, password) if token: # التسجيل ناجح - حفظ البيانات بشكل دائم register_user(chat_id, phone, password) bot.send_message(chat_id, "✅ تم التسجيل بنجاح!\n\n" "🔐 تم حفظ بياناتك بشكل آمن.\n" "⚠️ لن تحتاج للتسجيل مرة أخرى في المستقبل.\n\n" "يمكنك الآن استخدام جميع الخدمات مباشرة.") show_main_menu(message) else: bot.send_message(chat_id, "❌ بيانات الدخول غير صحيحة. يرجى المحاولة مرة أخرى بأرسال /start") except Exception as e: bot.send_message(chat_id, f"❌ حدث خطأ: {str(e)}") def show_main_menu(message): """عرض القائمة الرئيسية للمستخدمين المسجلين""" chat_id = message.chat.id # الحصول على بيانات المستخدم لعرضها phone, _ = get_user_credentials(chat_id) welcome_text = f"🚀 أهلاً بك مرة أخرى!\n\n" welcome_text += f"📱 رقمك المسجل: {phone}\n\n" welcome_text += "🔍 الخدمات المتاحة:\n\n" welcome_text += "📊 بيانات الخط - معلومات الحساب والاشتراكات\n" welcome_text += "👥 معرفة الأونر - بيانات مجموعة العائلة\n" welcome_text += "💳 نسبة الفليكس - معرفة رصيد الفليكس المتبقي\n" welcome_text += "📨 إرسال دعوة - إرسال دعوة انضمام للعائلة\n" welcome_text += "👤 إدارة الحساب - تحديث أو حذف البيانات\n\n" welcome_text += "اختر الخدمة التي تريدها:" markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2) btn1 = types.KeyboardButton("📊 بيانات الخط") btn2 = types.KeyboardButton("👥 معرفة الأونر") btn3 = types.KeyboardButton("💳 نسبة الفليكس") btn4 = types.KeyboardButton("📨 إرسال دعوة") btn5 = types.KeyboardButton("👤 إدارة الحساب") btn6 = types.KeyboardButton("🆘 المساعدة") markup.add(btn1, btn2, btn3, btn4, btn5, btn6) bot.send_message(chat_id, welcome_text, reply_markup=markup) # ===== معالجة الخدمات للمستخدمين المسجلين ===== @bot.message_handler(func=lambda m: m.text in ["📊 بيانات الخط", "👥 معرفة الأونر", "💳 نسبة الفليكس"]) def handle_services(message): chat_id = message.chat.id if not is_user_registered(chat_id): bot.send_message(chat_id, "❌ يجب التسجيل أولاً. أرسل /start") return # استخدام البيانات المسجلة مسبقاً phone, password = get_user_credentials(chat_id) service_type = message.text bot.send_message(chat_id, "⏳ جاري معالجة طلبك، يرجى الانتظار...") if service_type == "📊 بيانات الخط": thread = Thread(target=process_line_info, args=(phone, password, chat_id)) elif service_type == "👥 معرفة الأونر": thread = Thread(target=process_vodafone_family_info, args=(phone, password, chat_id)) elif service_type == "💳 نسبة الفليكس": thread = Thread(target=process_flex_info, args=(phone, password, chat_id)) else: bot.send_message(chat_id, "❌ خدمة غير معروفة.") return thread.start() @bot.message_handler(func=lambda m: m.text == "📨 إرسال دعوة") def start_invitation_process(message): """بدء عملية إرسال الدعوة""" chat_id = message.chat.id if not is_user_registered(chat_id): bot.send_message(chat_id, "❌ يجب التسجيل أولاً. أرسل /start") return msg = bot.send_message(chat_id, "👑 أدخل رقم الأونر:") bot.register_next_step_handler(msg, process_owner_number) def process_owner_number(message): """معالجة رقم الأونر""" chat_id = message.chat.id owner_number = message.text.strip() if not re.match(r'^01[0-9]{9}$', owner_number): msg = bot.send_message(chat_id, "❌ رقم الأونر غير صحيح. يرجى إدخال رقم مصري صحيح (11 رقم):") bot.register_next_step_handler(msg, process_owner_number) return user_data[chat_id] = {'owner_number': owner_number} msg = bot.send_message(chat_id, "🔑 أدخل كلمة سر الأونر:") bot.register_next_step_handler(msg, process_owner_password) def process_owner_password(message): """معالجة كلمة سر الأونر""" chat_id = message.chat.id owner_password = message.text.strip() user_data[chat_id]['owner_password'] = owner_password msg = bot.send_message(chat_id, "👤 أدخل رقم الفرد المراد إرسال الدعوة له:") bot.register_next_step_handler(msg, process_member_number) def process_member_number(message): """معالجة رقم الفرد""" chat_id = message.chat.id member_number = message.text.strip() if not re.match(r'^01[0-9]{9}$', member_number): msg = bot.send_message(chat_id, "❌ رقم الفرد غير صحيح. يرجى إدخال رقم مصري صحيح (11 رقم):") bot.register_next_step_handler(msg, process_member_number) return user_data[chat_id]['member_number'] = member_number msg = bot.send_message(chat_id, "🔑 أدخل كلمة سر الفرد:") bot.register_next_step_handler(msg, process_member_password) def process_member_password(message): """معالجة كلمة سر الفرد""" chat_id = message.chat.id member_password = message.text.strip() user_data[chat_id]['member_password'] = member_password # اختيار النسبة markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=3) btn1 = types.KeyboardButton("10%") btn2 = types.KeyboardButton("20%") btn3 = types.KeyboardButton("40%") markup.add(btn1, btn2, btn3) msg = bot.send_message(chat_id, "📊 اختر نسبة التوزيع:", reply_markup=markup) bot.register_next_step_handler(msg, process_percentage_selection) def process_percentage_selection(message): """معالجة اختيار النسبة""" chat_id = message.chat.id percentage_text = message.text.strip() percentage_map = {"10%": 10, "20%": 20, "40%": 40} percentage = percentage_map.get(percentage_text, 10) user_data[chat_id]['percentage'] = percentage # استعادة القائمة الرئيسية show_main_menu(message) # بدء عملية الإرسال والقبول owner_number = user_data[chat_id]['owner_number'] owner_password = user_data[chat_id]['owner_password'] member_number = user_data[chat_id]['member_number'] member_password = user_data[chat_id]['member_password'] bot.send_message(chat_id, f"🎬 بدء عملية إرسال الدعوة والقبول بنسبة {percentage}%...") # تشغيل في thread منفصل thread = Thread(target=process_invitation_accept, args=(owner_number, owner_password, member_number, member_password, percentage, chat_id)) thread.start() @bot.message_handler(func=lambda m: m.text == "👤 إدارة الحساب") def manage_account(message): """إدارة حساب المستخدم""" chat_id = message.chat.id if not is_user_registered(chat_id): bot.send_message(chat_id, "❌ يجب التسجيل أولاً. أرسل /start") return user_info = registered_users.get(str(chat_id), {}) phone = user_info.get('phone', 'غير معروف') reg_date = user_info.get('registration_date', 'غير معروف') account_text = f"👤 معلومات حسابك:\n\n" account_text += f"📱 رقم الهاتف: {phone}\n" account_text += f"📅 تاريخ التسجيل: {reg_date}\n\n" account_text += "اختر الإجراء المطلوب:" markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2) btn1 = types.KeyboardButton("🔄 إعادة التسجيل") btn2 = types.KeyboardButton("🗑️ حذف الحساب") btn3 = types.KeyboardButton("🔙 القائمة الرئيسية") markup.add(btn1, btn2, btn3) bot.send_message(chat_id, account_text, reply_markup=markup) @bot.message_handler(func=lambda m: m.text == "🔄 إعادة التسجيل") def re_register_account(message): """إعادة تسجيل الحساب""" chat_id = message.chat.id delete_user(chat_id) bot.send_message(chat_id, "🔓 تم حذف بياناتك القديمة. يمكنك الآن التسجيل مرة أخرى.") show_registration_welcome(message) @bot.message_handler(func=lambda m: m.text == "🗑️ حذف الحساب") def delete_account(message): """حذف حساب المستخدم""" chat_id = message.chat.id if delete_user(chat_id): bot.send_message(chat_id, "✅ تم حذف حسابك بنجاح. يمكنك التسجيل مرة أخرى بأرسال /start") else: bot.send_message(chat_id, "❌ حسابك غير موجود.") @bot.message_handler(func=lambda m: m.text == "🔙 القائمة الرئيسية") def back_to_main(message): """العودة للقائمة الرئيسية""" show_main_menu(message) @bot.message_handler(func=lambda m: m.text == "ℹ️ معلومات عن البوت") def bot_info(message): """عرض معلومات عن البوت""" info_text = "🤖 البوت المتكامل لفودافون\n\n" info_text += "🔍 الخدمات المتاحة:\n" info_text += "• بيانات الخط والاشتراكات\n" info_text += "• معرفة مالك مجموعة العائلة\n" info_text += "• نسبة رصيد الفليكس\n" info_text += "• إرسال دعوة انضمام للعائلة\n\n" info_text += "🔐 نظام التسجيل:\n" info_text += "• تسجيل مرة واحدة فقط\n" info_text += "• بيانات آمنة ومشفرة\n" info_text += "• لا حاجة لإعادة التسجيل\n\n" info_text += "📞 الدعم: 01017143221\n\n" info_text += "🔒 نضمن خصوصية وأمان بياناتك" markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2) btn1 = types.KeyboardButton("📝 التسجيل الآن") btn2 = types.KeyboardButton("🔙 الرجوع") markup.add(btn1, btn2) bot.send_message(message.chat.id, info_text, reply_markup=markup) @bot.message_handler(func=lambda m: m.text == "🆘 المساعدة") def send_help(message): help_text = "📖 أوامر البوت:\n\n" help_text += "📊 بيانات الخط - معلومات الحساب والاشتراكات\n" help_text += "👥 معرفة الأونر - بيانات مجموعة العائلة\n" help_text += "💳 نسبة الفليكس - معرفة رصيد الفليكس المتبقي\n" help_text += "📨 إرسال دعوة - إرسال دعوة انضمام للعائلة\n" help_text += "👤 إدارة الحساب - تحديث أو حذف البيانات\n" help_text += "🆘 المساعدة - عرض هذه الرسالة\n\n" help_text += "🔐 نظام التسجيل:\n" help_text += "• تسجيل مرة واحدة فقط عند أول استخدام\n" help_text += "• استخدام الخدمات مباشرة بعد التسجيل\n" help_text += "• إعادة التسجيل متاحة من إدارة الحساب\n\n" help_text += "📞 للتواصل: 01017143221" bot.reply_to(message, help_text) @bot.message_handler(func=lambda m: m.text == "🔙 الرجوع") def back_command(message): if is_user_registered(message.chat.id): show_main_menu(message) else: show_registration_welcome(message) @bot.message_handler(func=lambda message: True) def handle_message(message): if message.text.startswith('/'): bot.send_message(message.chat.id, "❌ أمر غير معروف. اختر من القائمة أو أرسل /help للمساعدة.") else: bot.send_message(message.chat.id, "🔍 اختر الخدمة التي تريدها من القائمة:") # تشغيل البوت if __name__ == '__main__': print("✅ تم تشغيل البوت المتكامل بنجاح...") print("🤖 البوت يدعم الآن نظام التسجيل الدائم") print(" 🔐 تسجيل مرة واحدة فقط") print(" 📊 بيانات الخط") print(" 👥 معرفة الأونر") print(" 💳 نسبة الفليكس") print(" 📨 إرسال دعوة") bot.infinity_polling()
Mark as private (unlisted)
for 30 minutes
for 6 hours
for 1 day
for 1 week
for 1 month
for 1 year
everlasting (like CCCP)