-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbusur_exitip.py
More file actions
95 lines (78 loc) · 3.29 KB
/
Copy pathbusur_exitip.py
File metadata and controls
95 lines (78 loc) · 3.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/bin/env python3
import requests
import pymysql
import json
import scrtsxx
VERSION = 20250319.1444
class BusurExitIP():
def connDB(self):
self.db = pymysql.connect(host=scrtsxx.HOST,
port=scrtsxx.PORT,
user=scrtsxx.USERNAME,
passwd=scrtsxx.PASSWORD,
db=scrtsxx.DB,
charset="utf8mb4",
cursorclass=pymysql.cursors.DictCursor
)
def upsert_nodes(self, node_data):
cursor = self.db.cursor()
query = """
INSERT INTO exitip (
addr, moniker, version, type, api, exitIp, asn, continentCode, countryCode, country,
city, latitude, longitude, ipRep, isResidential, isActive, isHealthy, isDuplicate,
isWhitelisted, fetchedAt, inactiveAt
) VALUES (
%(addr)s, %(moniker)s, %(version)s, %(type)s, %(api)s, %(exitIp)s, %(asn)s,
%(continentCode)s, %(countryCode)s, %(country)s, %(city)s, %(latitude)s,
%(longitude)s, %(ipRep)s, %(isResidential)s, %(isActive)s, %(isHealthy)s,
%(isDuplicate)s, %(isWhitelisted)s, %(fetchedAt)s, %(inactiveAt)s
)
ON DUPLICATE KEY UPDATE
moniker = VALUES(moniker),
version = VALUES(version),
api = VALUES(api),
exitIp = VALUES(exitIp),
asn = VALUES(asn),
continentCode = VALUES(continentCode),
countryCode = VALUES(countryCode),
country = VALUES(country),
city = VALUES(city),
latitude = VALUES(latitude),
longitude = VALUES(longitude),
ipRep = VALUES(ipRep),
isResidential = VALUES(isResidential),
isActive = VALUES(isActive),
isHealthy = VALUES(isHealthy),
isDuplicate = VALUES(isDuplicate),
isWhitelisted = VALUES(isWhitelisted),
fetchedAt = VALUES(fetchedAt),
inactiveAt = VALUES(inactiveAt)
"""
# Convert booleans to integers (MySQL TINYINT)
for node in node_data:
node['isResidential'] = 1 if node['isResidential'] else 0
node['isActive'] = 1 if node['isActive'] else 0
node['isHealthy'] = 1 if node['isHealthy'] else 0
node['isDuplicate'] = 1 if node['isDuplicate'] else 0
node['isWhitelisted'] = 1 if node['isWhitelisted'] else 0
if node['inactiveAt'] is None:
node['inactiveAt'] = None
cursor.executemany(query, node_data)
self.db.commit()
print(f"{cursor.rowcount} records affected")
self.db.close()
if __name__ == "__main__":
header = {"partnerKey" : scrtsxx.BUSUR_KEY}
busur = BusurExitIP()
busur.connDB()
try:
response = requests.get(scrtsxx.BUSUR, headers=header)
response.raise_for_status()
data = response.json()
if data.get('success') and data.get('data'):
nodes = data['data']
busur.upsert_nodes(nodes)
else:
print("Invalid response format")
except requests.exceptions.RequestException as e:
print(f"API Request Failed: {e}")