Spaces:
Paused
Paused
| from flask import Flask, request, jsonify | |
| import asyncio | |
| from Crypto.Cipher import AES | |
| from Crypto.Util.Padding import pad | |
| from google.protobuf.json_format import MessageToJson | |
| import binascii | |
| import aiohttp | |
| import requests | |
| import json | |
| import like_pb2 | |
| import like_count_pb2 | |
| import uid_generator_pb2 | |
| from google.protobuf.message import DecodeError | |
| app = Flask(__name__) | |
| def load_tokens(server_name): | |
| try: | |
| if server_name == "IND": | |
| with open("token_ind.json", "r") as f: | |
| tokens = json.load(f) | |
| elif server_name in {"BR", "US", "SAC", "NA"}: | |
| with open("token_br.json", "r") as f: | |
| tokens = json.load(f) | |
| else: | |
| with open("token_bd.json", "r") as f: | |
| tokens = json.load(f) | |
| return tokens | |
| except Exception as e: | |
| app.logger.error(f"Error loading tokens for server {server_name}: {e}") | |
| return None | |
| def encrypt_message(plaintext): | |
| try: | |
| key = b'Yg&tc%DEuh6%Zc^8' | |
| iv = b'6oyZDr22E3ychjM%' | |
| cipher = AES.new(key, AES.MODE_CBC, iv) | |
| padded_message = pad(plaintext, AES.block_size) | |
| encrypted_message = cipher.encrypt(padded_message) | |
| return binascii.hexlify(encrypted_message).decode('utf-8') | |
| except Exception as e: | |
| app.logger.error(f"Error encrypting message: {e}") | |
| return None | |
| def create_protobuf_message(user_id, region): | |
| try: | |
| message = like_pb2.like() | |
| message.uid = int(user_id) | |
| message.region = region | |
| return message.SerializeToString() | |
| except Exception as e: | |
| app.logger.error(f"Error creating protobuf message: {e}") | |
| return None | |
| async def send_request(encrypted_uid, token, url): | |
| try: | |
| edata = bytes.fromhex(encrypted_uid) | |
| headers = { | |
| 'User-Agent': "Dalvik/2.1.0 (Linux; U; Android 9; ASUS_Z01QD Build/PI)", | |
| 'Connection': "Keep-Alive", | |
| 'Accept-Encoding': "gzip", | |
| 'Authorization': f"Bearer {token}", | |
| 'Content-Type': "application/x-www-form-urlencoded", | |
| 'Expect': "100-continue", | |
| 'X-Unity-Version': "2018.4.11f1", | |
| 'X-GA': "v1 1", | |
| 'ReleaseVersion': "OB47" | |
| } | |
| async with aiohttp.ClientSession() as session: | |
| async with session.post(url, data=edata, headers=headers) as response: | |
| if response.status != 200: | |
| app.logger.error(f"Request failed with status code: {response.status}") | |
| return response.status | |
| return await response.text() | |
| except Exception as e: | |
| app.logger.error(f"Exception in send_request: {e}") | |
| return None | |
| async def send_multiple_requests(uid, server_name, url): | |
| try: | |
| region = server_name | |
| protobuf_message = create_protobuf_message(uid, region) | |
| if protobuf_message is None: | |
| app.logger.error("Failed to create protobuf message.") | |
| return None | |
| encrypted_uid = encrypt_message(protobuf_message) | |
| if encrypted_uid is None: | |
| app.logger.error("Encryption failed.") | |
| return None | |
| tasks = [] | |
| tokens = load_tokens(server_name) | |
| if tokens is None: | |
| app.logger.error("Failed to load tokens.") | |
| return None | |
| for i in range(100): | |
| token = tokens[i % len(tokens)]["token"] | |
| tasks.append(send_request(encrypted_uid, token, url)) | |
| results = await asyncio.gather(*tasks, return_exceptions=True) | |
| return results | |
| except Exception as e: | |
| app.logger.error(f"Exception in send_multiple_requests: {e}") | |
| return None | |
| def create_protobuf(uid): | |
| try: | |
| message = uid_generator_pb2.uid_generator() | |
| message.saturn_ = int(uid) | |
| message.garena = 1 | |
| return message.SerializeToString() | |
| except Exception as e: | |
| app.logger.error(f"Error creating uid protobuf: {e}") | |
| return None | |
| def enc(uid): | |
| protobuf_data = create_protobuf(uid) | |
| if protobuf_data is None: | |
| return None | |
| encrypted_uid = encrypt_message(protobuf_data) | |
| return encrypted_uid | |
| def make_request(encrypt, server_name, token): | |
| try: | |
| if server_name == "IND": | |
| url = "https://client.ind.freefiremobile.com/GetPlayerPersonalShow" | |
| elif server_name in {"BR", "US", "SAC", "NA"}: | |
| url = "https://client.us.freefiremobile.com/GetPlayerPersonalShow" | |
| else: | |
| url = "https://clientbp.ggblueshark.com/GetPlayerPersonalShow" | |
| edata = bytes.fromhex(encrypt) | |
| headers = { | |
| 'User-Agent': "Dalvik/2.1.0 (Linux; U; Android 9; ASUS_Z01QD Build/PI)", | |
| 'Connection': "Keep-Alive", | |
| 'Accept-Encoding': "gzip", | |
| 'Authorization': f"Bearer {token}", | |
| 'Content-Type': "application/x-www-form-urlencoded", | |
| 'Expect': "100-continue", | |
| 'X-Unity-Version': "2018.4.11f1", | |
| 'X-GA': "v1 1", | |
| 'ReleaseVersion': "OB47" | |
| } | |
| response = requests.post(url, data=edata, headers=headers, verify=False) | |
| hex_data = response.content.hex() | |
| binary = bytes.fromhex(hex_data) | |
| decode = decode_protobuf(binary) | |
| if decode is None: | |
| app.logger.error("Protobuf decoding returned None.") | |
| return decode | |
| except Exception as e: | |
| app.logger.error(f"Error in make_request: {e}") | |
| return None | |
| def decode_protobuf(binary): | |
| try: | |
| items = like_count_pb2.Info() | |
| items.ParseFromString(binary) | |
| return items | |
| except DecodeError as e: | |
| app.logger.error(f"Error decoding Protobuf data: {e}") | |
| return None | |
| except Exception as e: | |
| app.logger.error(f"Unexpected error during protobuf decoding: {e}") | |
| return None | |
| def handle_requests(): | |
| uid = request.args.get("uid") | |
| server_name = request.args.get("server_name", "").upper() | |
| if not uid or not server_name: | |
| return jsonify({"error": "UID and server_name are required"}), 400 | |
| try: | |
| def process_request(): | |
| tokens = load_tokens(server_name) | |
| if tokens is None: | |
| raise Exception("Failed to load tokens.") | |
| token = tokens[0]['token'] | |
| encrypted_uid = enc(uid) | |
| if encrypted_uid is None: | |
| raise Exception("Encryption of UID failed.") | |
| # الحصول على بيانات اللاعب قبل تنفيذ عملية الإعجاب | |
| before = make_request(encrypted_uid, server_name, token) | |
| if before is None: | |
| raise Exception("Failed to retrieve initial player info.") | |
| try: | |
| jsone = MessageToJson(before) | |
| except Exception as e: | |
| raise Exception(f"Error converting 'before' protobuf to JSON: {e}") | |
| data_before = json.loads(jsone) | |
| before_like = data_before.get('AccountInfo', {}).get('Likes', 0) | |
| try: | |
| before_like = int(before_like) | |
| except Exception: | |
| before_like = 0 | |
| app.logger.info(f"Likes before command: {before_like}") | |
| # تحديد رابط الإعجاب حسب اسم السيرفر | |
| if server_name == "IND": | |
| url = "https://client.ind.freefiremobile.com/LikeProfile" | |
| elif server_name in {"BR", "US", "SAC", "NA"}: | |
| url = "https://client.us.freefiremobile.com/LikeProfile" | |
| else: | |
| url = "https://clientbp.ggblueshark.com/LikeProfile" | |
| # إرسال الطلبات بشكل غير متزامن | |
| asyncio.run(send_multiple_requests(uid, server_name, url)) | |
| # الحصول على بيانات اللاعب بعد تنفيذ عملية الإعجاب | |
| after = make_request(encrypted_uid, server_name, token) | |
| if after is None: | |
| raise Exception("Failed to retrieve player info after like requests.") | |
| try: | |
| jsone_after = MessageToJson(after) | |
| except Exception as e: | |
| raise Exception(f"Error converting 'after' protobuf to JSON: {e}") | |
| data_after = json.loads(jsone_after) | |
| after_like = int(data_after.get('AccountInfo', {}).get('Likes', 0)) | |
| player_uid = int(data_after.get('AccountInfo', {}).get('UID', 0)) | |
| player_name = str(data_after.get('AccountInfo', {}).get('PlayerNickname', '')) | |
| like_given = after_like - before_like | |
| status = 1 if like_given != 0 else 2 | |
| result = { | |
| "LikesGivenByAPI": like_given, | |
| "LikesafterCommand": after_like, | |
| "LikesbeforeCommand": before_like, | |
| "PlayerNickname": player_name, | |
| "UID": player_uid, | |
| "status": status | |
| } | |
| return result | |
| result = process_request() | |
| return jsonify(result) | |
| except Exception as e: | |
| app.logger.error(f"Error processing request: {e}") | |
| return jsonify({"error": str(e)}), 500 | |
| if __name__ == '__main__': | |
| app.run(host='0.0.0.0', port=7860, debug=True, use_reloader=False) |