generated from mwc/lab_weather
141 lines
3.5 KiB
Python
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()
|