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