lab_weather/geocoder/maxmind.py

141 lines
3.5 KiB
Python

#!/usr/bin/python
# coding: utf8
from __future__ import absolute_import
import logging
from geocoder.base import OneResult, MultipleResultsQuery
class MaxmindResults(OneResult):
def __init__(self, json_content):
# create safe shortcuts
self._location = json_content.get('location', {})
self._traits = json_content.get('traits', {})
# proceed with super.__init__
super(MaxmindResults, self).__init__(json_content)
@property
def lat(self):
return self._location.get('latitude')
@property
def lng(self):
return self._location.get('longitude')
@property
def timezone(self):
return self._location.get('time_zone')
@property
def metro_code(self):
return self._location.get('metro_code')
@property
def domain(self):
return self._traits.get('domain')
@property
def isp(self):
return self._traits.get('isp')
@property
def organization(self):
return self._traits.get('organization')
@property
def ip(self):
return self._traits.get('ip_address')
@property
def postal(self):
return self.raw.get('postal', {}).get('code')
@property
def city(self):
return self.raw.get('city', {}).get('names', {}).get('en')
@property
def state(self):
return self.raw.get('subdivision', {}).get('names', {}).get('en')
@property
def country(self):
return self.raw.get('country', {}).get('names', {}).get('en')
@property
def country_code(self):
return self.raw.get('country', {}).get('iso_code')
@property
def continent(self):
return self.raw.get('continent', {}).get('names', {}).get('en')
@property
def continent_code(self):
return self.raw.get('continent', {}).get('code')
@property
def address(self):
if self.city:
return u'{0}, {1}, {2}'.format(self.city, self.state, self.country)
elif self.state:
return u'{0}, {1}'.format(self.state, self.country)
elif self.country:
return u'{0}'.format(self.country)
else:
return u''
class MaxmindQuery(MultipleResultsQuery):
"""
MaxMind's GeoIP2
=======================
MaxMind's GeoIP2 products enable you to identify the location,
organization, connection speed, and user type of your Internet
visitors. The GeoIP2 databases are among the most popular and
accurate IP geolocation databases available.
API Reference
-------------
https://www.maxmind.com/en/geolocation_landing
"""
provider = 'maxmind'
method = 'geocode'
_URL = 'https://www.maxmind.com/geoip/v2.0/city_isp_org/{0}'
_RESULT_CLASS = MaxmindResults
_KEY_MANDATORY = False
def _build_headers(self, provider_key, **kwargs):
return {
'Referer': 'https://www.maxmind.com/en/geoip_demo',
'Host': 'www.maxmind.com',
}
def _build_params(self, location, provider_key, **kwargs):
return {'demo': 1}
def _before_initialize(self, location, **kwargs):
location = location or 'me'
self.url = self._URL.format(location)
def _catch_errors(self, json_response):
error = json_response.get('error')
if error:
self.error = json_response.get('code')
return self.error
def _adapt_results(self, json_response):
return [json_response]
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO)
g = MaxmindQuery('8.8.8.8')
g.debug()