glitxh 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- glitxh-0.1.0/PKG-INFO +6 -0
- glitxh-0.1.0/pyproject.toml +14 -0
- glitxh-0.1.0/setup.cfg +4 -0
- glitxh-0.1.0/src/glitxh/__init__.py +1 -0
- glitxh-0.1.0/src/glitxh/glitxh.py +744 -0
- glitxh-0.1.0/src/glitxh.egg-info/PKG-INFO +6 -0
- glitxh-0.1.0/src/glitxh.egg-info/SOURCES.txt +7 -0
- glitxh-0.1.0/src/glitxh.egg-info/dependency_links.txt +1 -0
- glitxh-0.1.0/src/glitxh.egg-info/top_level.txt +1 -0
glitxh-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "glitxh"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Script glitxh"
|
|
9
|
+
license = {text = "MIT"}
|
|
10
|
+
authors = [{name = "Namamu", email = "email@contoh.com"}]
|
|
11
|
+
dependencies = []
|
|
12
|
+
|
|
13
|
+
[tool.setuptools.packages.find]
|
|
14
|
+
where = ["src"]
|
glitxh-0.1.0/setup.cfg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .glitxh import *
|
|
@@ -0,0 +1,744 @@
|
|
|
1
|
+
"""
|
|
2
|
+
GLITXH-VIP GENERATOR V1.4 (OPTIMIZED)
|
|
3
|
+
Credits : glitxh (tele : @glitxh4ff)
|
|
4
|
+
saluran : https://whatsapp.com/channel/0029VbCM9ME17EmxSJP3ox3j
|
|
5
|
+
Modifikasi: Proxy rotasi TOR + Webshare | Minimized N/A | Fast Mode
|
|
6
|
+
NOTED : JANGAN DI HAPUS ANGGEP AJA CREDITS!
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import os, sys, subprocess, time, threading, socket, re, json
|
|
10
|
+
import hmac, hashlib, string, random, codecs, base64, itertools
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
13
|
+
|
|
14
|
+
def _i(p, m=None):
|
|
15
|
+
try: __import__(m or p.replace("-","_"))
|
|
16
|
+
except ImportError:
|
|
17
|
+
subprocess.check_call([sys.executable,"-m","pip","install",p,"-q"],
|
|
18
|
+
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
19
|
+
|
|
20
|
+
for _p,_m in [("colorama",None),("requests",None),("pycryptodome","Crypto"),
|
|
21
|
+
("protobuf_decoder","protobuf_decoder"),("urllib3",None),("cfonts",None)]:
|
|
22
|
+
_i(_p,_m)
|
|
23
|
+
|
|
24
|
+
import requests, urllib3
|
|
25
|
+
from Crypto.Cipher import AES
|
|
26
|
+
from Crypto.Util.Padding import pad
|
|
27
|
+
from colorama import Fore, Style, init
|
|
28
|
+
from cfonts import render
|
|
29
|
+
|
|
30
|
+
init(autoreset=True)
|
|
31
|
+
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
|
32
|
+
|
|
33
|
+
red=Fore.RED; lg=Fore.LIGHTGREEN_EX; green=Fore.GREEN; bold=Style.BRIGHT
|
|
34
|
+
purpel=Fore.MAGENTA; cyan=Fore.CYAN; yellow=Fore.YELLOW; W=Fore.RESET
|
|
35
|
+
|
|
36
|
+
# ══════════════════════════════════════════════════════════════════
|
|
37
|
+
# FORMAT WAKTU
|
|
38
|
+
# ══════════════════════════════════════════════════════════════════
|
|
39
|
+
def format_time(seconds):
|
|
40
|
+
seconds = max(0, int(seconds))
|
|
41
|
+
d = seconds//86400; seconds%=86400
|
|
42
|
+
h = seconds//3600; seconds%=3600
|
|
43
|
+
m = seconds//60; s = seconds%60
|
|
44
|
+
parts = []
|
|
45
|
+
if d: parts.append(f"{d}hari")
|
|
46
|
+
if h: parts.append(f"{h}jam")
|
|
47
|
+
if m: parts.append(f"{m}menit")
|
|
48
|
+
if s or not parts: parts.append(f"{s}detik")
|
|
49
|
+
return " ".join(parts)
|
|
50
|
+
|
|
51
|
+
# ══════════════════════════════════════════════════════════════════
|
|
52
|
+
# FILE CHANGE DETECTOR
|
|
53
|
+
# ══════════════════════════════════════════════════════════════════
|
|
54
|
+
SCRIPT_PATH = os.path.abspath(__file__)
|
|
55
|
+
_SCRIPT_HASH = None
|
|
56
|
+
_pause_event = threading.Event()
|
|
57
|
+
_pause_event.set()
|
|
58
|
+
|
|
59
|
+
def _get_hash():
|
|
60
|
+
try:
|
|
61
|
+
with open(SCRIPT_PATH,'rb') as f: return hashlib.md5(f.read()).hexdigest()
|
|
62
|
+
except: return None
|
|
63
|
+
|
|
64
|
+
def _file_detector():
|
|
65
|
+
global _SCRIPT_HASH
|
|
66
|
+
_SCRIPT_HASH = _get_hash()
|
|
67
|
+
while True:
|
|
68
|
+
time.sleep(3)
|
|
69
|
+
h = _get_hash()
|
|
70
|
+
if h and _SCRIPT_HASH and h != _SCRIPT_HASH:
|
|
71
|
+
_pause_event.clear()
|
|
72
|
+
print(f"\n{yellow}{bold}[!] FILE BERUBAH! Restart? (y/n): {W}", end='', flush=True)
|
|
73
|
+
try:
|
|
74
|
+
c = input().strip().lower()
|
|
75
|
+
if c == 'y':
|
|
76
|
+
os.execv(sys.executable, [sys.executable]+sys.argv)
|
|
77
|
+
else:
|
|
78
|
+
_SCRIPT_HASH = h
|
|
79
|
+
except: pass
|
|
80
|
+
_pause_event.set()
|
|
81
|
+
|
|
82
|
+
threading.Thread(target=_file_detector, daemon=True).start()
|
|
83
|
+
|
|
84
|
+
# ══════════════════════════════════════════════════════════════════
|
|
85
|
+
# TOR SETUP
|
|
86
|
+
# ══════════════════════════════════════════════════════════════════
|
|
87
|
+
_TOR_PROC = None
|
|
88
|
+
_TOR_READY = False
|
|
89
|
+
_TOR_LOCK = threading.Lock()
|
|
90
|
+
_TOR_RENEWING= False
|
|
91
|
+
|
|
92
|
+
def _setup_tor():
|
|
93
|
+
global _TOR_PROC, _TOR_READY
|
|
94
|
+
try:
|
|
95
|
+
_resolv="nameserver 1.1.1.1\nnameserver 1.0.0.1\noptions rotate timeout:1 attempts:1\n"
|
|
96
|
+
for p in ['/data/data/com.termux/files/usr/etc/resolv.conf','/etc/resolv.conf']:
|
|
97
|
+
try: os.makedirs(os.path.dirname(p),exist_ok=True); open(p,'w').write(_resolv); break
|
|
98
|
+
except: pass
|
|
99
|
+
except: pass
|
|
100
|
+
try: subprocess.run(['pkill','-9','tor'],capture_output=True,check=False); time.sleep(1)
|
|
101
|
+
except: pass
|
|
102
|
+
rc=("SocksPort 127.0.0.1:9050\nControlPort 127.0.0.1:9051\n"
|
|
103
|
+
"CookieAuthentication 0\nMaxCircuitDirtiness 8\nUseEntryGuards 0\n"
|
|
104
|
+
"NumEntryGuards 8\nSafeLogging 0\nLog notice stdout\nClientUseIPv4 1\n"
|
|
105
|
+
"CircuitBuildTimeout 10\nLearnCircuitBuildTimeout 0\nMaxOnionsPending 1024\n")
|
|
106
|
+
tp='/tmp/torrc'
|
|
107
|
+
for p in ['/data/data/com.termux/files/usr/etc/tor/torrc','/tmp/torrc']:
|
|
108
|
+
try: os.makedirs(os.path.dirname(p),exist_ok=True); open(p,'w').write(rc); tp=p; break
|
|
109
|
+
except: pass
|
|
110
|
+
_TOR_PROC=subprocess.Popen(['tor','-f',tp],stdout=subprocess.DEVNULL,
|
|
111
|
+
stderr=subprocess.DEVNULL,start_new_session=True)
|
|
112
|
+
for _ in range(25):
|
|
113
|
+
time.sleep(1)
|
|
114
|
+
if subprocess.run(['pgrep','-x','tor'],capture_output=True).returncode==0:
|
|
115
|
+
_TOR_READY=True; break
|
|
116
|
+
|
|
117
|
+
def _renew_tor_bg():
|
|
118
|
+
"""Renew TOR di background — tidak block worker."""
|
|
119
|
+
global _TOR_RENEWING
|
|
120
|
+
with _TOR_LOCK:
|
|
121
|
+
if _TOR_RENEWING: return
|
|
122
|
+
_TOR_RENEWING = True
|
|
123
|
+
try:
|
|
124
|
+
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
|
|
125
|
+
s.settimeout(4); s.connect(('127.0.0.1',9051))
|
|
126
|
+
s.sendall(b'AUTHENTICATE ""\r\nSIGNAL NEWNYM\r\nQUIT\r\n')
|
|
127
|
+
s.recv(256); s.close()
|
|
128
|
+
time.sleep(2)
|
|
129
|
+
except: pass
|
|
130
|
+
finally:
|
|
131
|
+
_TOR_RENEWING = False
|
|
132
|
+
|
|
133
|
+
threading.Thread(target=_setup_tor, daemon=True).start()
|
|
134
|
+
time.sleep(5)
|
|
135
|
+
|
|
136
|
+
# ══════════════════════════════════════════════════════════════════
|
|
137
|
+
# PROXY MANAGER — thread-local sessions, rotate tiap N request
|
|
138
|
+
# ══════════════════════════════════════════════════════════════════
|
|
139
|
+
WEBSHARE_PROXIES = [
|
|
140
|
+
"http://gajuiica:wo29gu5sa2sh@31.59.20.176:6754/",
|
|
141
|
+
"http://gajuiica:wo29gu5sa2sh@92.113.242.158:6742/",
|
|
142
|
+
"http://gajuiica:wo29gu5sa2sh@198.23.239.134:6540/",
|
|
143
|
+
"http://gajuiica:wo29gu5sa2sh@45.38.107.97:6014/",
|
|
144
|
+
"http://gajuiica:wo29gu5sa2sh@107.172.163.27:6543/",
|
|
145
|
+
"http://gajuiica:wo29gu5sa2sh@216.10.27.159:6837/",
|
|
146
|
+
"http://gajuiica:wo29gu5sa2sh@142.111.67.146:5611/",
|
|
147
|
+
"http://gajuiica:wo29gu5sa2sh@191.96.254.138:6185/",
|
|
148
|
+
"http://gajuiica:wo29gu5sa2sh@31.58.9.4:6077/",
|
|
149
|
+
"http://gajuiica:wo29gu5sa2sh@23.229.19.94:8689/",
|
|
150
|
+
"http://cidyiiul:0x1sq2qkuk6a@31.59.20.176:6754/",
|
|
151
|
+
"http://cidyiiul:0x1sq2qkuk6a@92.113.242.158:6742/",
|
|
152
|
+
"http://cidyiiul:0x1sq2qkuk6a@198.23.239.134:6540/",
|
|
153
|
+
"http://cidyiiul:0x1sq2qkuk6a@45.38.107.97:6014/",
|
|
154
|
+
"http://cidyiiul:0x1sq2qkuk6a@107.172.163.27:6543/",
|
|
155
|
+
"http://cidyiiul:0x1sq2qkuk6a@216.10.27.159:6837/",
|
|
156
|
+
"http://cidyiiul:0x1sq2qkuk6a@142.111.67.146:5611/",
|
|
157
|
+
"http://cidyiiul:0x1sq2qkuk6a@191.96.254.138:6185/",
|
|
158
|
+
"http://cidyiiul:0x1sq2qkuk6a@31.58.9.4:6077/",
|
|
159
|
+
"http://cidyiiul:0x1sq2qkuk6a@23.229.19.94:8689/",
|
|
160
|
+
"http://ffrevdai:kapukxzd8av3@31.59.20.176:6754/",
|
|
161
|
+
"http://ffrevdai:kapukxzd8av3@92.113.242.158:6742/",
|
|
162
|
+
"http://ffrevdai:kapukxzd8av3@198.23.239.134:6540/",
|
|
163
|
+
"http://ffrevdai:kapukxzd8av3@45.38.107.97:6014/",
|
|
164
|
+
"http://ffrevdai:kapukxzd8av3@107.172.163.27:6543/",
|
|
165
|
+
"http://ffrevdai:kapukxzd8av3@216.10.27.159:6837/",
|
|
166
|
+
"http://ffrevdai:kapukxzd8av3@142.111.67.146:5611/",
|
|
167
|
+
"http://ffrevdai:kapukxzd8av3@191.96.254.138:6185/",
|
|
168
|
+
"http://ffrevdai:kapukxzd8av3@31.58.9.4:6077/",
|
|
169
|
+
"http://ffrevdai:kapukxzd8av3@23.229.19.94:8689/",
|
|
170
|
+
"http://nfjndowc:vuc84qb19nsg@31.59.20.176:6754/",
|
|
171
|
+
"http://nfjndowc:vuc84qb19nsg@92.113.242.158:6742/",
|
|
172
|
+
"http://nfjndowc:vuc84qb19nsg@198.23.239.134:6540/",
|
|
173
|
+
"http://nfjndowc:vuc84qb19nsg@45.38.107.97:6014/",
|
|
174
|
+
"http://nfjndowc:vuc84qb19nsg@107.172.163.27:6543/",
|
|
175
|
+
"http://nfjndowc:vuc84qb19nsg@216.10.27.159:6837/",
|
|
176
|
+
"http://nfjndowc:vuc84qb19nsg@142.111.67.146:5611/",
|
|
177
|
+
"http://nfjndowc:vuc84qb19nsg@191.96.254.138:6185/",
|
|
178
|
+
"http://nfjndowc:vuc84qb19nsg@31.58.9.4:6077/",
|
|
179
|
+
"http://nfjndowc:vuc84qb19nsg@23.229.19.94:8689/",
|
|
180
|
+
]
|
|
181
|
+
|
|
182
|
+
VALID_REGIONS = ["ME","IND","ID","VN","TH","BD","PK","TW","EU","CIS","NA","SAC","BR","SG"]
|
|
183
|
+
|
|
184
|
+
# Proxy state — global tapi lock minimal
|
|
185
|
+
_pidx = 0
|
|
186
|
+
_pidx_lock = threading.Lock()
|
|
187
|
+
_use_tor = False
|
|
188
|
+
_tor_ts = time.time() # kapan terakhir switch ke TOR
|
|
189
|
+
_local = threading.local()
|
|
190
|
+
|
|
191
|
+
def _get_session():
|
|
192
|
+
"""
|
|
193
|
+
Thread-local session pool.
|
|
194
|
+
Setiap thread punya session sendiri, di-refresh tiap 8 request.
|
|
195
|
+
Switch TOR ↔ Webshare berdasarkan waktu (non-blocking).
|
|
196
|
+
"""
|
|
197
|
+
global _use_tor, _tor_ts, _pidx
|
|
198
|
+
|
|
199
|
+
# Tentukan mode proxy (non-blocking, hanya baca/tulis 1 bool)
|
|
200
|
+
now = time.time()
|
|
201
|
+
if now - _tor_ts >= 5:
|
|
202
|
+
_use_tor = not _use_tor
|
|
203
|
+
_tor_ts = now
|
|
204
|
+
if _use_tor and not _TOR_RENEWING:
|
|
205
|
+
threading.Thread(target=_renew_tor_bg, daemon=True).start()
|
|
206
|
+
|
|
207
|
+
# Init thread-local state
|
|
208
|
+
if not hasattr(_local,'count'): _local.count=0; _local.sess=None
|
|
209
|
+
_local.count += 1
|
|
210
|
+
|
|
211
|
+
# Refresh session tiap 8 request
|
|
212
|
+
if _local.sess is None or _local.count % 8 == 0:
|
|
213
|
+
s = requests.Session()
|
|
214
|
+
s.verify = False
|
|
215
|
+
a = requests.adapters.HTTPAdapter(pool_connections=10, pool_maxsize=20, max_retries=0)
|
|
216
|
+
s.mount('http://',a); s.mount('https://',a)
|
|
217
|
+
if _use_tor and _TOR_READY:
|
|
218
|
+
s.proxies = {'http':'socks5h://127.0.0.1:9050',
|
|
219
|
+
'https':'socks5h://127.0.0.1:9050'}
|
|
220
|
+
else:
|
|
221
|
+
with _pidx_lock:
|
|
222
|
+
p = WEBSHARE_PROXIES[_pidx % len(WEBSHARE_PROXIES)]
|
|
223
|
+
_pidx += 1
|
|
224
|
+
s.proxies = {'http':p,'https':p}
|
|
225
|
+
_local.sess = s
|
|
226
|
+
|
|
227
|
+
return _local.sess
|
|
228
|
+
|
|
229
|
+
# ══════════════════════════════════════════════════════════════════
|
|
230
|
+
# GLOBAL STATE
|
|
231
|
+
# ══════════════════════════════════════════════════════════════════
|
|
232
|
+
hex_key = "32656534343831396539623435393838343531343130363762323831363231383734643064356437616639643866376530306331653534373135623764316533"
|
|
233
|
+
key = bytes.fromhex(hex_key)
|
|
234
|
+
|
|
235
|
+
file_lock = threading.Lock()
|
|
236
|
+
print_lock = threading.Lock()
|
|
237
|
+
cnt_lock = threading.Lock()
|
|
238
|
+
stuck_lock = threading.Lock()
|
|
239
|
+
tier_lock = threading.Lock()
|
|
240
|
+
|
|
241
|
+
total_accounts = 0
|
|
242
|
+
num_workers = 20
|
|
243
|
+
success_count = 0
|
|
244
|
+
_stuck_running = True
|
|
245
|
+
_last_success = time.time()
|
|
246
|
+
_start_time = time.time()
|
|
247
|
+
_last_100_time = time.time()
|
|
248
|
+
_last_100_count = 0
|
|
249
|
+
start_time_progress = time.time()
|
|
250
|
+
last_progress_time = time.time()
|
|
251
|
+
last_progress_count = 0
|
|
252
|
+
|
|
253
|
+
tier_stats = {"NORMAL":0,"LOW":0,"MEDIUM":0,"HIGH":0,"LEGEND":0}
|
|
254
|
+
TIER_EMOJIS = {"NORMAL":"🍀","LOW":"😬","MEDIUM":"🤩","HIGH":"☠️","LEGEND":"❤️🔥"}
|
|
255
|
+
TIER_COLORS = {"LEGEND":Fore.RED+Style.BRIGHT,"HIGH":Fore.MAGENTA+Style.BRIGHT,
|
|
256
|
+
"MEDIUM":Fore.CYAN+Style.BRIGHT,"LOW":Fore.YELLOW,"NORMAL":Fore.GREEN}
|
|
257
|
+
|
|
258
|
+
REGION_LANG = {"ME":"ar","IND":"hi","ID":"id","VN":"vi","TH":"th","BD":"bn",
|
|
259
|
+
"PK":"ur","TW":"zh","EU":"en","CIS":"ru","NA":"en","SAC":"es",
|
|
260
|
+
"BR":"pt","SG":"en"}
|
|
261
|
+
|
|
262
|
+
BASE_DIR = "GLITXH-VIP"
|
|
263
|
+
_tf_cache = {}
|
|
264
|
+
|
|
265
|
+
def get_tier_files(region):
|
|
266
|
+
ru = region.upper()
|
|
267
|
+
rd = os.path.join(BASE_DIR,ru)
|
|
268
|
+
for sub in [rd,os.path.join(rd,"LEGENDA"),os.path.join(rd,"High"),
|
|
269
|
+
os.path.join(rd,"Medium"),os.path.join(rd,"Low"),
|
|
270
|
+
os.path.join(rd,"Normal")]:
|
|
271
|
+
os.makedirs(sub,exist_ok=True)
|
|
272
|
+
return {"LEGEND":os.path.join(rd,"LEGENDA",f"Account-{ru}.json"),
|
|
273
|
+
"HIGH": os.path.join(rd,"High", f"Account-{ru}.json"),
|
|
274
|
+
"MEDIUM":os.path.join(rd,"Medium", f"Account-{ru}.json"),
|
|
275
|
+
"LOW": os.path.join(rd,"Low", f"Account-{ru}.json"),
|
|
276
|
+
"NORMAL":os.path.join(rd,"Normal", f"Account-{ru}.json")}
|
|
277
|
+
|
|
278
|
+
def cached_tf(region):
|
|
279
|
+
if region not in _tf_cache: _tf_cache[region]=get_tier_files(region)
|
|
280
|
+
return _tf_cache[region]
|
|
281
|
+
|
|
282
|
+
# ── Stuck detector — hanya success_count ──────────────────────────
|
|
283
|
+
def _stuck_loop():
|
|
284
|
+
global _stuck_running,_last_success
|
|
285
|
+
while _stuck_running:
|
|
286
|
+
time.sleep(5)
|
|
287
|
+
with stuck_lock: idle=time.time()-_last_success
|
|
288
|
+
if total_accounts>0 and success_count>=total_accounts: break
|
|
289
|
+
if idle>=25:
|
|
290
|
+
threading.Thread(target=_renew_tor_bg,daemon=True).start()
|
|
291
|
+
with stuck_lock: _last_success=time.time()
|
|
292
|
+
|
|
293
|
+
threading.Thread(target=_stuck_loop,daemon=True).start()
|
|
294
|
+
|
|
295
|
+
# ══════════════════════════════════════════════════════════════════
|
|
296
|
+
# TIER
|
|
297
|
+
# ══════════════════════════════════════════════════════════════════
|
|
298
|
+
def calculate_tier(aid):
|
|
299
|
+
if not aid or aid=="N/A": return "NORMAL"
|
|
300
|
+
s=0
|
|
301
|
+
if len(aid)>=6:
|
|
302
|
+
rem=aid[3:]
|
|
303
|
+
if len(set(aid))==1: s+=30
|
|
304
|
+
elif len(set(rem))==1: s+=25
|
|
305
|
+
elif aid[:3] in["154","155","156","157","158","159"] and len(set(rem))==1: s+=28
|
|
306
|
+
for pat,pts in [(r'(\d)\1{5,}',10),(r'(\d)\1{4,}',8),(r'(\d)\1{3,}',6),(r'(\d)\1{2,}',3)]:
|
|
307
|
+
if re.search(pat,aid): s+=pts; break
|
|
308
|
+
if re.search(r'(12345|23456|34567|45678|56789|98765|87654|76543|65432|54321)',aid): s+=7
|
|
309
|
+
elif re.search(r'(1234|2345|3456|4567|5678|6789|9876|8765|7654|6543|5432|4321)',aid): s+=4
|
|
310
|
+
if len(aid)>=6 and aid==aid[::-1]: s+=8
|
|
311
|
+
elif len(aid)>=4 and aid[:2]==aid[-1:-3:-1]: s+=4
|
|
312
|
+
if len(aid)>=6 and len(set(aid[::2]))==1 and len(set(aid[1::2]))==1: s+=6
|
|
313
|
+
for sn in['888','999','666','777','000','123','321','111','222','333','444','555']:
|
|
314
|
+
if sn in aid: s+=2
|
|
315
|
+
if len(aid)<=8: s+=5
|
|
316
|
+
elif len(aid)<=9: s+=3
|
|
317
|
+
if s>=20: return "LEGEND"
|
|
318
|
+
if s>=12: return "HIGH"
|
|
319
|
+
if s>=6: return "MEDIUM"
|
|
320
|
+
if s>=2: return "LOW"
|
|
321
|
+
return "NORMAL"
|
|
322
|
+
|
|
323
|
+
def save_by_tier(entry,tier,region):
|
|
324
|
+
if entry.get("account_id")=="N/A": return
|
|
325
|
+
fp=cached_tf(region).get(tier)
|
|
326
|
+
if not fp: return
|
|
327
|
+
with file_lock:
|
|
328
|
+
try:
|
|
329
|
+
data=json.load(open(fp,'r',encoding='utf-8')) if os.path.exists(fp) else []
|
|
330
|
+
if not isinstance(data,list): data=[data]
|
|
331
|
+
data.append(entry)
|
|
332
|
+
json.dump(data,open(fp,'w',encoding='utf-8'),indent=4,ensure_ascii=False)
|
|
333
|
+
except: pass
|
|
334
|
+
|
|
335
|
+
# ══════════════════════════════════════════════════════════════════
|
|
336
|
+
# CRYPTO
|
|
337
|
+
# ══════════════════════════════════════════════════════════════════
|
|
338
|
+
_AES_KEY=bytes([89,103,38,116,99,37,68,69,117,104,54,37,90,99,94,56])
|
|
339
|
+
_AES_IV =bytes([54,111,121,90,68,114,50,50,69,51,121,99,104,106,77,37])
|
|
340
|
+
|
|
341
|
+
def aes_enc(hex_pt) -> bytes:
|
|
342
|
+
pt=bytes.fromhex(hex_pt)
|
|
343
|
+
return AES.new(_AES_KEY,AES.MODE_CBC,_AES_IV).encrypt(pad(pt,AES.block_size))
|
|
344
|
+
|
|
345
|
+
def aes_enc_hex(hex_pt) -> str:
|
|
346
|
+
return aes_enc(hex_pt).hex()
|
|
347
|
+
|
|
348
|
+
def enc_varint(n):
|
|
349
|
+
if n<0: return b''
|
|
350
|
+
h=[]
|
|
351
|
+
while True:
|
|
352
|
+
b=n&0x7F; n>>=7
|
|
353
|
+
if n: b|=0x80
|
|
354
|
+
h.append(b)
|
|
355
|
+
if not n: break
|
|
356
|
+
return bytes(h)
|
|
357
|
+
|
|
358
|
+
def proto_varint(f,v): return enc_varint((f<<3)|0)+enc_varint(v)
|
|
359
|
+
def proto_len(f,v):
|
|
360
|
+
p=v.encode() if isinstance(v,str) else v
|
|
361
|
+
return enc_varint((f<<3)|2)+enc_varint(len(p))+p
|
|
362
|
+
|
|
363
|
+
def build_proto(fields):
|
|
364
|
+
pkt=bytearray()
|
|
365
|
+
for f,v in fields.items():
|
|
366
|
+
if isinstance(v,dict): pkt.extend(proto_len(f,build_proto(v)))
|
|
367
|
+
elif isinstance(v,int): pkt.extend(proto_varint(f,v))
|
|
368
|
+
else: pkt.extend(proto_len(f,v))
|
|
369
|
+
return bytes(pkt)
|
|
370
|
+
|
|
371
|
+
def encode_oid(orig):
|
|
372
|
+
ks=[0x30,0x30,0x30,0x32,0x30,0x31,0x37,0x30,
|
|
373
|
+
0x30,0x30,0x30,0x30,0x32,0x30,0x31,0x37,
|
|
374
|
+
0x30,0x30,0x30,0x30,0x30,0x32,0x30,0x31,
|
|
375
|
+
0x37,0x30,0x30,0x30,0x30,0x30,0x32,0x30]
|
|
376
|
+
enc="".join(chr(ord(c)^ks[i%len(ks)]) for i,c in enumerate(orig))
|
|
377
|
+
return {"open_id":orig,"field_14":enc}
|
|
378
|
+
|
|
379
|
+
def to_ue(s):
|
|
380
|
+
return "".join(c if 32<=ord(c)<=126 else f"\\u{ord(c):04x}" for c in s)
|
|
381
|
+
|
|
382
|
+
def decode_jwt(token):
|
|
383
|
+
"""
|
|
384
|
+
Fix: cari JWT dengan lebih robust — tidak hanya dari posisi 'eyJ'.
|
|
385
|
+
Coba semua kemungkinan posisi JWT di response text.
|
|
386
|
+
"""
|
|
387
|
+
# Pola JWT standard FF
|
|
388
|
+
JWT_PREFIX = "eyJhbGciOiJIUzI1NiIsInN2ciI6IjEiLCJ0eXAiOiJKV1QifQ"
|
|
389
|
+
try:
|
|
390
|
+
# Cari prefix spesifik dulu
|
|
391
|
+
idx = token.find(JWT_PREFIX)
|
|
392
|
+
if idx == -1:
|
|
393
|
+
# Fallback: cari eyJ manapun
|
|
394
|
+
idx = token.find("eyJ")
|
|
395
|
+
if idx == -1: return "N/A"
|
|
396
|
+
jwt = token[idx:]
|
|
397
|
+
d1 = jwt.find(".")
|
|
398
|
+
if d1 == -1: return "N/A"
|
|
399
|
+
d2 = jwt.find(".", d1+1)
|
|
400
|
+
if d2 == -1: return "N/A"
|
|
401
|
+
# Ambil payload
|
|
402
|
+
pl = jwt[d1+1:d2]
|
|
403
|
+
pl += "=" * ((4-len(pl)%4)%4)
|
|
404
|
+
d = json.loads(base64.urlsafe_b64decode(pl).decode())
|
|
405
|
+
for k in ('account_id','external_id','user_id','uid'):
|
|
406
|
+
if k in d and d[k]: return str(d[k])
|
|
407
|
+
except: pass
|
|
408
|
+
return "N/A"
|
|
409
|
+
|
|
410
|
+
# ══════════════════════════════════════════════════════════════════
|
|
411
|
+
# USER AGENTS
|
|
412
|
+
# ══════════════════════════════════════════════════════════════════
|
|
413
|
+
_UA_LIST = [
|
|
414
|
+
"GarenaMSDK/4.0.39(SM-A325M;Android 13;en;HK;)",
|
|
415
|
+
"GarenaMSDK/4.0.39(Poco F3;Android 12;en;SG;)",
|
|
416
|
+
"GarenaMSDK/4.0.39(Redmi Note 10;Android 11;en;ID;)",
|
|
417
|
+
"GarenaMSDK/4.0.39(Samsung A52;Android 12;en;MY;)",
|
|
418
|
+
"GarenaMSDK/4.0.39(Oppo Reno5;Android 11;en;PH;)",
|
|
419
|
+
"GarenaMSDK/4.0.19P8(ASUS_Z01QD ;Android 12;en;US;)",
|
|
420
|
+
"GarenaMSDK/4.0.39(CPH2359;Android 12;en;US;)",
|
|
421
|
+
"GarenaMSDK/4.0.39(NE2213;Android 13;en;EU;)",
|
|
422
|
+
"Dalvik/2.1.0 (Linux; U; Android 9; ASUS_I005DA Build/PI)",
|
|
423
|
+
"Dalvik/2.1.0 (Linux; U; Android 12; M2101K7AG Build/SKQ1.210908.001)",
|
|
424
|
+
]
|
|
425
|
+
_ua_idx=0; _ua_lock=threading.Lock()
|
|
426
|
+
|
|
427
|
+
def _next_ua():
|
|
428
|
+
global _ua_idx
|
|
429
|
+
with _ua_lock:
|
|
430
|
+
ua=_UA_LIST[_ua_idx%len(_UA_LIST)]; _ua_idx+=1
|
|
431
|
+
return ua
|
|
432
|
+
|
|
433
|
+
def gen_name(): return 'N4taza'+''.join(random.choice(string.ascii_uppercase+string.digits) for _ in range(6))
|
|
434
|
+
def gen_pw(n=9): return f"N4TAZA-{''.join(random.choice(string.ascii_uppercase+string.digits) for _ in range(n))}-VVIP"
|
|
435
|
+
|
|
436
|
+
# ══════════════════════════════════════════════════════════════════
|
|
437
|
+
# API — fix N/A dengan retry & fallback
|
|
438
|
+
# ══════════════════════════════════════════════════════════════════
|
|
439
|
+
_REG_URL = "https://100067.connect.garena.com/api/v2/oauth/guest:register"
|
|
440
|
+
_TOK_URL = "https://100067.connect.garena.com/api/v2/oauth/guest/token:grant"
|
|
441
|
+
|
|
442
|
+
def _register(pw):
|
|
443
|
+
"""
|
|
444
|
+
Register via v2 API dengan HMAC signature.
|
|
445
|
+
Retry 4x dengan delay 0.3s.
|
|
446
|
+
"""
|
|
447
|
+
body_json = json.dumps({"app_id":100067,"client_type":2,"password":pw,"source":2},
|
|
448
|
+
separators=(",",":"))
|
|
449
|
+
sig = hmac.new(key, body_json.encode(), hashlib.sha256).hexdigest()
|
|
450
|
+
hdrs = {"User-Agent":_next_ua(),
|
|
451
|
+
"Authorization":f"Signature {sig}",
|
|
452
|
+
"Content-Type":"application/json; charset=utf-8",
|
|
453
|
+
"Accept":"application/json",
|
|
454
|
+
"Connection":"Keep-Alive",
|
|
455
|
+
"Host":"100067.connect.garena.com"}
|
|
456
|
+
for _ in range(4):
|
|
457
|
+
try:
|
|
458
|
+
r=_get_session().post(_REG_URL,headers=hdrs,data=body_json,timeout=12)
|
|
459
|
+
if r.status_code in (403,429): time.sleep(1); continue
|
|
460
|
+
b=r.json(); d=b.get("data",b)
|
|
461
|
+
uid=d.get("uid") or b.get("uid")
|
|
462
|
+
if uid: return uid
|
|
463
|
+
except: pass
|
|
464
|
+
time.sleep(0.3)
|
|
465
|
+
return None
|
|
466
|
+
|
|
467
|
+
def _get_token(uid,pw):
|
|
468
|
+
"""
|
|
469
|
+
Grant token via v2 API.
|
|
470
|
+
Fix: key harus str untuk client_secret, bukan bytes.
|
|
471
|
+
"""
|
|
472
|
+
client_secret = key.decode("ascii")
|
|
473
|
+
body_json = json.dumps({"client_id":100067,"client_secret":client_secret,
|
|
474
|
+
"client_type":2,"password":pw,
|
|
475
|
+
"response_type":"token","uid":uid},
|
|
476
|
+
separators=(",",":"))
|
|
477
|
+
sig = hmac.new(key, body_json.encode(), hashlib.sha256).hexdigest()
|
|
478
|
+
hdrs = {"User-Agent":_next_ua(),
|
|
479
|
+
"Authorization":f"Signature {sig}",
|
|
480
|
+
"Content-Type":"application/json; charset=utf-8",
|
|
481
|
+
"Accept":"application/json",
|
|
482
|
+
"Connection":"Keep-Alive",
|
|
483
|
+
"Host":"100067.connect.garena.com"}
|
|
484
|
+
for _ in range(3):
|
|
485
|
+
try:
|
|
486
|
+
r=_get_session().post(_TOK_URL,headers=hdrs,data=body_json,timeout=12)
|
|
487
|
+
if r.status_code in (403,429): time.sleep(1); continue
|
|
488
|
+
b=r.json(); d=b.get("data",b)
|
|
489
|
+
if "open_id" in d:
|
|
490
|
+
oi=d["open_id"]; at=d["access_token"]
|
|
491
|
+
res=encode_oid(oi)
|
|
492
|
+
field=codecs.decode(to_ue(res["field_14"]),"unicode_escape").encode("latin1")
|
|
493
|
+
return oi,at,field
|
|
494
|
+
except: pass
|
|
495
|
+
time.sleep(0.3)
|
|
496
|
+
return None,None,None
|
|
497
|
+
|
|
498
|
+
_LOGIN_PL=(
|
|
499
|
+
b'\x1a\x132025-08-30 05:19:21"\tfree fire(\x01:\x081.114.13B2Android OS 9 / API-28'
|
|
500
|
+
b' (PI/rel.cjw.20220518.114133)J\x08HandheldR\nATM MobilsZ\x04WIFI`\xb6\nh\xee\x05'
|
|
501
|
+
b'r\x03300z\x1fARMv7 VFPv3 NEON VMH | 2400 | 2\x80\x01\xc9\x0f\x8a\x01\x0fAdreno (TM) 640'
|
|
502
|
+
b'\x92\x01\rOpenGL ES 3.2\x9a\x01+Google|dfa4ab4b-9dc4-454e-8065-e70c733fa53f'
|
|
503
|
+
b'\xa2\x01\x0e105.235.139.91\xaa\x01\x02'
|
|
504
|
+
)
|
|
505
|
+
_LOGIN_PL2=(
|
|
506
|
+
b'\xb2\x01 1d8ec0240ede109973f3321b9354b44d'
|
|
507
|
+
b'\xba\x01\x014\xc2\x01\x08Handheld\xca\x01\x10Asus ASUS_I005DA'
|
|
508
|
+
b'\xea\x01@afcfbf13334be42036e4f742c80b956344bed760ac91b3aff9b607a610ab4390'
|
|
509
|
+
b'\xf0\x01\x01\xca\x02\nATM Mobils\xd2\x02\x04WIFI'
|
|
510
|
+
b'\xca\x03 7428b253defc164018c604a1ebbfebdf'
|
|
511
|
+
b'\xe0\x03\xa8\x81\x02\xe8\x03\xf6\xe5\x01\xf0\x03\xaf\x13\xf8\x03\x84\x07'
|
|
512
|
+
b'\x80\x04\xe7\xf0\x01\x88\x04\xa8\x81\x02\x90\x04\xe7\xf0\x01\x98\x04\xa8\x81\x02'
|
|
513
|
+
b'\xc8\x04\x01\xd2\x04=/data/app/com.dts.freefireth-PdeDnOilCSFn37p1AH_FLg==/lib/arm'
|
|
514
|
+
b'\xe0\x04\x01\xea\x04_2087f61c19f57f2af4e7feff0b24d9d9'
|
|
515
|
+
b'|/data/app/com.dts.freefireth-PdeDnOilCSFn37p1AH_FLg==/base.apk'
|
|
516
|
+
b'\xf0\x04\x03\xf8\x04\x01\x8a\x05\x0232\x9a\x05\n2019118692'
|
|
517
|
+
b'\xb2\x05\tOpenGLES2\xb8\x05\xff\x7f\xc0\x05\x04\xe0\x05\xf3F'
|
|
518
|
+
b'\xea\x05\x07android'
|
|
519
|
+
b'\xf2\x05pKqsHT5ZLWrYljNb5Vqh//yFRlaPHSO9NWSQsVvOmdhEEn7W+VHNUK+Q+fduA3pt'
|
|
520
|
+
b'NrGB0Ll0LRz3WW0jOwesLj6aiU7sZ40p8BfUE/FI/jzSTwRe2'
|
|
521
|
+
b'\xf8\x05\xfb\xe4\x06\x88\x06\x01\x90\x06\x01\x9a\x06\x014\xa2\x06\x014'
|
|
522
|
+
b'\xb2\x06"GQ@O\x00\x0e^\x00D\x06UA\x0ePM\r\x13hZ\x07T\x06\x0cm\\V\x0ejYV;\x0bU5'
|
|
523
|
+
)
|
|
524
|
+
_AT_PH = b'afcfbf13334be42036e4f742c80b956344bed760ac91b3aff9b607a610ab4390'
|
|
525
|
+
_OI_PH = b'1d8ec0240ede109973f3321b9354b44d'
|
|
526
|
+
|
|
527
|
+
def _major_register(at,oi,field,uid,pw,region):
|
|
528
|
+
name=gen_name()
|
|
529
|
+
lang=REGION_LANG.get(region.upper(),"en")
|
|
530
|
+
if region.upper() in("ME","TH"):
|
|
531
|
+
url="https://loginbp.common.ggbluefox.com/MajorRegister"; host="loginbp.common.ggbluefox.com"
|
|
532
|
+
else:
|
|
533
|
+
url="https://loginbp.ggblueshark.com/MajorRegister"; host="loginbp.ggblueshark.com"
|
|
534
|
+
pl=build_proto({1:name,2:at,3:oi,5:102000007,6:4,7:1,13:1,14:field,15:lang,16:1,17:1})
|
|
535
|
+
body=aes_enc(pl.hex())
|
|
536
|
+
try:
|
|
537
|
+
_get_session().post(url,headers={
|
|
538
|
+
"Accept-Encoding":"gzip","Authorization":"Bearer","Connection":"Keep-Alive",
|
|
539
|
+
"Content-Type":"application/x-www-form-urlencoded","Expect":"100-continue",
|
|
540
|
+
"Host":host,"ReleaseVersion":"OB53","User-Agent":_next_ua(),
|
|
541
|
+
"X-GA":"v1 1","X-Unity-Version":"2018.4."},
|
|
542
|
+
data=body,verify=False,timeout=12)
|
|
543
|
+
except: pass
|
|
544
|
+
return name
|
|
545
|
+
|
|
546
|
+
def _major_login(at,oi,region,retry=3):
|
|
547
|
+
"""
|
|
548
|
+
Fix N/A: retry 3x, parse JWT lebih robust.
|
|
549
|
+
"""
|
|
550
|
+
lang=REGION_LANG.get(region.upper(),"en")
|
|
551
|
+
if region.upper() in("ME","TH"):
|
|
552
|
+
url="https://loginbp.common.ggbluefox.com/MajorLogin"; host="loginbp.common.ggbluefox.com"
|
|
553
|
+
else:
|
|
554
|
+
url="https://loginbp.ggblueshark.com/MajorLogin"; host="loginbp.ggblueshark.com"
|
|
555
|
+
raw=_LOGIN_PL+lang.encode("ascii")+_LOGIN_PL2
|
|
556
|
+
raw=raw.replace(_AT_PH,at.encode()).replace(_OI_PH,oi.encode())
|
|
557
|
+
fp=bytes.fromhex(aes_enc_hex(raw.hex()))
|
|
558
|
+
hdrs={"Accept-Encoding":"gzip","Authorization":"Bearer","Connection":"Keep-Alive",
|
|
559
|
+
"Content-Type":"application/x-www-form-urlencoded","Expect":"100-continue",
|
|
560
|
+
"Host":host,"ReleaseVersion":"OB53","User-Agent":_next_ua(),
|
|
561
|
+
"X-GA":"v1 1","X-Unity-Version":"2018.4.11f1"}
|
|
562
|
+
for _ in range(retry):
|
|
563
|
+
try:
|
|
564
|
+
r=_get_session().post(url,headers=hdrs,data=fp,verify=False,timeout=15)
|
|
565
|
+
if r.status_code==200 and len(r.text)>10:
|
|
566
|
+
aid=decode_jwt(r.text)
|
|
567
|
+
if aid!="N/A": return aid,r.text
|
|
568
|
+
except: pass
|
|
569
|
+
time.sleep(0.5)
|
|
570
|
+
return "N/A",""
|
|
571
|
+
|
|
572
|
+
def _bind_region(jwt_token,region):
|
|
573
|
+
if region.upper() in("ME","TH"):
|
|
574
|
+
url="https://loginbp.common.ggbluefox.com/ChooseRegion"
|
|
575
|
+
else:
|
|
576
|
+
url="https://loginbp.ggblueshark.com/ChooseRegion"
|
|
577
|
+
rk="RU" if region.upper()=="CIS" else region.upper()
|
|
578
|
+
pl=bytes.fromhex(aes_enc_hex(build_proto({1:rk}).hex()))
|
|
579
|
+
try:
|
|
580
|
+
_get_session().post(url,data=pl,headers={
|
|
581
|
+
"User-Agent":_next_ua(),"Connection":"Keep-Alive","Accept-Encoding":"gzip",
|
|
582
|
+
"Content-Type":"application/x-www-form-urlencoded","Expect":"100-continue",
|
|
583
|
+
"Authorization":f"Bearer {jwt_token}",
|
|
584
|
+
"X-Unity-Version":"2018.4.11f1","X-GA":"v1 1","ReleaseVersion":"OB53"},
|
|
585
|
+
verify=False,timeout=10)
|
|
586
|
+
except: pass
|
|
587
|
+
|
|
588
|
+
def create_account(region):
|
|
589
|
+
"""
|
|
590
|
+
Full flow: register → token → major_register → major_login → bind.
|
|
591
|
+
Return dict atau None. Tidak pernah return N/A account.
|
|
592
|
+
"""
|
|
593
|
+
pw = gen_pw()
|
|
594
|
+
uid = _register(pw)
|
|
595
|
+
if not uid: return None
|
|
596
|
+
|
|
597
|
+
oi,at,field = _get_token(uid,pw)
|
|
598
|
+
if not oi: return None
|
|
599
|
+
|
|
600
|
+
name = _major_register(at,oi,field,uid,pw,region)
|
|
601
|
+
aid,jwt = _major_login(at,oi,region)
|
|
602
|
+
|
|
603
|
+
if aid=="N/A": return None # buang — worker akan coba lagi
|
|
604
|
+
|
|
605
|
+
if jwt and region.upper()!="BR":
|
|
606
|
+
threading.Thread(target=_bind_region,args=(jwt,region),daemon=True).start()
|
|
607
|
+
|
|
608
|
+
return {"uid":uid,"password":pw,"name":name,
|
|
609
|
+
"account_id":aid,"region":region,"status":"success"}
|
|
610
|
+
|
|
611
|
+
# ══════════════════════════════════════════════════════════════════
|
|
612
|
+
# OUTPUT
|
|
613
|
+
# ══════════════════════════════════════════════════════════════════
|
|
614
|
+
def add_output(result,region):
|
|
615
|
+
global success_count,_last_success,last_progress_time,last_progress_count
|
|
616
|
+
|
|
617
|
+
uid = result["uid"]; pw = result["password"]
|
|
618
|
+
name = result["name"]; aid = result["account_id"]
|
|
619
|
+
tier = calculate_tier(aid)
|
|
620
|
+
te = TIER_EMOJIS.get(tier,"🍀")
|
|
621
|
+
tc = TIER_COLORS.get(tier,Fore.GREEN)
|
|
622
|
+
ts = datetime.now().strftime('%H:%M:%S')
|
|
623
|
+
|
|
624
|
+
with tier_lock: tier_stats[tier]=tier_stats.get(tier,0)+1
|
|
625
|
+
|
|
626
|
+
success_count+=1; cur=success_count
|
|
627
|
+
with stuck_lock: _last_success=time.time()
|
|
628
|
+
|
|
629
|
+
entry={"uid":uid,"password":pw,"account_id":aid,"name":name,
|
|
630
|
+
"region":region,"tier":tier,
|
|
631
|
+
"created_at":datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
|
|
632
|
+
save_by_tier(entry,tier,region)
|
|
633
|
+
|
|
634
|
+
with print_lock:
|
|
635
|
+
print(f"[{ts}] {green}✅{W} {cur} | {tc}ID:{aid} ({te}){W} | {uid} | {pw}")
|
|
636
|
+
|
|
637
|
+
if cur%100==0 and cur>0:
|
|
638
|
+
now = time.time()
|
|
639
|
+
el_total = now-start_time_progress
|
|
640
|
+
rate = cur/el_total if el_total>0 else 0
|
|
641
|
+
el_100 = now-last_progress_time if last_progress_count>0 else el_total
|
|
642
|
+
total_s = f"/{total_accounts}" if total_accounts>0 else ""
|
|
643
|
+
with tier_lock: ts2=dict(tier_stats)
|
|
644
|
+
print(f"\n{cyan}{bold}▶ PROGRESS {cur}{total_s} | "
|
|
645
|
+
f"+100: {format_time(el_100)} | total: {format_time(el_total)} | "
|
|
646
|
+
f"{rate:.2f}/detik{W}")
|
|
647
|
+
print(f" {green}🍀:{ts2['NORMAL']}{W} "
|
|
648
|
+
f"{yellow}😬:{ts2['LOW']}{W} "
|
|
649
|
+
f"{cyan}🤩:{ts2['MEDIUM']}{W} "
|
|
650
|
+
f"{purpel}☠️:{ts2['HIGH']}{W} "
|
|
651
|
+
f"{red}❤️🔥:{ts2['LEGEND']}{W}\n")
|
|
652
|
+
last_progress_time = now
|
|
653
|
+
last_progress_count = cur
|
|
654
|
+
|
|
655
|
+
# ══════════════════════════════════════════════════════════════════
|
|
656
|
+
# WORKER — loop sampai target, N/A dibuang & retry otomatis
|
|
657
|
+
# ══════════════════════════════════════════════════════════════════
|
|
658
|
+
def worker(region):
|
|
659
|
+
global success_count
|
|
660
|
+
while True:
|
|
661
|
+
if not _pause_event.is_set(): _pause_event.wait()
|
|
662
|
+
with cnt_lock:
|
|
663
|
+
if total_accounts>0 and success_count>=total_accounts: return
|
|
664
|
+
|
|
665
|
+
result = None
|
|
666
|
+
try: result=create_account(region)
|
|
667
|
+
except: pass
|
|
668
|
+
|
|
669
|
+
if not result: continue # gagal/N/A → coba lagi
|
|
670
|
+
|
|
671
|
+
with cnt_lock:
|
|
672
|
+
if total_accounts>0 and success_count>=total_accounts: return
|
|
673
|
+
|
|
674
|
+
add_output(result,region)
|
|
675
|
+
|
|
676
|
+
with cnt_lock:
|
|
677
|
+
if total_accounts>0 and success_count>=total_accounts: return
|
|
678
|
+
|
|
679
|
+
# ══════════════════════════════════════════════════════════════════
|
|
680
|
+
# MAIN
|
|
681
|
+
# ══════════════════════════════════════════════════════════════════
|
|
682
|
+
if __name__=="__main__":
|
|
683
|
+
while True:
|
|
684
|
+
os.system('cls' if os.name=='nt' else 'clear')
|
|
685
|
+
print(f"{render('x6ataza',colors=['white','red'],align='center')}\n\n")
|
|
686
|
+
|
|
687
|
+
while True:
|
|
688
|
+
region=input(f" {Style.NORMAL}{Fore.RESET}- Enter Region "
|
|
689
|
+
f"(ME,IND,ID,VN,TH,BR..) >>> {Fore.WHITE}").upper().strip()
|
|
690
|
+
if region in VALID_REGIONS: break
|
|
691
|
+
print(f"{red}[ ! ] Region tidak valid.{W}")
|
|
692
|
+
|
|
693
|
+
while True:
|
|
694
|
+
try:
|
|
695
|
+
jml=input(f" {Style.NORMAL}{Fore.RESET}- Jumlah ID (0=unlimited) >>> {Fore.WHITE}").strip()
|
|
696
|
+
if jml=="0" or (jml.isdigit() and int(jml)>=0):
|
|
697
|
+
total_accounts=int(jml); break
|
|
698
|
+
except: pass
|
|
699
|
+
|
|
700
|
+
try:
|
|
701
|
+
wk=input(f" {Style.NORMAL}{Fore.RESET}- Workers [{num_workers}] >>> {Fore.WHITE}").strip()
|
|
702
|
+
if wk.isdigit() and int(wk)>0: num_workers=min(int(wk),60)
|
|
703
|
+
except: pass
|
|
704
|
+
|
|
705
|
+
# Reset
|
|
706
|
+
success_count=0; _stuck_running=True
|
|
707
|
+
last_progress_time=time.time(); last_progress_count=0
|
|
708
|
+
for k in tier_stats: tier_stats[k]=0
|
|
709
|
+
cached_tf(region)
|
|
710
|
+
|
|
711
|
+
print()
|
|
712
|
+
_last_success=time.time()
|
|
713
|
+
start_time_progress=time.time()
|
|
714
|
+
|
|
715
|
+
try:
|
|
716
|
+
with ThreadPoolExecutor(max_workers=num_workers) as ex:
|
|
717
|
+
futures=[ex.submit(worker,region) for _ in range(num_workers)]
|
|
718
|
+
for f in futures: f.result()
|
|
719
|
+
except KeyboardInterrupt:
|
|
720
|
+
print(f"\n{yellow}[ ! ] Dihentikan.{W}")
|
|
721
|
+
|
|
722
|
+
_stuck_running=False
|
|
723
|
+
elapsed=time.time()-start_time_progress
|
|
724
|
+
spd=success_count/elapsed if elapsed>0 else 0
|
|
725
|
+
tf=cached_tf(region)
|
|
726
|
+
|
|
727
|
+
print(f"\n{lg}{bold}✓ Selesai! {success_count}"
|
|
728
|
+
f"{'/' + str(total_accounts) if total_accounts>0 else ''} akun{W}")
|
|
729
|
+
print(f"{cyan}{bold}⏱ Waktu : {format_time(elapsed)} | {spd:.2f} akun/detik{W}")
|
|
730
|
+
print(f"{lg}{bold}📁 {BASE_DIR}/{region}/{W}")
|
|
731
|
+
print(f"\n{cyan}[ i ] Final Stats:{W}")
|
|
732
|
+
print(f" {green}🍀 NORMAL : {tier_stats['NORMAL']}{W}")
|
|
733
|
+
print(f" {yellow}😬 LOW : {tier_stats['LOW']}{W}")
|
|
734
|
+
print(f" {cyan}🤩 MEDIUM : {tier_stats['MEDIUM']}{W}")
|
|
735
|
+
print(f" {purpel}☠️ HIGH : {tier_stats['HIGH']}{W}")
|
|
736
|
+
print(f" {red}❤️🔥 LEGEND : {tier_stats['LEGEND']}{W}")
|
|
737
|
+
|
|
738
|
+
try:
|
|
739
|
+
input(f"\n{Style.NORMAL}{Fore.RESET} tekan enter untuk generate ulang.. {Fore.RESET}")
|
|
740
|
+
except (KeyboardInterrupt,EOFError):
|
|
741
|
+
if _TOR_PROC:
|
|
742
|
+
try: _TOR_PROC.terminate()
|
|
743
|
+
except: pass
|
|
744
|
+
break
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
glitxh
|