Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- 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()
Advertisement
Add Comment
Please, Sign In to add comment