This commit is contained in:
yumoqing 2023-05-27 13:47:43 +08:00
parent 75776211ad
commit f956528714

View File

@ -11,29 +11,59 @@ class IpGetter:
self.avg_time = 0 self.avg_time = 0
def get(self): def get(self):
tim1 = time.time() try:
r = requests.get(self.url) tim1 = time.time()
txt = r.text r = requests.get(self.url)
ip = self.parser(txt) txt = r.text
tim2 = time.time() ip = self.parser(txt)
self.cnt += 1 tim2 = time.time()
self.total_time += tim2 - tim1 cost_tim = tim2 - tim1
self.avg_time = self.total_time / self.cnt self.cnt += 1
return ip self.total_time += cost_tim
self.avg_time = self.total_time / self.cnt
ret = self.check_ip(ip)
if ret:
return ret
self.avg_time = 10000
print('Error, get=', ip)
return None
except Exception as e:
print(f'{self.url=}. {e=}')
self.avg_time = cost_tim = 10000
return None
def check_ip(self, ip):
ret = re.compile(r'(\d+.\d+.\d+.\d+)').search(ip)
if ret:
return ret.group(1)
print('ip format check failed', ip, self.url)
return None
def get_average_time(self): def get_average_time(self):
return self.avg_time return self.avg_time
def __str__(self):
return f'{self.url=},{self.avg_time=}'
class OutIP: class OutIP:
def __init__(self): def __init__(self):
self.getters = [] self.getters = []
self.set_known_getters() self.set_known_getters()
def set_known_getters(self): def set_known_getters(self):
g = IpGetter('http://ipinfo.io/ip', lambda x: x) g = IpGetter('http://ipinfo.io/ip', lambda x: x)
self.add_getter(g) self.add_getter(g)
g = IpGetter('https://api.ipify.org', lambda x: x) g = IpGetter('https://api.ipify.org', lambda x: x)
self.add_getter(g) self.add_getter(g)
g = IpGetter('https://ident.me', lambda x: x)
self.add_getter(g)
# g = IpGetter('https://ipapi.co/ip/', lambda x: x)
# self.add_getter(g)
g = IpGetter('http://myip.dnsomatic.com', lambda x: x)
self.add_getter(g)
g = IpGetter('https://checkip.amazonaws.com', lambda x: x.strip())
self.add_getter(g)
def f(t): def f(t):
return re.compile(r'Address: (\d+.\d+.\d+.\d+)').search(t).group(1) return re.compile(r'Address: (\d+.\d+.\d+.\d+)').search(t).group(1)
g = IpGetter('http://checkip.dyndns.com', f) g = IpGetter('http://checkip.dyndns.com', f)
@ -45,8 +75,12 @@ class OutIP:
def get(self): def get(self):
gs = self.getters.copy() gs = self.getters.copy()
gs.sort(key=lambda a: a.get_average_time()) gs.sort(key=lambda a: a.get_average_time())
g = gs[0] for g in gs:
return g.get() # print(*[str(g) for g in self.getters ])
ip = g.get()
if ip:
return ip
return None
if __name__ == '__main__': if __name__ == '__main__':
oi = OutIP() oi = OutIP()