from flask import Flask, jsonify, request from flask_caching import Cache import requests from Crypto.Cipher import AES from Crypto.Util.Padding import pad import binascii import my_pb2 import output_pb2 import json from colorama import Fore, Style, init import warnings from urllib3.exceptions import InsecureRequestWarning from concurrent.futures import ThreadPoolExecutor, as_completed # Ignore SSL certificate warnings warnings.filterwarnings("ignore", category=InsecureRequestWarning) AES_KEY = b'Yg&tc%DEuh6%Zc^8' AES_IV = b'6oyZDr22E3ychjM%' # Initialize colorama init(autoreset=True) # Initialize Flask app app = Flask(__name__) # Configure Flask-Caching cache = Cache(app, config={'CACHE_TYPE': 'SimpleCache', 'CACHE_DEFAULT_TIMEOUT': 25200}) # 7 ساعات بالثواني (7 * 60 * 60) def get_token(password, uid): url = "https://ffmconnect.live.gop.garenanow.com/oauth/guest/token/grant" headers = { "Host": "100067.connect.garena.com", "User-Agent": "GarenaMSDK/4.0.19P4(G011A ;Android 9;en;US;)", "Content-Type": "application/x-www-form-urlencoded", "Accept-Encoding": "gzip, deflate, br", "Connection": "close" } data = { "uid": uid, "password": password, "response_type": "token", "client_type": "2", "client_secret": "2ee44819e9b4598845141067b281621874d0d5d7af9d8f7e00c1e54715b7d1e3", "client_id": "100067" } response = requests.post(url, headers=headers, data=data) if response.status_code != 200: return None return response.json() def encrypt_message(key, iv, plaintext): cipher = AES.new(key, AES.MODE_CBC, iv) padded_message = pad(plaintext, AES.block_size) encrypted_message = cipher.encrypt(padded_message) return encrypted_message def load_tokens(file_path, limit=None): with open(file_path, 'r') as file: data = json.load(file) tokens = list(data.items()) if limit is not None: tokens = tokens[:limit] # تحديد عدد التوكنات return tokens def parse_response(response_content): # تحليل الـ response لاستخراج الحقول المهمة response_dict = {} lines = response_content.split("\n") for line in lines: if ":" in line: key, value = line.split(":", 1) response_dict[key.strip()] = value.strip().strip('"') return response_dict def process_token(uid, password): token_data = get_token(password, uid) if not token_data: return {"uid": uid, "error": "Failed to retrieve token"} # إنشاء GameData Protobuf game_data = my_pb2.GameData() game_data.timestamp = "2024-12-05 18:15:32" game_data.game_name = "free fire" game_data.game_version = 1 game_data.version_code = "1.108.3" game_data.os_info = "Android OS 9 / API-28 (PI/rel.cjw.20220518.114133)" game_data.device_type = "Handheld" game_data.network_provider = "Verizon Wireless" game_data.connection_type = "WIFI" game_data.screen_width = 1280 game_data.screen_height = 960 game_data.dpi = "240" game_data.cpu_info = "ARMv7 VFPv3 NEON VMH | 2400 | 4" game_data.total_ram = 5951 game_data.gpu_name = "Adreno (TM) 640" game_data.gpu_version = "OpenGL ES 3.0" game_data.user_id = "Google|74b585a9-0268-4ad3-8f36-ef41d2e53610" game_data.ip_address = "172.190.111.97" game_data.language = "en" game_data.open_id = token_data['open_id'] game_data.access_token = token_data['access_token'] game_data.platform_type = 4 game_data.device_form_factor = "Handheld" game_data.device_model = "Asus ASUS_I005DA" game_data.field_60 = 32968 game_data.field_61 = 29815 game_data.field_62 = 2479 game_data.field_63 = 914 game_data.field_64 = 31213 game_data.field_65 = 32968 game_data.field_66 = 31213 game_data.field_67 = 32968 game_data.field_70 = 4 game_data.field_73 = 2 game_data.library_path = "/data/app/com.dts.freefireth-QPvBnTUhYWE-7DMZSOGdmA==/lib/arm" game_data.field_76 = 1 game_data.apk_info = "5b892aaabd688e571f688053118a162b|/data/app/com.dts.freefireth-QPvBnTUhYWE-7DMZSOGdmA==/base.apk" game_data.field_78 = 6 game_data.field_79 = 1 game_data.os_architecture = "32" game_data.build_number = "2019117877" game_data.field_85 = 1 game_data.graphics_backend = "OpenGLES2" game_data.max_texture_units = 16383 game_data.rendering_api = 4 game_data.encoded_field_89 = "\u0017T\u0011\u0017\u0002\b\u000eUMQ\bEZ\u0003@ZK;Z\u0002\u000eV\ri[QVi\u0003\ro\t\u0007e" game_data.field_92 = 9204 game_data.marketplace = "3rd_party" game_data.encryption_key = "KqsHT2B4It60T/65PGR5PXwFxQkVjGNi+IMCK3CFBCBfrNpSUA1dZnjaT3HcYchlIFFL1ZJOg0cnulKCPGD3C3h1eFQ=" game_data.total_storage = 111107 game_data.field_97 = 1 game_data.field_98 = 1 game_data.field_99 = "4" game_data.field_100 = "4" # تسلسل البيانات serialized_data = game_data.SerializeToString() # تشفير البيانات encrypted_data = encrypt_message(AES_KEY, AES_IV, serialized_data) hex_encrypted_data = binascii.hexlify(encrypted_data).decode('utf-8') # إرسال البيانات المشفرة إلى الخادم url = "https://loginbp.common.ggbluefox.com/MajorLogin" headers = { 'User-Agent': "Dalvik/2.1.0 (Linux; U; Android 9; ASUS_Z01QD Build/PI)", 'Connection': "Keep-Alive", 'Accept-Encoding': "gzip", 'Content-Type': "application/octet-stream", 'Expect': "100-continue", 'X-Unity-Version': "2018.4.11f1", 'X-GA': "v1 1", 'ReleaseVersion': "OB48" } edata = bytes.fromhex(hex_encrypted_data) try: response = requests.post(url, data=edata, headers=headers, verify=False) if response.status_code == 200: # محاولة فك تشفير الـ Protobuf example_msg = output_pb2.Garena_420() try: example_msg.ParseFromString(response.content) # تحليل الـ response لاستخراج الحقول المهمة response_dict = parse_response(str(example_msg)) return { # "uid": uid, # "status": response_dict.get("status", "N/A"), "token": response_dict.get("token", "N/A") } except Exception as e: return { "uid": uid, "error": f"Failed to deserialize the response: {e}" } else: return { "uid": uid, "error": f"Failed to get response: HTTP {response.status_code}, {response.reason}" } except requests.RequestException as e: return { "uid": uid, "error": f"An error occurred while making the request: {e}" } @app.route('/token', methods=['GET']) @cache.cached(timeout=25200) # تخزين النتائج لمدة 7 ساعات def get_responses(): # الحصول على عدد التوكنات المطلوبة من query parameter (افتراضيًا 100) limit = request.args.get('limit', default=1, type=int) # تحميل التوكنات من ملف accs.txt مع تحديد الحد الأقصى tokens = load_tokens("accs.txt", limit) responses = [] # استخدام ThreadPoolExecutor لتنفيذ المهام بشكل متوازي with ThreadPoolExecutor(max_workers=15) as executor: future_to_uid = {executor.submit(process_token, uid, password): uid for uid, password in tokens} for future in as_completed(future_to_uid): try: response = future.result() responses.append(response) except Exception as e: responses.append({"uid": future_to_uid[future], "error": str(e)}) return jsonify(responses) if __name__ == "__main__": app.run(host="0.0.0.0", port=7860)