70 lines
1.5 KiB
Python
70 lines
1.5 KiB
Python
|
import json
|
||
|
import time
|
||
|
import urllib.request
|
||
|
|
||
|
__document = None
|
||
|
__data = {}
|
||
|
__next = 0
|
||
|
|
||
|
__sources = [
|
||
|
{
|
||
|
'url': 'http://free.ipwhois.io/json/',
|
||
|
'mapping': {
|
||
|
'latitude': 'latitude',
|
||
|
'longitude': 'longitude',
|
||
|
'country': 'country',
|
||
|
'ip': 'public_ip',
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
'url': 'http://ipapi.co/json',
|
||
|
'mapping': {
|
||
|
'latitude': 'latitude',
|
||
|
'longitude': 'longitude',
|
||
|
'country_name': 'country',
|
||
|
'ip': 'public_ip',
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
|
||
|
def __expired():
|
||
|
global __next
|
||
|
return __next <= time.time()
|
||
|
|
||
|
def __load():
|
||
|
global __data
|
||
|
global __next
|
||
|
|
||
|
__data = {}
|
||
|
for src in __sources:
|
||
|
try:
|
||
|
tmp = json.loads(urllib.request.urlopen(src['url']).read())
|
||
|
for k, v in src['mapping'].items():
|
||
|
__data[v] = tmp.get(k, None)
|
||
|
__next = time.time() + 60*60*12 # update once every 12h
|
||
|
return
|
||
|
except Exception as e:
|
||
|
pass
|
||
|
__next = time.time() + 60*30 # error - try again every 30m
|
||
|
|
||
|
def __get(name, default=None):
|
||
|
global __data
|
||
|
if not __data or __expired():
|
||
|
__load()
|
||
|
return __data.get(name, default)
|
||
|
|
||
|
def reset():
|
||
|
global __next
|
||
|
__next = 0
|
||
|
|
||
|
def coordinates():
|
||
|
return __get('latitude'), __get('longitude')
|
||
|
|
||
|
def country():
|
||
|
return __get('country')
|
||
|
|
||
|
def public_ip():
|
||
|
return __get('public_ip')
|
||
|
|
||
|
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
|