natazx 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.
- natazx-0.1.0/PKG-INFO +6 -0
- natazx-0.1.0/pyproject.toml +17 -0
- natazx-0.1.0/setup.cfg +4 -0
- natazx-0.1.0/src/natazx/__init__.py +1 -0
- natazx-0.1.0/src/natazx/__main__.py +4 -0
- natazx-0.1.0/src/natazx/natazx.py +749 -0
- natazx-0.1.0/src/natazx.egg-info/PKG-INFO +6 -0
- natazx-0.1.0/src/natazx.egg-info/SOURCES.txt +9 -0
- natazx-0.1.0/src/natazx.egg-info/dependency_links.txt +1 -0
- natazx-0.1.0/src/natazx.egg-info/entry_points.txt +2 -0
- natazx-0.1.0/src/natazx.egg-info/top_level.txt +1 -0
natazx-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "natazx"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Project natazx by septianhdnatta"
|
|
9
|
+
license = {text = "MIT"}
|
|
10
|
+
authors = [{name = "septianhdnatta", email = "septianhdnatta@example.com"}]
|
|
11
|
+
dependencies = []
|
|
12
|
+
|
|
13
|
+
[tool.setuptools.packages.find]
|
|
14
|
+
where = ["src"]
|
|
15
|
+
|
|
16
|
+
[project.scripts]
|
|
17
|
+
natazx = "natazx:main"
|
natazx-0.1.0/setup.cfg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .natazx import main
|
|
@@ -0,0 +1,749 @@
|
|
|
1
|
+
"""
|
|
2
|
+
GLITXH-VIP GENERATOR V2.0 ULTRA
|
|
3
|
+
Credits : glitxh (tele : @glitxh4ff)
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import sys, os, hashlib, hmac, zlib, random, time, threading, platform, json
|
|
7
|
+
import urllib.request
|
|
8
|
+
import urllib.error
|
|
9
|
+
|
|
10
|
+
DEVICE_CHECK_URL = "https://raw.githubusercontent.com/septianhdnatta/idd/refs/heads/main/device.json"
|
|
11
|
+
|
|
12
|
+
def _get_device_fingerprint():
|
|
13
|
+
fp = []
|
|
14
|
+
|
|
15
|
+
try:
|
|
16
|
+
import subprocess
|
|
17
|
+
serial = subprocess.check_output(['getprop', 'ro.serialno'], text=True).strip()
|
|
18
|
+
if not serial or serial == 'unknown':
|
|
19
|
+
serial = os.environ.get('ANDROID_SERIAL', '')
|
|
20
|
+
fp.append(serial)
|
|
21
|
+
except:
|
|
22
|
+
fp.append('')
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
model = platform.machine()
|
|
26
|
+
fp.append(model)
|
|
27
|
+
except:
|
|
28
|
+
fp.append('')
|
|
29
|
+
|
|
30
|
+
try:
|
|
31
|
+
brand = platform.system()
|
|
32
|
+
fp.append(brand)
|
|
33
|
+
except:
|
|
34
|
+
fp.append('')
|
|
35
|
+
|
|
36
|
+
try:
|
|
37
|
+
with open('/system/build.prop', 'r') as f:
|
|
38
|
+
for line in f:
|
|
39
|
+
if 'ro.build.fingerprint' in line:
|
|
40
|
+
fp.append(line.split('=')[1].strip())
|
|
41
|
+
break
|
|
42
|
+
except:
|
|
43
|
+
fp.append('')
|
|
44
|
+
|
|
45
|
+
try:
|
|
46
|
+
import subprocess
|
|
47
|
+
man = subprocess.check_output(['getprop', 'ro.product.manufacturer'], text=True).strip()
|
|
48
|
+
fp.append(man)
|
|
49
|
+
except:
|
|
50
|
+
fp.append('')
|
|
51
|
+
|
|
52
|
+
try:
|
|
53
|
+
hw = platform.processor()
|
|
54
|
+
fp.append(hw)
|
|
55
|
+
except:
|
|
56
|
+
fp.append('')
|
|
57
|
+
|
|
58
|
+
try:
|
|
59
|
+
tz = time.tzname[0] if time.tzname else ''
|
|
60
|
+
fp.append(tz)
|
|
61
|
+
except:
|
|
62
|
+
fp.append('')
|
|
63
|
+
|
|
64
|
+
try:
|
|
65
|
+
uid = str(os.getuid())
|
|
66
|
+
fp.append(uid)
|
|
67
|
+
except:
|
|
68
|
+
fp.append('')
|
|
69
|
+
|
|
70
|
+
raw = '|'.join(fp).encode()
|
|
71
|
+
|
|
72
|
+
h1 = hashlib.sha3_512(raw).digest()
|
|
73
|
+
h2 = hashlib.blake2b(h1).digest()
|
|
74
|
+
final = hashlib.sha256(h1 + h2).hexdigest()
|
|
75
|
+
|
|
76
|
+
return '-'.join([final[i:i+4] for i in range(0, 32, 4)]).upper()
|
|
77
|
+
|
|
78
|
+
_DEVICE_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '.deviceid')
|
|
79
|
+
_XOR_KEY = bytes([0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0])
|
|
80
|
+
|
|
81
|
+
def _xor_encrypt(data):
|
|
82
|
+
return bytes([data[i] ^ _XOR_KEY[i % len(_XOR_KEY)] for i in range(len(data))])
|
|
83
|
+
|
|
84
|
+
def _save_device_id(fingerprint, use_count=0):
|
|
85
|
+
data = {
|
|
86
|
+
'fp': fingerprint,
|
|
87
|
+
'use': use_count,
|
|
88
|
+
'ts': int(time.time())
|
|
89
|
+
}
|
|
90
|
+
json_str = json.dumps(data)
|
|
91
|
+
compressed = zlib.compress(json_str.encode())
|
|
92
|
+
encrypted = _xor_encrypt(compressed)
|
|
93
|
+
import base64
|
|
94
|
+
encoded = base64.b64encode(encrypted).decode()
|
|
95
|
+
sig = hmac.new(_XOR_KEY, encrypted, hashlib.blake2b).hexdigest()
|
|
96
|
+
with open(_DEVICE_FILE, 'w') as f:
|
|
97
|
+
f.write(encoded + '|' + sig)
|
|
98
|
+
|
|
99
|
+
def _load_device_id():
|
|
100
|
+
if not os.path.exists(_DEVICE_FILE):
|
|
101
|
+
return None
|
|
102
|
+
try:
|
|
103
|
+
import base64
|
|
104
|
+
with open(_DEVICE_FILE, 'r') as f:
|
|
105
|
+
content = f.read().strip()
|
|
106
|
+
if '|' not in content:
|
|
107
|
+
return None
|
|
108
|
+
encoded, sig = content.split('|')
|
|
109
|
+
encrypted = base64.b64decode(encoded.encode())
|
|
110
|
+
expected = hmac.new(_XOR_KEY, encrypted, hashlib.blake2b).hexdigest()
|
|
111
|
+
if not hmac.compare_digest(sig, expected):
|
|
112
|
+
return None
|
|
113
|
+
decrypted = _xor_encrypt(encrypted)
|
|
114
|
+
decompressed = zlib.decompress(decrypted)
|
|
115
|
+
data = json.loads(decompressed.decode())
|
|
116
|
+
return data
|
|
117
|
+
except:
|
|
118
|
+
return None
|
|
119
|
+
|
|
120
|
+
def _verify_online():
|
|
121
|
+
try:
|
|
122
|
+
fp = _get_device_fingerprint()
|
|
123
|
+
|
|
124
|
+
print(f"\nHello user. We will check your device ID status! Please wait a moment...")
|
|
125
|
+
|
|
126
|
+
req = urllib.request.Request(DEVICE_CHECK_URL, headers={'User-Agent': 'Mozilla/5.0'})
|
|
127
|
+
with urllib.request.urlopen(req, timeout=10) as response:
|
|
128
|
+
content = response.read().decode()
|
|
129
|
+
data = json.loads(content)
|
|
130
|
+
|
|
131
|
+
if isinstance(data, list):
|
|
132
|
+
allowed_devices = [str(device).strip() for device in data if device]
|
|
133
|
+
else:
|
|
134
|
+
print(f"Format JSON salah! Diharapkan array, mendapat {type(data)}")
|
|
135
|
+
return False
|
|
136
|
+
|
|
137
|
+
if fp in allowed_devices:
|
|
138
|
+
return True
|
|
139
|
+
else:
|
|
140
|
+
print("\nHello user. Welcome to the glitxh script. We believe you haven't verified your device ID. Please contact the admin and send your device ID to them.")
|
|
141
|
+
print(f"Device ID: {fp}")
|
|
142
|
+
print("Send it to Telegram at t.me/natazaxz to use the script.")
|
|
143
|
+
return False
|
|
144
|
+
|
|
145
|
+
except urllib.error.URLError as e:
|
|
146
|
+
print("\nGAGAL KONEKSI KE SERVER")
|
|
147
|
+
print(f"Error: {str(e)}")
|
|
148
|
+
print("Pastikan koneksi internet Anda aktif.")
|
|
149
|
+
return False
|
|
150
|
+
except json.JSONDecodeError as e:
|
|
151
|
+
print("\nERROR FORMAT JSON")
|
|
152
|
+
print(f"Format JSON tidak valid: {str(e)}")
|
|
153
|
+
return False
|
|
154
|
+
except Exception as e:
|
|
155
|
+
print("\nVERIFIKASI GAGAL")
|
|
156
|
+
print(f"Error: {str(e)}")
|
|
157
|
+
return False
|
|
158
|
+
|
|
159
|
+
def _run_protection():
|
|
160
|
+
os.system('cls' if os.name == 'nt' else 'clear')
|
|
161
|
+
|
|
162
|
+
if not _verify_online():
|
|
163
|
+
print("\n")
|
|
164
|
+
time.sleep(3)
|
|
165
|
+
sys.exit(1)
|
|
166
|
+
|
|
167
|
+
fingerprint = _get_device_fingerprint()
|
|
168
|
+
stored = _load_device_id()
|
|
169
|
+
if stored is None:
|
|
170
|
+
_save_device_id(fingerprint, 1)
|
|
171
|
+
|
|
172
|
+
print("\nWelcome back sir!..\n")
|
|
173
|
+
time.sleep(1)
|
|
174
|
+
|
|
175
|
+
_run_protection()
|
|
176
|
+
|
|
177
|
+
# ============================================================
|
|
178
|
+
# LANJUTAN SCRIPT ASLI
|
|
179
|
+
# ============================================================
|
|
180
|
+
|
|
181
|
+
import subprocess, base64
|
|
182
|
+
|
|
183
|
+
def _pip(p, m=None):
|
|
184
|
+
try: __import__(m or p.replace("-","_"))
|
|
185
|
+
except ImportError:
|
|
186
|
+
subprocess.check_call([sys.executable,"-m","pip","install",p,"-q"],
|
|
187
|
+
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
188
|
+
|
|
189
|
+
for _p,_m in [("colorama",None),("requests",None),("pycryptodome","Crypto"),
|
|
190
|
+
("urllib3",None),("cfonts",None)]:
|
|
191
|
+
_pip(_p,_m)
|
|
192
|
+
|
|
193
|
+
import time, threading, socket, re, json, hmac, hashlib
|
|
194
|
+
import string, random, codecs, base64, itertools
|
|
195
|
+
from datetime import datetime
|
|
196
|
+
from concurrent.futures import ThreadPoolExecutor, wait, FIRST_COMPLETED
|
|
197
|
+
from queue import Queue, Empty
|
|
198
|
+
|
|
199
|
+
import requests, urllib3
|
|
200
|
+
from Crypto.Cipher import AES
|
|
201
|
+
from Crypto.Util.Padding import pad
|
|
202
|
+
from colorama import Fore, Style, init
|
|
203
|
+
from cfonts import render
|
|
204
|
+
|
|
205
|
+
init(autoreset=True)
|
|
206
|
+
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
|
207
|
+
|
|
208
|
+
R=Fore.RED; G=Fore.GREEN; Y=Fore.YELLOW; C=Fore.CYAN
|
|
209
|
+
M=Fore.MAGENTA; LG=Fore.LIGHTGREEN_EX; W=Fore.RESET; B=Style.BRIGHT
|
|
210
|
+
|
|
211
|
+
def fmt(sec):
|
|
212
|
+
sec=max(0,int(sec))
|
|
213
|
+
d,sec=divmod(sec,86400); h,sec=divmod(sec,3600); m,s=divmod(sec,60)
|
|
214
|
+
p=[]
|
|
215
|
+
if d: p.append(f"{d}hari")
|
|
216
|
+
if h: p.append(f"{h}jam")
|
|
217
|
+
if m: p.append(f"{m}menit")
|
|
218
|
+
if s or not p: p.append(f"{s}detik")
|
|
219
|
+
return " ".join(p)
|
|
220
|
+
|
|
221
|
+
VALID = {"ME","IND","ID","VN","TH","BD","PK","TW","EU","CIS","NA","SAC","BR","SG"}
|
|
222
|
+
LANG = {"ME":"ar","IND":"hi","ID":"id","VN":"vi","TH":"th","BD":"bn",
|
|
223
|
+
"PK":"ur","TW":"zh","EU":"en","CIS":"ru","NA":"en","SAC":"es","BR":"pt","SG":"en"}
|
|
224
|
+
|
|
225
|
+
TIER_E = {"NORMAL":"🍀","LOW":"😬","MEDIUM":"🤩","HIGH":"☠️","LEGEND":"❤️🔥"}
|
|
226
|
+
TIER_C = {"LEGEND":R+B,"HIGH":M+B,"MEDIUM":C+B,"LOW":Y,"NORMAL":G}
|
|
227
|
+
|
|
228
|
+
_AK = bytes([89,103,38,116,99,37,68,69,117,104,54,37,90,99,94,56])
|
|
229
|
+
_AI = bytes([54,111,121,90,68,114,50,50,69,51,121,99,104,106,77,37])
|
|
230
|
+
HEX_KEY = "32656534343831396539623435393838343531343130363762323831363231383734643064356437616639643866376530306331653534373135623764316533"
|
|
231
|
+
KEY = bytes.fromhex(HEX_KEY)
|
|
232
|
+
|
|
233
|
+
def aes_bytes(h: str) -> bytes:
|
|
234
|
+
return AES.new(_AK,AES.MODE_CBC,_AI).encrypt(pad(bytes.fromhex(h),16))
|
|
235
|
+
|
|
236
|
+
def aes_hex(h: str) -> str:
|
|
237
|
+
return aes_bytes(h).hex()
|
|
238
|
+
|
|
239
|
+
def ev(n):
|
|
240
|
+
r=[]
|
|
241
|
+
while True:
|
|
242
|
+
b=n&0x7F; n>>=7
|
|
243
|
+
if n: b|=0x80
|
|
244
|
+
r.append(b)
|
|
245
|
+
if not n: break
|
|
246
|
+
return bytes(r)
|
|
247
|
+
|
|
248
|
+
def pb(fields):
|
|
249
|
+
o=bytearray()
|
|
250
|
+
for f,v in fields.items():
|
|
251
|
+
if isinstance(v,dict): o+=ev((f<<3)|2)+ev(len(p:=pb(v)))+p
|
|
252
|
+
elif isinstance(v,int): o+=ev((f<<3)|0)+ev(v)
|
|
253
|
+
else:
|
|
254
|
+
p=v.encode() if isinstance(v,str) else v
|
|
255
|
+
o+=ev((f<<3)|2)+ev(len(p))+p
|
|
256
|
+
return bytes(o)
|
|
257
|
+
|
|
258
|
+
def enc_oid(s):
|
|
259
|
+
k=[0x30,0x30,0x30,0x32,0x30,0x31,0x37,0x30,0x30,0x30,0x30,0x30,0x32,0x30,0x31,0x37,
|
|
260
|
+
0x30,0x30,0x30,0x30,0x30,0x32,0x30,0x31,0x37,0x30,0x30,0x30,0x30,0x30,0x32,0x30]
|
|
261
|
+
return {"open_id":s,"field_14":"".join(chr(ord(c)^k[i%32]) for i,c in enumerate(s))}
|
|
262
|
+
|
|
263
|
+
def ue(s): return "".join(c if 32<=ord(c)<=126 else f"\\u{ord(c):04x}" for c in s)
|
|
264
|
+
|
|
265
|
+
def jwt_id(t):
|
|
266
|
+
try:
|
|
267
|
+
p=t.split(".")[1]; p+="="*((4-len(p)%4)%4)
|
|
268
|
+
d=json.loads(base64.urlsafe_b64decode(p))
|
|
269
|
+
for k in("account_id","external_id","user_id","uid"):
|
|
270
|
+
if d.get(k): return str(d[k])
|
|
271
|
+
except: pass
|
|
272
|
+
return "N/A"
|
|
273
|
+
|
|
274
|
+
def decode_resp(text):
|
|
275
|
+
PREFIX="eyJhbGciOiJIUzI1NiIsInN2ciI6IjEiLCJ0eXAiOiJKV1QifQ"
|
|
276
|
+
for start_str in (PREFIX,"eyJ"):
|
|
277
|
+
i=text.find(start_str)
|
|
278
|
+
if i==-1: continue
|
|
279
|
+
t=text[i:]
|
|
280
|
+
d1=t.find("."); d2=t.find(".",d1+1) if d1!=-1 else -1
|
|
281
|
+
if d2==-1: continue
|
|
282
|
+
aid=jwt_id(t[:d2+44])
|
|
283
|
+
if aid!="N/A": return aid
|
|
284
|
+
return "N/A"
|
|
285
|
+
|
|
286
|
+
_TOR_PROC = None
|
|
287
|
+
_TOR_READY = False
|
|
288
|
+
_TOR_REN = False
|
|
289
|
+
_TOR_LK = threading.Lock()
|
|
290
|
+
|
|
291
|
+
def _tor_setup():
|
|
292
|
+
global _TOR_PROC, _TOR_READY
|
|
293
|
+
for p in ['/data/data/com.termux/files/usr/etc/resolv.conf','/etc/resolv.conf']:
|
|
294
|
+
try:
|
|
295
|
+
os.makedirs(os.path.dirname(p),exist_ok=True)
|
|
296
|
+
open(p,'w').write("nameserver 1.1.1.1\nnameserver 1.0.0.1\noptions rotate timeout:1 attempts:1\n")
|
|
297
|
+
break
|
|
298
|
+
except: pass
|
|
299
|
+
try: subprocess.run(['pkill','-9','tor'],capture_output=True); time.sleep(1)
|
|
300
|
+
except: pass
|
|
301
|
+
rc=("SocksPort 127.0.0.1:9050\nControlPort 127.0.0.1:9051\nCookieAuthentication 0\n"
|
|
302
|
+
"MaxCircuitDirtiness 8\nUseEntryGuards 0\nNumEntryGuards 8\nSafeLogging 0\n"
|
|
303
|
+
"Log notice stdout\nClientUseIPv4 1\nCircuitBuildTimeout 8\n"
|
|
304
|
+
"LearnCircuitBuildTimeout 0\nMaxOnionsPending 2048\n")
|
|
305
|
+
tp='/tmp/torrc'
|
|
306
|
+
for p in ['/data/data/com.termux/files/usr/etc/tor/torrc','/tmp/torrc']:
|
|
307
|
+
try: os.makedirs(os.path.dirname(p),exist_ok=True); open(p,'w').write(rc); tp=p; break
|
|
308
|
+
except: pass
|
|
309
|
+
_TOR_PROC=subprocess.Popen(['tor','-f',tp],stdout=subprocess.DEVNULL,
|
|
310
|
+
stderr=subprocess.DEVNULL,start_new_session=True)
|
|
311
|
+
for _ in range(25):
|
|
312
|
+
time.sleep(1)
|
|
313
|
+
if subprocess.run(['pgrep','-x','tor'],capture_output=True).returncode==0:
|
|
314
|
+
_TOR_READY=True; break
|
|
315
|
+
|
|
316
|
+
def _tor_renew():
|
|
317
|
+
global _TOR_REN
|
|
318
|
+
with _TOR_LK:
|
|
319
|
+
if _TOR_REN: return
|
|
320
|
+
_TOR_REN=True
|
|
321
|
+
try:
|
|
322
|
+
s=socket.socket(); s.settimeout(4); s.connect(('127.0.0.1',9051))
|
|
323
|
+
s.sendall(b'AUTHENTICATE ""\r\nSIGNAL NEWNYM\r\nQUIT\r\n'); s.recv(256); s.close()
|
|
324
|
+
time.sleep(1)
|
|
325
|
+
except: pass
|
|
326
|
+
finally: _TOR_REN=False
|
|
327
|
+
|
|
328
|
+
threading.Thread(target=_tor_setup,daemon=True).start()
|
|
329
|
+
time.sleep(5)
|
|
330
|
+
|
|
331
|
+
WS = [
|
|
332
|
+
"http://gajuiica:wo29gu5sa2sh@31.59.20.176:6754/",
|
|
333
|
+
"http://gajuiica:wo29gu5sa2sh@92.113.242.158:6742/",
|
|
334
|
+
"http://gajuiica:wo29gu5sa2sh@198.23.239.134:6540/",
|
|
335
|
+
"http://gajuiica:wo29gu5sa2sh@45.38.107.97:6014/",
|
|
336
|
+
"http://gajuiica:wo29gu5sa2sh@107.172.163.27:6543/",
|
|
337
|
+
]
|
|
338
|
+
_N_WS = len(WS)
|
|
339
|
+
_pidx = 0
|
|
340
|
+
_plock = threading.Lock()
|
|
341
|
+
_ustor = time.time()
|
|
342
|
+
_utor = False
|
|
343
|
+
_local = threading.local()
|
|
344
|
+
|
|
345
|
+
def _sess():
|
|
346
|
+
global _utor, _ustor, _pidx
|
|
347
|
+
now=time.time()
|
|
348
|
+
if now-_ustor>=5:
|
|
349
|
+
_utor=not _utor; _ustor=now
|
|
350
|
+
if _utor: threading.Thread(target=_tor_renew,daemon=True).start()
|
|
351
|
+
if not hasattr(_local,'n'): _local.n=0; _local.s=None
|
|
352
|
+
_local.n+=1
|
|
353
|
+
if _local.s is None or _local.n%12==0:
|
|
354
|
+
s=requests.Session(); s.verify=False
|
|
355
|
+
a=requests.adapters.HTTPAdapter(pool_connections=8,pool_maxsize=16,max_retries=0)
|
|
356
|
+
s.mount('http://',a); s.mount('https://',a)
|
|
357
|
+
if _utor and _TOR_READY:
|
|
358
|
+
s.proxies={'http':'socks5h://127.0.0.1:9050','https':'socks5h://127.0.0.1:9050'}
|
|
359
|
+
else:
|
|
360
|
+
with _plock: p=WS[_pidx%_N_WS]; _pidx+=1
|
|
361
|
+
s.proxies={'http':p,'https':p}
|
|
362
|
+
_local.s=s
|
|
363
|
+
return _local.s
|
|
364
|
+
|
|
365
|
+
UA=[
|
|
366
|
+
"GarenaMSDK/4.0.39(SM-A325M;Android 13;en;HK;)",
|
|
367
|
+
"GarenaMSDK/4.0.39(Poco F3;Android 12;en;SG;)",
|
|
368
|
+
"GarenaMSDK/4.0.39(Redmi Note 10;Android 11;en;ID;)",
|
|
369
|
+
]
|
|
370
|
+
_ui=0; _ul=threading.Lock()
|
|
371
|
+
def _ua():
|
|
372
|
+
global _ui
|
|
373
|
+
with _ul: u=UA[_ui%len(UA)]; _ui+=1; return u
|
|
374
|
+
|
|
375
|
+
def _nm(): return 'N4taza'+''.join(random.choices(string.ascii_uppercase+string.digits,k=6))
|
|
376
|
+
def _pw(): return "N4TAZA-"+''.join(random.choices(string.ascii_uppercase+string.digits,k=9))+"-VVIP"
|
|
377
|
+
|
|
378
|
+
BASE_DIR = "/sdcard/GLITXH-VIP"
|
|
379
|
+
BASE = BASE_DIR # <-- INI PERBAIKANNYA
|
|
380
|
+
|
|
381
|
+
_tf={}; _fl=threading.Lock()
|
|
382
|
+
|
|
383
|
+
def _tfiles(region):
|
|
384
|
+
ru=region.upper(); rd=os.path.join(BASE,ru)
|
|
385
|
+
for d in[rd,f"{rd}/LEGENDA",f"{rd}/High",f"{rd}/Medium",f"{rd}/Low",f"{rd}/Normal"]:
|
|
386
|
+
os.makedirs(d,exist_ok=True)
|
|
387
|
+
return {t:os.path.join(rd,sub,f"Account-{ru}.json")
|
|
388
|
+
for t,sub in[("LEGEND","LEGENDA"),("HIGH","High"),("MEDIUM","Medium"),
|
|
389
|
+
("LOW","Low"),("NORMAL","Normal")]}
|
|
390
|
+
|
|
391
|
+
def tf(r):
|
|
392
|
+
if r not in _tf: _tf[r]=_tfiles(r)
|
|
393
|
+
return _tf[r]
|
|
394
|
+
|
|
395
|
+
def save(entry,tier,region):
|
|
396
|
+
fp=tf(region).get(tier)
|
|
397
|
+
if not fp: return
|
|
398
|
+
with _fl:
|
|
399
|
+
try:
|
|
400
|
+
d=json.load(open(fp,encoding='utf-8')) if os.path.exists(fp) else []
|
|
401
|
+
if not isinstance(d,list): d=[d]
|
|
402
|
+
d.append(entry)
|
|
403
|
+
json.dump(d,open(fp,'w',encoding='utf-8'),indent=2,ensure_ascii=False)
|
|
404
|
+
except: pass
|
|
405
|
+
|
|
406
|
+
def tier(aid):
|
|
407
|
+
if not aid or aid=="N/A": return "NORMAL"
|
|
408
|
+
s=0
|
|
409
|
+
if len(aid)>=6:
|
|
410
|
+
rem=aid[3:]
|
|
411
|
+
if len(set(aid))==1: s+=30
|
|
412
|
+
elif len(set(rem))==1: s+=25
|
|
413
|
+
elif aid[:3] in{"154","155","156","157","158","159"} and len(set(rem))==1: s+=28
|
|
414
|
+
for pat,pts in[(r'(\d)\1{5,}',10),(r'(\d)\1{4,}',8),(r'(\d)\1{3,}',6),(r'(\d)\1{2,}',3)]:
|
|
415
|
+
if re.search(pat,aid): s+=pts; break
|
|
416
|
+
if re.search(r'(12345|23456|34567|45678|56789|98765|87654|76543|65432|54321)',aid): s+=7
|
|
417
|
+
elif re.search(r'(1234|2345|3456|4567|5678|6789|9876|8765|7654|6543|5432|4321)',aid): s+=4
|
|
418
|
+
if len(aid)>=6 and aid==aid[::-1]: s+=8
|
|
419
|
+
elif len(aid)>=4 and aid[:2]==aid[-1:-3:-1]: s+=4
|
|
420
|
+
if len(aid)>=6 and len(set(aid[::2]))==1 and len(set(aid[1::2]))==1: s+=6
|
|
421
|
+
for sn in['888','999','666','777','000','123','321','111','222','333','444','555']:
|
|
422
|
+
if sn in aid: s+=2
|
|
423
|
+
if len(aid)<=8: s+=5
|
|
424
|
+
elif len(aid)<=9: s+=3
|
|
425
|
+
if s>=20: return "LEGEND"
|
|
426
|
+
if s>=12: return "HIGH"
|
|
427
|
+
if s>=6: return "MEDIUM"
|
|
428
|
+
if s>=2: return "LOW"
|
|
429
|
+
return "NORMAL"
|
|
430
|
+
|
|
431
|
+
_boost_on = False
|
|
432
|
+
_boost_end = 0.0
|
|
433
|
+
_boost_tgt = None
|
|
434
|
+
_boost_desc = ""
|
|
435
|
+
_boost_lk = threading.Lock()
|
|
436
|
+
_last_aid = None
|
|
437
|
+
|
|
438
|
+
def _find_target(aid):
|
|
439
|
+
try: cur=int(aid)
|
|
440
|
+
except: return None
|
|
441
|
+
s=str(cur); pre=s[:2]; sl=len(s)-2
|
|
442
|
+
best=None
|
|
443
|
+
for rlen in range(9,4,-1):
|
|
444
|
+
for d in '9876543210':
|
|
445
|
+
suf=d*rlen
|
|
446
|
+
if rlen<sl:
|
|
447
|
+
for f in '9876543210':
|
|
448
|
+
full=f*(sl-rlen)+suf
|
|
449
|
+
if len(full)!=sl: continue
|
|
450
|
+
tgt=int(pre+full); gap=tgt-cur
|
|
451
|
+
if 0<gap<=800000:
|
|
452
|
+
score=rlen*10+(800000-gap)//100000
|
|
453
|
+
if not best or score>best[3]: best=(tgt,gap,f"{pre}{full}({rlen}x{d})",score)
|
|
454
|
+
else:
|
|
455
|
+
full=suf[:sl]; tgt=int(pre+full); gap=tgt-cur
|
|
456
|
+
if 0<gap<=800000:
|
|
457
|
+
score=rlen*10+(800000-gap)//100000
|
|
458
|
+
if not best or score>best[3]: best=(tgt,gap,f"{pre}{full}({rlen}x{d})",score)
|
|
459
|
+
for st in range(10):
|
|
460
|
+
for dr in(1,-1):
|
|
461
|
+
seq=''.join(str((st+i*dr)%10) for i in range(sl))
|
|
462
|
+
try:
|
|
463
|
+
tgt=int(pre+seq); gap=tgt-cur
|
|
464
|
+
if 0<gap<=400000:
|
|
465
|
+
score=50+(400000-gap)//50000
|
|
466
|
+
if not best or score>best[3]: best=(tgt,gap,f"{pre}{seq}(seq)",score)
|
|
467
|
+
except: pass
|
|
468
|
+
return best
|
|
469
|
+
|
|
470
|
+
def _check_boost(aid):
|
|
471
|
+
global _boost_on,_boost_end,_boost_tgt,_boost_desc,_last_aid
|
|
472
|
+
_last_aid=aid
|
|
473
|
+
r=_find_target(aid)
|
|
474
|
+
if not r: return
|
|
475
|
+
tgt,gap,desc,score=r
|
|
476
|
+
trigger=(gap<=50000) or (gap<=300000 and score>=75) or (gap<=800000 and score>=90)
|
|
477
|
+
if not trigger: return
|
|
478
|
+
with _boost_lk:
|
|
479
|
+
if _boost_on and _boost_tgt==tgt: return
|
|
480
|
+
_boost_on=True; _boost_end=time.time()+10
|
|
481
|
+
_boost_tgt=tgt; _boost_desc=desc
|
|
482
|
+
with _plock:
|
|
483
|
+
print(f"\n{R}{B}[ ! ] Mode boost! Mengejar ID {desc} | Gap: {gap:,}{W}")
|
|
484
|
+
print(f" {R}Active selama 10 detik, dimulai..{W}\n")
|
|
485
|
+
|
|
486
|
+
def boosting():
|
|
487
|
+
global _boost_on
|
|
488
|
+
if not _boost_on: return False
|
|
489
|
+
if time.time()>_boost_end:
|
|
490
|
+
with _boost_lk: _boost_on=False; _boost_tgt=None
|
|
491
|
+
return False
|
|
492
|
+
return True
|
|
493
|
+
|
|
494
|
+
_RU="https://100067.connect.garena.com/api/v2/oauth/guest:register"
|
|
495
|
+
_TU="https://100067.connect.garena.com/api/v2/oauth/guest/token:grant"
|
|
496
|
+
_AT=b'afcfbf13334be42036e4f742c80b956344bed760ac91b3aff9b607a610ab4390'
|
|
497
|
+
_OI=b'1d8ec0240ede109973f3321b9354b44d'
|
|
498
|
+
|
|
499
|
+
_LP=(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
|
+
_LP2=(b'\xb2\x01 1d8ec0240ede109973f3321b9354b44d'
|
|
505
|
+
b'\xba\x01\x014\xc2\x01\x08Handheld\xca\x01\x10Asus ASUS_I005DA'
|
|
506
|
+
b'\xea\x01@afcfbf13334be42036e4f742c80b956344bed760ac91b3aff9b607a610ab4390'
|
|
507
|
+
b'\xf0\x01\x01\xca\x02\nATM Mobils\xd2\x02\x04WIFI'
|
|
508
|
+
b'\xca\x03 7428b253defc164018c604a1ebbfebdf'
|
|
509
|
+
b'\xe0\x03\xa8\x81\x02\xe8\x03\xf6\xe5\x01\xf0\x03\xaf\x13\xf8\x03\x84\x07'
|
|
510
|
+
b'\x80\x04\xe7\xf0\x01\x88\x04\xa8\x81\x02\x90\x04\xe7\xf0\x01\x98\x04\xa8\x81\x02'
|
|
511
|
+
b'\xc8\x04\x01\xd2\x04=/data/app/com.dts.freefireth-PdeDnOilCSFn37p1AH_FLg==/lib/arm'
|
|
512
|
+
b'\xe0\x04\x01\xea\x04_2087f61c19f57f2af4e7feff0b24d9d9'
|
|
513
|
+
b'|/data/app/com.dts.freefireth-PdeDnOilCSFn37p1AH_FLg==/base.apk'
|
|
514
|
+
b'\xf0\x04\x03\xf8\x04\x01\x8a\x05\x0232\x9a\x05\n2019118692'
|
|
515
|
+
b'\xb2\x05\tOpenGLES2\xb8\x05\xff\x7f\xc0\x05\x04\xe0\x05\xf3F'
|
|
516
|
+
b'\xea\x05\x07android'
|
|
517
|
+
b'\xf2\x05pKqsHT5ZLWrYljNb5Vqh//yFRlaPHSO9NWSQsVvOmdhEEn7W+VHNUK+Q+fduA3pt'
|
|
518
|
+
b'NrGB0Ll0LRz3WW0jOwesLj6aiU7sZ40p8BfUE/FI/jzSTwRe2'
|
|
519
|
+
b'\xf8\x05\xfb\xe4\x06\x88\x06\x01\x90\x06\x01\x9a\x06\x014\xa2\x06\x014'
|
|
520
|
+
b'\xb2\x06"GQ@O\x00\x0e^\x00D\x06UA\x0ePM\r\x13hZ\x07T\x06\x0cm\\V\x0ejYV;\x0bU5')
|
|
521
|
+
|
|
522
|
+
def _reg(pw):
|
|
523
|
+
bj=json.dumps({"app_id":100067,"client_type":2,"password":pw,"source":2},separators=(",",":"))
|
|
524
|
+
sig=hmac.new(KEY,bj.encode(),hashlib.sha256).hexdigest()
|
|
525
|
+
h={"User-Agent":_ua(),"Authorization":f"Signature {sig}",
|
|
526
|
+
"Content-Type":"application/json; charset=utf-8","Accept":"application/json",
|
|
527
|
+
"Connection":"Keep-Alive","Host":"100067.connect.garena.com"}
|
|
528
|
+
for _ in range(4):
|
|
529
|
+
try:
|
|
530
|
+
r=_sess().post(_RU,headers=h,data=bj,timeout=10)
|
|
531
|
+
if r.status_code in(403,429): time.sleep(0.5); continue
|
|
532
|
+
b=r.json(); d=b.get("data",b)
|
|
533
|
+
uid=d.get("uid") or b.get("uid")
|
|
534
|
+
if uid: return uid
|
|
535
|
+
except: pass
|
|
536
|
+
time.sleep(0.2)
|
|
537
|
+
return None
|
|
538
|
+
|
|
539
|
+
def _tok(uid,pw):
|
|
540
|
+
bj=json.dumps({"client_id":100067,"client_secret":KEY.decode("ascii"),"client_type":2,
|
|
541
|
+
"password":pw,"response_type":"token","uid":uid},separators=(",",":"))
|
|
542
|
+
sig=hmac.new(KEY,bj.encode(),hashlib.sha256).hexdigest()
|
|
543
|
+
h={"User-Agent":_ua(),"Authorization":f"Signature {sig}",
|
|
544
|
+
"Content-Type":"application/json; charset=utf-8","Accept":"application/json",
|
|
545
|
+
"Connection":"Keep-Alive","Host":"100067.connect.garena.com"}
|
|
546
|
+
for _ in range(3):
|
|
547
|
+
try:
|
|
548
|
+
r=_sess().post(_TU,headers=h,data=bj,timeout=10)
|
|
549
|
+
if r.status_code in(403,429): time.sleep(0.5); continue
|
|
550
|
+
b=r.json(); d=b.get("data",b)
|
|
551
|
+
if "open_id" in d:
|
|
552
|
+
oi=d["open_id"]; at=d["access_token"]
|
|
553
|
+
res=enc_oid(oi)
|
|
554
|
+
fld=codecs.decode(ue(res["field_14"]),"unicode_escape").encode("latin1")
|
|
555
|
+
return oi,at,fld
|
|
556
|
+
except: pass
|
|
557
|
+
time.sleep(0.2)
|
|
558
|
+
return None,None,None
|
|
559
|
+
|
|
560
|
+
def _mreg(at,oi,fld,region):
|
|
561
|
+
nm=_nm(); lang=LANG.get(region,"en")
|
|
562
|
+
if region in("ME","TH"):
|
|
563
|
+
url="https://loginbp.common.ggbluefox.com/MajorRegister"; host="loginbp.common.ggbluefox.com"
|
|
564
|
+
else:
|
|
565
|
+
url="https://loginbp.ggblueshark.com/MajorRegister"; host="loginbp.ggblueshark.com"
|
|
566
|
+
pl=pb({1:nm,2:at,3:oi,5:102000007,6:4,7:1,13:1,14:fld,15:lang,16:1,17:1})
|
|
567
|
+
try:
|
|
568
|
+
_sess().post(url,headers={"Accept-Encoding":"gzip","Authorization":"Bearer",
|
|
569
|
+
"Connection":"Keep-Alive","Content-Type":"application/x-www-form-urlencoded",
|
|
570
|
+
"Expect":"100-continue","Host":host,"ReleaseVersion":"OB53",
|
|
571
|
+
"User-Agent":_ua(),"X-GA":"v1 1","X-Unity-Version":"2018.4."},
|
|
572
|
+
data=aes_bytes(pl.hex()),verify=False,timeout=10)
|
|
573
|
+
except: pass
|
|
574
|
+
return nm
|
|
575
|
+
|
|
576
|
+
def _mlogin(at,oi,region):
|
|
577
|
+
lang=LANG.get(region,"en")
|
|
578
|
+
if region in("ME","TH"):
|
|
579
|
+
url="https://loginbp.common.ggbluefox.com/MajorLogin"; host="loginbp.common.ggbluefox.com"
|
|
580
|
+
else:
|
|
581
|
+
url="https://loginbp.ggblueshark.com/MajorLogin"; host="loginbp.ggblueshark.com"
|
|
582
|
+
raw=_LP+lang.encode()+_LP2
|
|
583
|
+
raw=raw.replace(_AT,at.encode()).replace(_OI,oi.encode())
|
|
584
|
+
fp=bytes.fromhex(aes_hex(raw.hex()))
|
|
585
|
+
h={"Accept-Encoding":"gzip","Authorization":"Bearer","Connection":"Keep-Alive",
|
|
586
|
+
"Content-Type":"application/x-www-form-urlencoded","Expect":"100-continue",
|
|
587
|
+
"Host":host,"ReleaseVersion":"OB53","User-Agent":_ua(),
|
|
588
|
+
"X-GA":"v1 1","X-Unity-Version":"2018.4.11f1"}
|
|
589
|
+
for _ in range(3):
|
|
590
|
+
try:
|
|
591
|
+
r=_sess().post(url,headers=h,data=fp,verify=False,timeout=12)
|
|
592
|
+
if r.status_code==200 and len(r.text)>10:
|
|
593
|
+
aid=decode_resp(r.text)
|
|
594
|
+
if aid!="N/A": return aid
|
|
595
|
+
except: pass
|
|
596
|
+
time.sleep(0.3)
|
|
597
|
+
return "N/A"
|
|
598
|
+
|
|
599
|
+
def _bind(at,region):
|
|
600
|
+
rk="RU" if region=="CIS" else region
|
|
601
|
+
if region in("ME","TH"): url="https://loginbp.common.ggbluefox.com/ChooseRegion"
|
|
602
|
+
else: url="https://loginbp.ggblueshark.com/ChooseRegion"
|
|
603
|
+
pl=bytes.fromhex(aes_hex(pb({1:rk}).hex()))
|
|
604
|
+
try:
|
|
605
|
+
_sess().post(url,data=pl,headers={"User-Agent":_ua(),"Connection":"Keep-Alive",
|
|
606
|
+
"Accept-Encoding":"gzip","Content-Type":"application/x-www-form-urlencoded",
|
|
607
|
+
"Expect":"100-continue","Authorization":f"Bearer {at}",
|
|
608
|
+
"X-Unity-Version":"2018.4.11f1","X-GA":"v1 1","ReleaseVersion":"OB53"},
|
|
609
|
+
verify=False,timeout=8)
|
|
610
|
+
except: pass
|
|
611
|
+
|
|
612
|
+
def make(region):
|
|
613
|
+
pw=_pw(); uid=_reg(pw)
|
|
614
|
+
if not uid: return None
|
|
615
|
+
oi,at,fld=_tok(uid,pw)
|
|
616
|
+
if not oi: return None
|
|
617
|
+
nm=_mreg(at,oi,fld,region)
|
|
618
|
+
aid=_mlogin(at,oi,region)
|
|
619
|
+
if aid=="N/A": return None
|
|
620
|
+
if region!="BR": threading.Thread(target=_bind,args=(at,region),daemon=True).start()
|
|
621
|
+
return {"uid":uid,"pw":pw,"name":nm,"aid":aid}
|
|
622
|
+
|
|
623
|
+
_cnt=0; _cnt_lk=threading.Lock()
|
|
624
|
+
_ts={"NORMAL":0,"LOW":0,"MEDIUM":0,"HIGH":0,"LEGEND":0}; _ts_lk=threading.Lock()
|
|
625
|
+
_stuck_t=time.time(); _stuck_lk=threading.Lock()
|
|
626
|
+
_stuck_on=True
|
|
627
|
+
_print_lk=threading.Lock()
|
|
628
|
+
_total=0; _nw=800
|
|
629
|
+
_t0=time.time(); _p100t=time.time(); _p100c=0
|
|
630
|
+
|
|
631
|
+
def _stuck_loop():
|
|
632
|
+
while _stuck_on:
|
|
633
|
+
time.sleep(5)
|
|
634
|
+
with _stuck_lk: idle=time.time()-_stuck_t
|
|
635
|
+
if _total>0 and _cnt>=_total: break
|
|
636
|
+
if idle>=25: threading.Thread(target=_tor_renew,daemon=True).start(); _stuck_reset()
|
|
637
|
+
|
|
638
|
+
def _stuck_reset():
|
|
639
|
+
with _stuck_lk: globals()['_stuck_t']=time.time()
|
|
640
|
+
|
|
641
|
+
threading.Thread(target=_stuck_loop,daemon=True).start()
|
|
642
|
+
|
|
643
|
+
def out(res,region):
|
|
644
|
+
global _cnt,_p100t,_p100c
|
|
645
|
+
uid=res["uid"]; pw=res["pw"]; nm=res["name"]; aid=res["aid"]
|
|
646
|
+
t=tier(aid); te=TIER_E[t]; tc=TIER_C[t]; ts=datetime.now().strftime('%H:%M:%S')
|
|
647
|
+
with _ts_lk: _ts[t]+=1
|
|
648
|
+
with _cnt_lk: _cnt+=1; cur=_cnt
|
|
649
|
+
_stuck_reset()
|
|
650
|
+
save({"uid":uid,"password":pw,"account_id":aid,"name":nm,"region":region,
|
|
651
|
+
"tier":t,"created_at":datetime.now().strftime('%Y-%m-%d %H:%M:%S')},t,region)
|
|
652
|
+
_check_boost(aid)
|
|
653
|
+
with _print_lk:
|
|
654
|
+
print(f"[{ts}] {G}✅{W} {cur} | {tc}ID:{aid}({te}){W} | {uid} | {pw}")
|
|
655
|
+
if cur%100==0:
|
|
656
|
+
now=time.time(); el=now-_t0; r=cur/el if el>0 else 0
|
|
657
|
+
el100=now-_p100t if _p100c>0 else el; tot=f"/{_total}" if _total>0 else ""
|
|
658
|
+
with _ts_lk: ts2=dict(_ts)
|
|
659
|
+
print(f"\n{C}{B}▶ {cur}{tot} | +100:{fmt(el100)} | total:{fmt(el)} | {r:.2f}/s{W}")
|
|
660
|
+
print(f" {G}🍀:{ts2['NORMAL']}{W} {Y}😬:{ts2['LOW']}{W} "
|
|
661
|
+
f"{C}🤩:{ts2['MEDIUM']}{W} {M}☠️:{ts2['HIGH']}{W} "
|
|
662
|
+
f"{R}❤️🔥:{ts2['LEGEND']}{W}\n")
|
|
663
|
+
_p100t=now; _p100c=cur
|
|
664
|
+
|
|
665
|
+
def worker(region):
|
|
666
|
+
while True:
|
|
667
|
+
with _cnt_lk:
|
|
668
|
+
if _total>0 and _cnt>=_total: return
|
|
669
|
+
try:
|
|
670
|
+
res=make(region)
|
|
671
|
+
except:
|
|
672
|
+
res=None
|
|
673
|
+
if not res: continue
|
|
674
|
+
with _cnt_lk:
|
|
675
|
+
if _total>0 and _cnt>=_total: return
|
|
676
|
+
out(res,region)
|
|
677
|
+
|
|
678
|
+
def main():
|
|
679
|
+
global _cnt, _nw, _stuck_on, _t0, _p100t, _p100c, _ts
|
|
680
|
+
|
|
681
|
+
while True:
|
|
682
|
+
os.system('cls' if os.name == 'nt' else 'clear')
|
|
683
|
+
print(f"{render('N4TAZA', colors=['white', 'red'], align='center')}\n")
|
|
684
|
+
|
|
685
|
+
while True:
|
|
686
|
+
region = input(f" {B}[+] Region ({'/'.join(sorted(VALID))}) >>> ").upper().strip()
|
|
687
|
+
if region in VALID:
|
|
688
|
+
break
|
|
689
|
+
print(f"Region tidak valid.")
|
|
690
|
+
|
|
691
|
+
while True:
|
|
692
|
+
try:
|
|
693
|
+
j = input(f" {B}[+] Jumlah ID (0=∞) >>> ").strip()
|
|
694
|
+
if j.isdigit() and int(j) >= 0:
|
|
695
|
+
total_accounts = int(j)
|
|
696
|
+
break
|
|
697
|
+
except:
|
|
698
|
+
pass
|
|
699
|
+
|
|
700
|
+
num_workers = _nw
|
|
701
|
+
|
|
702
|
+
success_count = 0
|
|
703
|
+
_stuck_on = True
|
|
704
|
+
_boost_on = False
|
|
705
|
+
|
|
706
|
+
_cnt = 0
|
|
707
|
+
_t0 = time.time()
|
|
708
|
+
_p100t = time.time()
|
|
709
|
+
_p100c = 0
|
|
710
|
+
_total = total_accounts
|
|
711
|
+
|
|
712
|
+
for k in _ts:
|
|
713
|
+
_ts[k] = 0
|
|
714
|
+
tf(region)
|
|
715
|
+
|
|
716
|
+
print(f"\n Starting..")
|
|
717
|
+
|
|
718
|
+
try:
|
|
719
|
+
with ThreadPoolExecutor(max_workers=num_workers) as ex:
|
|
720
|
+
futures = [ex.submit(worker, region) for _ in range(num_workers)]
|
|
721
|
+
for f in futures:
|
|
722
|
+
f.result()
|
|
723
|
+
except KeyboardInterrupt:
|
|
724
|
+
print(f"\nDihentikan.")
|
|
725
|
+
|
|
726
|
+
_stuck_on = False
|
|
727
|
+
elapsed = time.time() - _t0
|
|
728
|
+
spd = _cnt / elapsed if elapsed > 0 else 0
|
|
729
|
+
|
|
730
|
+
print(f"\nSelesai! {_cnt}{'/' + str(total_accounts) if total_accounts else ''} akun")
|
|
731
|
+
print(f"Waktu: {fmt(elapsed)} | Kecepatan: {spd:.2f} akun/detik")
|
|
732
|
+
print(f"Folder: {BASE}/{region}/")
|
|
733
|
+
print(f"\nFinal: "
|
|
734
|
+
f"🍀{_ts['NORMAL']} 😬{_ts['LOW']} "
|
|
735
|
+
f"🤩{_ts['MEDIUM']} ☠️{_ts['HIGH']} "
|
|
736
|
+
f"❤️🔥{_ts['LEGEND']}")
|
|
737
|
+
|
|
738
|
+
try:
|
|
739
|
+
input(f"\nTekan enter untuk generate ulang.. ")
|
|
740
|
+
except (KeyboardInterrupt, EOFError):
|
|
741
|
+
if _TOR_PROC:
|
|
742
|
+
try:
|
|
743
|
+
_TOR_PROC.terminate()
|
|
744
|
+
except:
|
|
745
|
+
pass
|
|
746
|
+
break
|
|
747
|
+
|
|
748
|
+
if __name__ == "__main__":
|
|
749
|
+
main()
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
pyproject.toml
|
|
2
|
+
src/natazx/__init__.py
|
|
3
|
+
src/natazx/__main__.py
|
|
4
|
+
src/natazx/natazx.py
|
|
5
|
+
src/natazx.egg-info/PKG-INFO
|
|
6
|
+
src/natazx.egg-info/SOURCES.txt
|
|
7
|
+
src/natazx.egg-info/dependency_links.txt
|
|
8
|
+
src/natazx.egg-info/entry_points.txt
|
|
9
|
+
src/natazx.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
natazx
|