OR — Моя собственная SAAS без головы — часть 2
В своем предыдущем посте я описал, как я начал разрабатывать свой собственный SAAS и различные решения, которые мне пришлось принять.
Здесь я хочу показать вам, как я (и вы тоже можете!) разработал сервис IP-to-geo с помощью Python.
Справочная информация
Прежде чем углубиться в эту тему, мы должны понять, что преобразование IP-адреса в геолокацию — дело непростое. IP-адреса обычно выделяются по диапазонам (т.е. наборам из сотен или более IP-адресов) крупным организациям и ассоциациям, правительствам, интернет-провайдерам и большим компаниям.
Затем эти организации распределяют IP по своему усмотрению, либо внутри организации, либо для общедоступных ресурсов, а иногда даже для пользователей (например, провайдеры могут выделить IP потребителю интернета, а у облачных провайдеров можно приобрести фиксированный IP).
Однако распределение IP имеет тенденцию меняться со временем, что затрудняет точное сопоставление IP с организацией или IP с местоположением.
Именно поэтому существует несколько компаний, которые специализируются исключительно на этом — поддержании постоянно обновляемой карты IP, распределений и местоположений.
Среди таких фирм Maxmind, IP2Location, DP-IP и другие.
В этом материале я буду использовать базу данных IP free компании Maxmind и покажу вам, как читать ее с помощью Python.
Обратите внимание, что база данных GeoLite — это бесплатная, ограниченная и неточная версия полной базы данных Maxmind, которая требует лицензии.
Кодируйте!
Если вам лень, вы также можете заглянуть в мой блокнот.
Давайте приступим:
- Зарегистрируйтесь в MaxMind
- Как только вы вошли, перейдите в раздел «скачать базу данных»:
- Далее прокрутите вниз и скачайте базу данных «GeoLite City». Убедитесь, что вы скачиваете GZIP, а не CSV-файл.
- Распакуйте и поместите файл .mmdb куда-нибудь рядом с вашим кодом.
Далее мы выполним несколько простых действий по кодированию.
Для чтения этой базы данных мы будем использовать собственную библиотеку Maxmind для python:
$ pip install geoip2
Мой файл geo.py выглядит следующим образом, и я полагаю, что он довольно прост:
import geoip2.database
# Open the database file, the location of the database needs to match your setup
with geoip2.database.Reader('./files/GeoLite2-City.mmdb') as reader:
# Query for a specific IP
response = reader.city('90.190.169.0')
print(f"Continent: {response.continent.names['en']}")
print(f"Country: {response.country.names['en']}")
print(f"City: {response.city.names['en']}")
print(f"Coordinates: Lat {response.location.latitude} Long {response.location.longitude}")
print(f"Timezone: {response.location.time_zone}")
В приведенном выше примере я просто распечатываю некоторые данные, полученные из базы данных Maxmind, но я могу сделать гораздо больше, например, сохранить их в своей БД, использовать для логирования, проверки пользователей, предотвращения кибератак и т.д.
Вы планируете добавить в свое приложение возможность определения местоположения по IP?
Если да, то вы определенно можете пойти вперед и приобрести файл базы данных IP-to-geo от Maxmind (или любой другой фирмы) и внедрить его в свой код.
Преимущества такого подхода в том, что вы получаете надежное и независимое приложение.
Недостатки такого подхода в том, что вам придется покупать лицензию независимо от использования, и вам придется постоянно следить за тем, чтобы файл базы данных постоянно обновлялся в вашей кодовой базе.
Это требует еще одного (микро)сервиса для разработки, поддержки и мониторинга.
Другая разумная альтернатива — использовать API-сервис для запроса IP-адресов к местоположению.
Если вы рассматриваете такой подход, обязательно ознакомьтесь с моим собственным сервисом tooltap.app.
Я все еще добавляю пользователей в качестве партнеров по разработке с эксклюзивными привилегиями на ранних этапах. Свяжитесь со мной, если вы хотите воспользоваться этой возможностью.