ip to country en php

23 de septiembre de 2008

Una de las aplicaciones que tengo en mi empresa me permite distribuir contenido (manuales, presentaciones, etc) que son descargadas desde Internet. Para controlar desde que parte del mundo se realizan registro, en un archivo de log que país a realizado la descarga. Para ello me baso en la dirección IP que proporciona la variable REMOTE_ADDR de la petición.

Recomiendo ver la nota sobre detección de direcciones IP en PHP cuando estamos utilizando proxy.

Para hacer la conversión IP-pais, utilizo un servicio que proporciona www.webhosting.info. Realizo una llamada a esta página y obtengo un HTML con la respuesta. Luego solo tengo que rastrear el HTML y cortar allí donde dice en nombre del país. Este es el código de la función PHP.
A la función le pasamos la dirección IP (formato a.b.c.d) y esta nos devuelve un string con el nombre del país.

function iptocountry($ip_address) {  
 $url = "http://ip-to-country.webhosting.info/node/view/36";
     
 $inicio = "belongs to ";
 $ch = curl_init();   
 curl_setopt($ch, CURLOPT_URL, $url);   
 curl_setopt($ch, CURLOPT_POST,"POST");   
 curl_setopt($ch, CURLOPT_POST, 1);   
 curl_setopt($ch, CURLOPT_POSTFIELDS, "ip_address=$ip_address");          
 ob_start();         
 curl_exec($ch);   
 curl_close($ch);
 $cache = ob_get_contents();   
 ob_end_clean();
 $resto = strstr($cache,$inici0);
 $resto = strstr($resto,"<b>");
 $resto2 = strstr($resto,"</b>");
 $pais = substr($resto,0,strlen($resto)-strlen($resto2));

 $pais = str_replace("<b>","",str_replace("\n","",trim($pais)));

 return $pais;
}
Esta función se basa en una que encontré por Internet pero no recuerdo de quien era.

Para llamarla podemos hacer algo como:
echo iptocountry("89.129.175.55");
echo iptocountry($_SERVER["REMOTE_ADDR"]);
Para todas aquellas IP que no se sepan traducir se devolverá la cadena "Some Place We Dont Know About". Es el caso de las direcciones IP de clase A, B, C y D.

Para hacer funcionar esta función vuestro PHP tiene que tener soporte para las librerias CURL.

Más información:
+ http://ip-to-country.webhosting.info/node/view/36
+ http://en.wikipedia.org/wiki/Country_IP_database