Skip to content

maxmind reader in python

pyproject.toml

toml
[tool.poetry.dependencies]
python = "^3.11"
geoip2 = "^4.6.0"

[[tool.poetry.source]]
name = "aliyun"
url = "http://mirrors.aliyun.com/pypi/simple"
default = true

iplocation.py

python
import geoip2.database
import os

class GeoIP:

    def __init__(self) -> None:
        self.filename_mmdb = os.path.join(os.path.dirname(__file__), 'GeoLite2-City.mmdb')
        self.country_name = 'zh-CN'
        self.reader = geoip2.database.Reader(self.filename_mmdb)

    @staticmethod
    def get_data_by_key(data, keys: list) -> object:
        if not data:
            return None
        for k in keys:
            if k not in data:
                return None
            data = data[k]
        return data

    def get_ip_location_data(self, ip: str) -> dict:

        data_loc = dict()
        try:
            city_data = self.reader.city(ip).raw
        except:
            return data_loc
        
        dict_ = dict(
            location_city                       = ['city', 'names', self.country_name],
            location_continent                  = ['continent', 'names', self.country_name],
            location_continent_code             = ['continent', 'code'],
            location_country                    = ['country', 'names', self.country_name],
            location_country_isocode            = ['country', 'iso_code'],
            location_registered_country         = ['registered_country', 'names', self.country_name],
            location_registered_country_isocode = ['registered_country', 'iso_code'],
            location_latitude                   = ['location', 'latitude'],
            location_longitude                  = ['location', 'longitude'],
            location_timezone                   = ['location', 'time_zone'],
        )
        if city_data:
            for name, keys in dict_.items():
                data_loc[name] = self.get_data_by_key(city_data, keys)
        return data_loc

if __name__ == '__main__':
    from pprint import pprint
    geoip = GeoIP()
    pprint(geoip.get_ip_location_data("1.1.1.1"))
    pprint(geoip.get_ip_location_data("127.0.0.1"))