supabase_enc.py
· 4.4 KiB · Python
Raw
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Остановка скрипта...")
| 1 | import requests |
| 2 | import random |
| 3 | import json |
| 4 | import uuid |
| 5 | import threading |
| 6 | import time |
| 7 | import itertools |
| 8 | |
| 9 | SUPABASE_URL = "https://nrkwqjuavktjmfalvigc.supabase.co" |
| 10 | SUPABASE_KEY = "sb_secret_EpsOv6nTnK-keoSNuvpv5A_PUEt_LUr" |
| 11 | TABLE_NAME = "levels" |
| 12 | REST_URL = f"{SUPABASE_URL}/rest/v1/{TABLE_NAME}" |
| 13 | |
| 14 | # Разные User-Agent как в реальной игре Unity |
| 15 | UNITY_UA = [ |
| 16 | "UnityPlayer/2022.3.15f1 (UnityWebRequest/1.0, libcurl/7.84.0-DEV)", |
| 17 | "UnityPlayer/2021.3.33f1 (UnityWebRequest/1.0, libcurl/7.80.0)", |
| 18 | "UnityPlayer/2023.2.0f1 (UnityWebRequest/1.0, libcurl/8.0.1)", |
| 19 | "UnityPlayer/2022.3.20f1 (UnityWebRequest/1.0, libcurl/7.86.0)", |
| 20 | "UnityPlayer/2023.1.10f1 (UnityWebRequest/1.0, libcurl/8.1.2)", |
| 21 | ] |
| 22 | |
| 23 | # Реалистичные рефереры |
| 24 | REFERERS = [ |
| 25 | "https://game1.example.com/", |
| 26 | "https://game23.supabase.app/", |
| 27 | "https://level-editor.unity.com/", |
| 28 | "https://play.unitycloud.com/", |
| 29 | "https://mobile-game.domain/", |
| 30 | ] |
| 31 | |
| 32 | def get_random_headers(): |
| 33 | return { |
| 34 | "apikey": SUPABASE_KEY, |
| 35 | "Authorization": f"Bearer {SUPABASE_KEY}", |
| 36 | "Content-Type": "application/json", |
| 37 | "User-Agent": random.choice(UNITY_UA), |
| 38 | "Referer": random.choice(REFERERS), |
| 39 | "X-Client-Info": f"unity-client/{random.randint(1000, 9999)}", |
| 40 | "Origin": "https://unity.com", |
| 41 | "Accept": "application/json", |
| 42 | "Accept-Encoding": "gzip, deflate, br", |
| 43 | "Connection": "keep-alive", |
| 44 | "Prefer": "return=minimal" |
| 45 | } |
| 46 | |
| 47 | def create_level_worker(worker_id): |
| 48 | """Один поток — бесконечно создаёт нормальные уровни с маскировкой""" |
| 49 | session = requests.Session() # сессия для keep-alive |
| 50 | counter = itertools.count(1) |
| 51 | |
| 52 | print(f"[Поток {worker_id}] Запущен") |
| 53 | |
| 54 | while True: |
| 55 | try: |
| 56 | level_num = next(counter) |
| 57 | level_name = f"Level {random.randint(10000, 999999)}" |
| 58 | author = f"Player{random.randint(1000, 99999)}" |
| 59 | author_id = str(uuid.uuid4()) |
| 60 | level_id = f"lvl_{random.randint(1000000, 9999999)}_{random.randint(1000, 9999)}" |
| 61 | |
| 62 | level_data = json.dumps({ |
| 63 | "version": random.randint(1, 3), |
| 64 | "name": level_name, |
| 65 | "author": author, |
| 66 | "objects": [], |
| 67 | "triggers": [], |
| 68 | "background": random.choice(["default", "space", "forest", "city"]), |
| 69 | "music": "none", |
| 70 | "gravity": round(random.uniform(0.8, 1.5), 2), |
| 71 | "time_limit": random.randint(180, 600) |
| 72 | }) |
| 73 | |
| 74 | data = { |
| 75 | "level_id": level_id, |
| 76 | "level_name": level_name, |
| 77 | "author": author, |
| 78 | "author_id": author_id, |
| 79 | "description": f"Уровень #{random.randint(100, 99999)} от игрока", |
| 80 | "level_data": level_data, |
| 81 | "difficulty": round(random.uniform(1.0, 10.0), 1), |
| 82 | "downloads": 0, |
| 83 | "likes": 0, |
| 84 | "version": random.randint(1, 5) |
| 85 | } |
| 86 | |
| 87 | headers = get_random_headers() |
| 88 | |
| 89 | response = session.post(REST_URL, headers=headers, json=data, timeout=20) |
| 90 | |
| 91 | if response.status_code in (201, 200): |
| 92 | print(f"[Поток {worker_id}] ✓ Создан уровень #{level_num} | {level_name}") |
| 93 | else: |
| 94 | print(f"[Поток {worker_id}] ✗ Ошибка {response.status_code} | {level_name}") |
| 95 | |
| 96 | except Exception as e: |
| 97 | print(f"[Поток {worker_id}] Исключение: {e}") |
| 98 | |
| 99 | # Лёгкая случайная задержка для большей реалистичности |
| 100 | time.sleep(random.uniform(0.3, 1.8)) |
| 101 | |
| 102 | if __name__ == "__main__": |
| 103 | print("Запуск 50 потоков для бесконечного создания уровней...") |
| 104 | print("Трафик замаскирован под реальные запросы Unity-клиента\n") |
| 105 | |
| 106 | threads = [] |
| 107 | for i in range(50): |
| 108 | t = threading.Thread(target=create_level_worker, args=(i+1,), daemon=True) |
| 109 | t.start() |
| 110 | threads.append(t) |
| 111 | time.sleep(0.05) # лёгкий старт |
| 112 | |
| 113 | # Держим главный поток живым |
| 114 | try: |
| 115 | while True: |
| 116 | time.sleep(1) |
| 117 | except KeyboardInterrupt: |
| 118 | print("\nОстановка скрипта...") |