Geolocalización con IP [Ejemplos en PHP]

En este artículo veremos como determinar la ubicación de una persona utilizando su dirección IP, con esto podremos determinar el país y ciudad desde donde alguien se conecta a internet.

Puedes ver como funcionará el programa que vamos a crear, para mostrar los datos de geolocalización, haz clic en el enlace y mira si ese es tu país y ciudad.

Contenido del artículo:

¿Cómo funciona la geolocalización con IP?

Cuando te conectas a Internet, necesitas una dirección IP pública, y es pública porque cualquiera computadora con que te comunicas puede saber tu IP, de esa forma saben a quién enviar la información que solicitan (por ejemplo una página web).

De hecho puedes hacer clic en este enlace si te preguntas cuál es mi IP y podrás ver tu IP pública.

Las direcciones IP están asignadas por bloques a cada país, y a su vez también están asignadas a ciudades. Por ejemplo el rango de direcciones IP desde 2.56.64.0 a 2.56.64.22 están asignadas a España, si alguien se conecta a Internet usando una dirección IP en ese rango, entonces podemos saber que está en España.

Ahora, para conocer la ciudad y país desde donde se conecta alguien, solo necesitamos descargar una base de datos que nos permita conseguir la relación de direcciones IP y ciudades y países.

¿Cómo determinar el país y cuidad de un visitante usando PHP?

Lo primero que debemos hacer es descargar una base de datos, podemos usar la base de datos de MaxMind, pero antes necesitamos registrarnos, para esto podemos usar este enlace.

Crear una cuenta en MaxMind, para descargar una base de datos de geolocalización.

Al llenar el formulario recibirás un correo electrónico con un enlace para que puedas crear una clave para tu usuario, en mi caso tenía que copiar la dirección y pegarla en el navegador.

Email que recibes para activar la clave de tu cuenta de MAXMIND

Ahora puedes ir a la sección de descargas y te pedirá tu usuario (email) y clave. Aquí debes descargar la base de datos que se muestra en esta imagen:

Debes descargar la base de datos GeoLite2 City

El archivo está comprimido en formato tar.gz si usas Linux no tendrás problema para descomprimirlo, pero si usas Windows puedes descargar el programa 7zip para descomprimir el archivo. Cuando lo descomprimas busca el archivo GeoLite2-City.mmdb y lo copias en la carpeta que vas a crear más adelante.

Ahora vamos a crear un archivo de PHP para usar la base de datos, también vamos a necesitar instalar una librería usando Composer.

Crea una carpeta e ingresa a una consola de comandos, desde la consola ingresa en la carpeta que creaste y ejecutas estos dos comandos:

composer init
composer require geoip2/geoip2:~2.0

Ahora abres tu editor de texto favorito y creas un archivo de PHP y agregas este código:

<?php

require 'vendor/autoload.php';
use GeoIp2\Database\Reader;

$reader = new Reader('GeoLite2-City.mmdb');

$record = $reader->city('2.56.64.22');

print($record->country->isoCode . '<br>');
print($record->country->name . '<br>'); 
print($record->mostSpecificSubdivision->name . '<br>');
print($record->city->name . '<br>');

En el código anterior, creamos un objeto de la clase Reader y le pasamos como parámetro el nombre y ruta del archivo que descargaste de MaxMind (GeoLite2-City.mmdb), luego usamos el método city y le mandamos la dirección IP para obtener la información. Luego podemos obtener los datos como código de país, nombre del país, nombre de la ciudad y un nombre de ubicación más especifico.

En este código usamos una dirección IP fija. Para obtener la dirección IP del visitante a la página web, podemos hacer estos cambios en donde uso una función para obtener la dirección IP, este es el código completo (recuerda que para que funcione debes haber ejecutado los comandos de Composer para obtener las librerías que necesitamos)

<?php

require 'vendor/autoload.php';
use GeoIp2\Database\Reader;

$reader = new Reader('GeoLite2-City.mmdb');

// Consultamos la direccion IP del visitante
// usando la funcion getUserIP()
$record = $reader->city(getUserIP());

//Imprimir información de geolocalización.
print($record->country->isoCode . '<br>');
print($record->country->name . '<br>'); 
print($record->mostSpecificSubdivision->name . '<br>');
print($record->city->name . '<br>'); 


/*
    Funcion para obtener la direccion IP del visitante
*/
function getUserIP() {
    if (isset($_SERVER['HTTP_CF_CONNECTING_IP']))
    {
        $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
        $_SERVER['HTTP_CLIENT_IP'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
    }
    $client  = @$_SERVER['HTTP_CLIENT_IP'];
    $forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
    $remote  = $_SERVER['REMOTE_ADDR'];

    if (filter_var($client, FILTER_VALIDATE_IP))
    {
        $ip = $client;
    }
    elseif (filter_var($forward, FILTER_VALIDATE_IP))
    {
        $ip = $forward;
    }
    else
    {
        $ip = $remote;
    }

    return $ip;
}

Conclusiones

El código funciona bastante bien y la base de datos es bastante confiable, pero debes tener en cuenta que existen algunas formas en que los visitantes pueden ocultar su verdadera dirección IP.

Algunas empresas como Netflix usan geolocalización para determinar el contenido al que tendrás acceso.

Otras compañías utilizan geolocalización para ofrecer precios competitivos según el país del visitante.

Espero que hayas disfrutado el artículo, si fue así o si tienes alguna duda, por favor deja un comentario.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *