¿Cómo Geolocalizar direcciones IP con Python?
Categoría: Python
Autor: Ing. Gustavo Gómez Macías (Goz)
Publicado: 08 de Febrero de 2025
Periódicamente realizo el monitoreo de mis servidores personales y hace tiempo programé Heimdall, un útil script a la medida hecho en python que me permite desde analizar los logs de mis aplicaciones (para detectar y ubicar a los usuarios "creativos") así como bloquear direcciones ip en mi firewall, entre otras cosas.
El punto es que ésta semana al correr mi script me di cuenta ya no me informaba la ubicación aproximada de las ips "creativas". Al revisar más a fondo veo que el problema es el api de geolocalización que utilizaba. Ésta reestringió su uso por lo que ya no me es posible utilizarla para mi uso personal (se truena a las 5 ips localizadas) y era necesario encontrar otra solución.
Es aquí donde entra IP Geolocation - JSON endpoint
https://ip-api.com/
Quedé bastante sorprendido de lo bien que me ha funcionado para mi uso personal.
Aquí algunas características del API:
1. Gratis para uso no comercial.
2. No requiere API-key.
3. Puedes realizar hasta 45 solicitudes HTTP por minuto desde una misma IP.
4. Tiempo de respuesta de 50 milisegundos desde casi todas las partes del mundo.
5. Respuestas en JSON XML, CSV Newline y PHP además de Batch API y DNS API.
6. Mantienen la base de datos de IP's actualizada.
7. El proyecto está activo desde 2012.
Así se ve la ubicación de IP's desde mi script
Por aca les dejo un script de ejemplo para que puedan probar el API

###################################################################
# Programa para probar IP-API
# Autor: Gustavo Gómez Macías (Goz)
# Tutoriales Code With Goz
###################################################################

import requests
from prettytable import PrettyTable


def get_ip_location():
    """ Geolocate IP via API """
    ip = input(f'Escribe la IP que se va a localizar: ')
    response = requests.get(f'http://ip-api.com/json/{ip}').json()
    location_data = {
        "ip": ip,
        "city": response.get("city"),
        "region": response.get("region"),
        "country": response.get("country"),
        "latitude": response.get("lat"),
        "longitude": response.get("lon"),
        "org": response.get("org")
    }
    myTable = PrettyTable(['IP','Ciudad','Región','País','Latitud','Longitud','ISP'])
    print(f'{ip} Localizada')
    myTable.add_row([location_data['ip'],location_data['city'],location_data['region'],location_data['country'],
                     location_data['latitude'],location_data['longitude'],location_data['org']])
    print(myTable)


status = True
while status:
    print(80 * "*")
    print('Bienvenido/a')
    print(80 * "*")
    print('Selecciona una opción:\n')
    print('1. Ubicar IP de forma directa')
    print('\n Salir(s)')
    print(80 * "*")
    selection = input('¿Qué quieres hacer? ')
    if selection == '1':
       get_ip_location()
    elif selection == 's':
        status = False
    else:
        print("La opción elegida no es correcta")


Y eso es todo, ojalá a alguien le sirva para sus proyectos personales y si usted llegó hasta aca y no entendió nada de lo que dije no se preocupe le dejo el enlace a mis próximos cursos sólo da click aquí
Un abrazo!!!
Goz