Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
thespeedx
GitHub Repository: thespeedx/tbomb
Path: blob/master/utils/provider.py
3476 views
1
import threading
2
import requests
3
import json
4
import time
5
6
7
class APIProvider:
8
9
api_providers = []
10
delay = 0
11
status = True
12
13
def __init__(self, cc, target, mode, delay=0):
14
try:
15
PROVIDERS = json.load(open('apidata.json', 'r'))
16
except Exception:
17
PROVIDERS = requests.get(
18
"https://github.com/TheSpeedX/TBomb/raw/master/apidata.json"
19
).json()
20
self.config = None
21
self.cc = cc
22
self.target = target
23
self.mode = mode
24
self.index = 0
25
self.lock = threading.Lock()
26
self.api_version = PROVIDERS.get("version", "2")
27
APIProvider.delay = delay
28
providers = PROVIDERS.get(mode.lower(), {})
29
APIProvider.api_providers = providers.get(cc, [])
30
if len(APIProvider.api_providers) < 10:
31
APIProvider.api_providers += providers.get("multi", [])
32
33
def format(self):
34
config_dump = json.dumps(self.config)
35
config_dump = config_dump.replace("{target}", self.target)
36
config_dump = config_dump.replace("{cc}", self.cc)
37
self.config = json.loads(config_dump)
38
39
def select_api(self):
40
try:
41
if len(APIProvider.api_providers) == 0:
42
raise IndexError
43
self.index += 1
44
if self.index >= len(APIProvider.api_providers):
45
self.index = 0
46
except IndexError:
47
self.index = -1
48
return
49
self.config = APIProvider.api_providers[self.index]
50
perma_headers = {"User-Agent":
51
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0)"
52
" Gecko/20100101 Firefox/72.0"}
53
if "headers" in self.config:
54
self.config["headers"].update(perma_headers)
55
else:
56
self.config["headers"] = perma_headers
57
self.format()
58
59
def remove(self):
60
try:
61
del APIProvider.api_providers[self.index]
62
return True
63
except Exception:
64
return False
65
66
def request(self):
67
self.select_api()
68
if not self.config or self.index == -1:
69
return None
70
identifier = self.config.pop("identifier", "").lower()
71
del self.config['name']
72
self.config['timeout'] = 30
73
response = requests.request(**self.config)
74
return identifier in response.text.lower()
75
76
def hit(self):
77
try:
78
if not APIProvider.status:
79
return
80
time.sleep(APIProvider.delay)
81
self.lock.acquire()
82
response = self.request()
83
if response is False:
84
self.remove()
85
elif response is None:
86
APIProvider.status = False
87
return response
88
except Exception:
89
response = False
90
finally:
91
self.lock.release()
92
return response
93
94