diff --git a/lib/location.py b/lib/location.py index 7eff718..d66c07c 100644 --- a/lib/location.py +++ b/lib/location.py @@ -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):