Función PHP para obtener la ciudad por IP

Snippet PHP para obtener la ciudad de un usuario con PHP. El calculo se realiza a partir de la IP del usuario.

Tag PHP

Con el siguiente snippet PHP podrás obtener la ciudad de un usuario tan solo utilizando su IP.  El snippet es una función PHP que podrás incorporar a tus helpers y con la cual podrás saber en un instante la ciudad de cualquier usuario que visite un sitio web, sin necesidad de que este se percate de ello.

Este código resulta especialmente útil cuando no haces uso de la geolocalización del navegador con javascript o el usuario decide no compartir su ubicación con tu sitio a través del navegador.

function obtener_ciudad($ip) {
        
        $default = 'DESCONOCIDA';

        $curlopt_useragent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)';
        
        $url = 'http://ipinfodb.com/ip_locator.php?ip=' . urlencode($ip);
        $ch = curl_init();
        
        $curl_opt = array(
            CURLOPT_FOLLOWLOCATION  => 1,
            CURLOPT_HEADER      => 0,
            CURLOPT_RETURNTRANSFER  => 1,
            CURLOPT_USERAGENT   => $curlopt_useragent,
            CURLOPT_URL       => $url,
            CURLOPT_TIMEOUT         => 1,
            CURLOPT_REFERER         => 'http://' . $_SERVER['HTTP_HOST'],
        );
        
        curl_setopt_array($ch, $curl_opt);
        
        $content = curl_exec($ch);
        
        if (!is_null($curl_info)) {
            $curl_info = curl_getinfo($ch);
        }
        
        curl_close($ch);
        
        if ( preg_match('{<li>City : ([^<]*)</li>}i', $content, $regs) )  {
            $city = $regs[1];
        }
        if ( preg_match('{<li>State/Province : ([^<]*)</li>}i', $content, $regs) )  {
            $state = $regs[1];
        }

        if( $city!='' && $state!='' ){
          $location = $city . ', ' . $state;
          return $location;
        }else{
          return $default; 
        }
        
    }

¿Cómo se cálcula la ciudad con tan solo conocer la IP?

El script PHP que te he mostrado, cómo habrás visto, no hace uso de ninguna base de datos ni tampoco realiza ningún calculo excepcional. Te preguntaras ¿Cómo ha calculado la ciudad de la IP? El proceso es más sencillo de lo que parece y se logra gracias a la información que muestra una página en concreto http://ipinfodb.com/ip_locator.php

En este script lanzo una petición cURL a la url http://ipinfodb.com/ip_locator.php con un dato de tipo GET: ip. Al hacer esto el servidor de la página devuelve una página HTML legible para el usuario con la información de la ciudad y de la provincia de la IP. Con un poco de maña y el uso de una función PHP recuperamos el contenido HTML relacionado con la Ciudad y el Estado.

Las distintas funciones utilizadas para lograr recuperar la ciudad y estado basándonos en la IP son:

  1. Función php curl_setopt_array() y función php curl_exec(). Estas funciones permiten realizar conexiones con sitios web al igual que si de un navegador web se tratase. De esta forma podríamos crear, por ejemplo, una especie de arañacrawler como GOOGLE.
  2. Función preg_match() de PHP para buscar patrones con expresiones reguales (RegExp). Esta función la utilizamos para buscar los bloques HTML que contienen la información relativa a la Ciudad y el Estado de la IP.

Modificaciones de futuro para obtener la ciudad basándonos en la IP

No me gustaría terminar este artículo sin comentarte un dato que puede ser obvio para algunos pero que para tí tal vez no lo sea: es posible que este snippet PHP deje de funcionar. ¿Por qué? Pues porque tal vez la página de destino que visita nuestro script cambie en algún aspecto.

Veamos los posibles cambios que pueden afectar al script:

  1. Cambio de diseño web: solucionar este error es sencillo, tan solo tendrás que inspeccionar el nuevo código HTML resultado de la página y buscar un nuevo patrón para obtener la ciudad o cualquier otro dato que se obtenga con la IP indicada.
  2. Cambio de parámetro GET o cambio de URL: Si lo que cambia es el nombre del parámetro o la URl del sitio  tan solo deberemos actualizar la composiciónd e la URL.

Sobre el autor

Javier Gómez Redactor en Srcodigofuente.es

Javier Gómez

Ingeniero técnico en informática de gestión. Desarrollador web freelance y profesor de desarrollo web a partes iguales. Testarudo autodidacta, creativo, perfeccionista y alma libre.

Cargando comentarios

Utilizamos "cookies" para información estadística. Si continúas navegando aceptas su uso.