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 ADDED
@@ -0,0 +1,6 @@
1
+ Metadata-Version: 2.4
2
+ Name: glitxh
3
+ Version: 0.1.0
4
+ Summary: Script glitxh
5
+ Author-email: Namamu <email@contoh.com>
6
+ License: MIT
@@ -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,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -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,6 @@
1
+ Metadata-Version: 2.4
2
+ Name: glitxh
3
+ Version: 0.1.0
4
+ Summary: Script glitxh
5
+ Author-email: Namamu <email@contoh.com>
6
+ License: MIT
@@ -0,0 +1,7 @@
1
+ pyproject.toml
2
+ src/glitxh/__init__.py
3
+ src/glitxh/glitxh.py
4
+ src/glitxh.egg-info/PKG-INFO
5
+ src/glitxh.egg-info/SOURCES.txt
6
+ src/glitxh.egg-info/dependency_links.txt
7
+ src/glitxh.egg-info/top_level.txt
@@ -0,0 +1 @@
1
+ glitxh