This commit is contained in:
Igor Chubin 2021-01-02 12:45:17 +01:00
parent 3ae30af48d
commit 3c8149a227

View file

@ -128,10 +128,10 @@ def _ipcachewrite(ip_addr, location):
if not os.path.exists(IP2LCACHE):
os.makedirs(IP2LCACHE)
with open(cachefile, 'w') as file:
# like ip2location format
file.write(location[3] + ';' + location[2] + ';' + location[1] + ';' + location[0])
if len(location) > 4:
file.write(';' + location[4] + ';' + location[5])
# like ip2location format
file.write(';'.join(location[4:]))
def _ipcache(ip_addr):
@ -155,7 +155,14 @@ def _ipcache(ip_addr):
def _ip2location(ip_addr):
"""Convert IP address `ip_addr` to a location name"""
""" Convert IP address `ip_addr` to a location name using ip2location.
Return list of location data fields:
[ccode, country, region, city, rest...]
Return `None` if an error occured.
"""
# if IP2LOCATION_KEY is not set, do not query,
# because the query wont be processed anyway
if not IP2LOCATION_KEY:
@ -166,13 +173,14 @@ def _ip2location(ip_addr):
% (ip_addr, IP2LOCATION_KEY))
r.raise_for_status()
location = r.text
if location and ';' in location:
# ccode, country, region, city, lat, long, *_ = location.split(';')
ccode, country, region, city, *_ = location.split(';')
parts = location.split(';')
if len(parts) >= 4:
# ccode, country, region, city, (rest)
return [parts[3], parts[2], parts[1], parts[0]] + parts[4:]
return None
except requests.exceptions.RequestException:
return None
return city, region, country, ccode # , lat, long
def _ipinfo(ip_addr):
if not IPINFO_TOKEN:
@ -191,7 +199,7 @@ def _ipinfo(ip_addr):
except (requests.exceptions.RequestException, ValueError):
# latter is thrown by failure to parse json in reponse
return None
return city, region, country, ccode, lat, long
return [city, region, country, ccode, lat, long]
def _geoip(ip_addr):
@ -200,7 +208,7 @@ def _geoip(ip_addr):
city, region, country, ccode, lat, long = response.city.name, response.subdivisions.name, response.country.name, response.country.iso_code, response.location.latitude, response.location.longitude
except geoip2.errors.AddressNotFoundError:
return None
return city, region, country, ccode, lat, long
return [city, region, country, ccode, lat, long]
def _country_name_workaround(country):