Muy interesante, pero hay algo que no entendi, por un lado decis que:
"Primero que nada, un número de IP es tan sólo eso, no dice a qué paÃs fue asignado, segundo, un número puede pertenecer a un paÃs durante un tiempo, luego ser vendido a otro, en todo caso hace falta una tabla de conversión más o menos fiable. "
Y por otro la gente de MaxMind dice tener la tabla de relacion IPv4 (decimal)/Pais al que pertenece.. ¿Porque es 100% esa tabla?
Geolocalizar números de IP
Hace un par de años, cuando intenté retomar mi carrera, en un TP (si, me tocó hacer un TP) quise aprovechar el tráfico de este site para armar el proyecto, básicamente habÃa que hacer un sistema que tomase datos reales (las stats de un sitio son un lindo ejemplo de ello) y realizase varas operaciones. Eso servÃa como dato, pero lo que querÃa hacer en el proyecto involucraba detectar de qué paÃs era cada número de IP de ustedes.
Lindo problema, nunca me habÃa encontrado con la necesidad, pero hoy por hoy es algo más que necesario, desde campañas de publicidad hasta estadÃsticas más o menos fieles, la geolocalización te permite mostrar contenido preferencial para algún paÃs, ocultarlo para otro o simplemente avisarle al usuario que hay algo especial si viene de X destino, algo que tan sólo con el número de IP no se puede obtener, hace falta algo más.
Ese algo más es lo que les explicaré en este post con la solución que hay dando vueltas y cómo implementarla en cualquier proyecto.
Primero que nada, un número de IP es tan sólo eso, no dice a qué paÃs fue asignado, segundo, un número puede pertenecer a un paÃs durante un tiempo, luego ser vendido a otro, en todo caso hace falta una tabla de conversión más o menos fiable.
La gente de Maxmind tiene una versión "lite" para los pobres que no necesitamos más y luego te venden paquetes mucho más completos que incluyen hasta las ciudades, regiones, proveedores, velocidades, etc. Por lo pronto lo único que necesitaba yo era saber el paÃs, asà que pude optar por la versión gratuita.
La base de datos GeoIP que ofrece Maxmind en su versión lite se puede descargar de dos formas, un archivo binario .dat accesible con sus APIs o una linda lista CSV que se puede meter desde en un excel hasta un SQL de cualquier tipo, eso a gusto del usuario.
Ahora bien, según ellos el .dat es más eficiente, ofrecen código para muchos lenguajes, también benchmarks por si no les creemos, fáciles de testar, el tema es que en SQL es una búsqueda entre números, en el .dat puede utilizar otros algoritmos de búsqueda más cómodos para este tipo de resultado.
La tabla en particular hace una conversión decimal de los números de IP, para aquellos que quieran trabajar sin usar el código de MaxMind pueden hacerlo uds mismos, no es tan difÃcil.
Un ejemplo en PHP para obtener el valor decimal de un número de IP (IPV4)
$parts = explode(".", $ip);
$numeric_ip = $parts[3] + (256 * $parts[2]) + (256 * 256 * $parts[1]) + (256 * 256 * 256 * $parts[0]);
Como verán es bastante boludo, tan sólo un explode para separalo en sus cuatro partes, luego se hacen múltiplos y se suma todo, esto nos dará un número entero y la búsqueda se hace entre esos números.
En MySQL ya existe una forma de hacerlo:
SELECT ip_country
FROM geoip
WHERE
INET_ATON("174.36.207.186") BETWEEN begin_ip_num AND end_ip_num
LIMIT 1
Gracias a la funcoón INET_ATON que hace exactamente lo mÃsmo, sólo pasamos el número de IP y listo, obtenemos el decimal
La tabla tiene rangos y código de paÃs y nombre, entonces la búsqueda es bastante fácil, hay que obtener "entre qué y qué" estás y ya obtendrás el dato de paÃs. Obviamente depende del uso que le des la performance que pueda tener esto.
Por ejemplo, yo lo implementé en este blog, sólo para usuarios registrados, en el área de usuarios online, allà podrán ver la banderita de cada paÃs por cada usuario con sesión activa, se muestran los que estuvieron en el sitio en los últimos 250 segundos creo.
Para hacerlo creé una función sencilla que llame al código PHP que ellos ofrecen, preferà saltear la opción MySQL y consultar directo en el .dat, la razón de esto es performance, pero de paso para probar si realmente era mejor:
include("geoip/geoip.inc");
function consultaGeoIP($ip)
{
$gi = geoip_open("/home/fabioco/public_html/plugins/geoip/GeoIP.dat",GEOIP_STANDARD);
$pais = geoip_country_code_by_addr($gi, $ip);
geoip_close($gi);
return $pais;
}
Podemos obtener también el nombre del paÃs pero yo querÃa el código de dos letras, luego me busqué unas banderitas que respetasen el código, encontré un buen set completÃsimo en GoSquared que tiene banderas de tamaños diversos, 16×16, 24×24, 32×32, 48×48, y 64×64. Me quedé solamente con las de 16 pixeles, más no hacÃa falta, son como 241 archivos PNG con un total de 57.369 bytes , digamos que no es muy pesado y seguramente uno no recibe tanta variedad de visitas, no creo que nadie de Burkina Faso visite el blog (chequeo Analytics: en los últimos 3 años recibà 10 visitas de Burkina Faso, me cagó el Analytics)
Tan sólo llamando a código de paÃs + .png ya tenemos la imagen de la bandera del paÃs visitante, obviamente hay casos en los que no tendremos paÃs alguno, todo puede fallar, pueden ponerle una bandera pirata si quieren para esos casos
Y asà quedó:
Ahora bien ¿Para qué me sirve? en mi caso sucede a veces que tengo campañas que son exclusivas para ciertos paÃses, uno podrÃa vender todo el stock de impresiones si es que fuese un banner, pero ¿que pasa si uno tiene un concurso o un post en particular? podrÃa segmentarlo por paÃs fácilmente con este recurso, no es que sea lo idealm pero sirve.
Por otra parte, supongamos que uno es un disidente rabioso de su paÃs que lo persigue, nadie se enterarÃa de mucho si filtrase a su propio paÃs, claro, es el disidente más inútil de todos los tiempos, algo asà como una Yoani Sanchez
Pero en términos prácticos sirve mucho para ofrecer distinto contenido para distintos públicos, un ejemplo serÃa un sitio de noticias que podrÃa "priorizar" notas locales a cada visitante sólo por la zona desde donde viene.
Yo no soy muy partidario de "negar" información a alguien que viene de una locación en particular, me parece detestable encima que no exista forma de tener una vista por default y que uno, en tal caso, tenga la opción. Muchos cometen este error con el tema del idioma ¿Quien cuernos te dijo que yo quiero ver la versión española de tu sitio que es un 10% de la versió en inglés? varios sitios famosos cometen este "crimen" de la web.
Es subestimar bastante al usuario, pero sà se puede organizar diferente el contenido, que tenga prioridad el contenido local sin eliminar el internacional, es una buena opción.
Después, como en el caso de las banderitas, es tan sólo un capricho
Otros posts que podrÃan llegar a gustarte...
Comentarios
-
quiero mi banderita en los comments!

Edit. solo vi dos usuario online registrados, y uno sos vos! /FOREVER-ALONE
-
Hackkpo dijo:
Muy interesante, pero hay algo que no entendi, por un lado decis que:
"Primero que nada, un número de IP es tan sólo eso, no dice a qué paÃs fue asignado, segundo, un número puede pertenecer a un paÃs durante un tiempo, luego ser vendido a otro, en todo caso hace falta una tabla de conversión más o menos fiable. "
Y por otro la gente de MaxMind dice tener la tabla de relacion IPv4 (decimal)/Pais al que pertenece.. ¿Porque es 100% esa tabla?
el tema es este, sà o sà necesitás una tabla de conversión porque la relación IP-paÃs no es constante.
entonces tenés que estar actualizando cada cierto tiempo la base que generan los de MaxMind, ellos estan todo el tiempo laburando eso (es su negocio, por eso te venden las bases de datos más complejas)
si quisieras mantener vos una tabla semejante actualizada deberÃas vivir haciendo un whois de tooodos los rangos de ip del mundo, un laburo al pedo que mejor que lo haga otro.
también podrÃas hacer un whois por cada visitante que tenés, pero ahà el costo es mucho mayor, esta es la solución eficiente, claro
-
luis barrios dijo:
quiero mi banderita en los comments!

¿para? antes mejor serÃa poner un sistema de puntuación de comentarios que también estuve pensando...
-
Fabio Baccaglioni dijo:
luis barrios dijo:
quiero mi banderita en los comments!

¿para? antes mejor serÃa poner un sistema de puntuación de comentarios que también estuve pensando...
para que? solo porque podes hacerlo!
es buena lo de la puntuacion, pero solo para usuarios registrados. sino cualquier troll vota negativo a cualquier cosa
-
luis barrios dijo:
Fabio Baccaglioni dijo:
luis barrios dijo:
quiero mi banderita en los comments!

¿para? antes mejor serÃa poner un sistema de puntuación de comentarios que también estuve pensando...
para que? solo porque podes hacerlo!
es buena lo de la puntuacion, pero solo para usuarios registrados. sino cualquier troll vota negativo a cualquier cosa
eso desde ya, privilegio de usuario registrado, asà los trolls tienen su merecido a merced de uds
-
¿Cuando vas a unificar los usuarios para todos los sitios? (Fabio, LDV, TG, Opinology).

TodavÃa me debes los stats de (# comments / # views)
-
eduqlm dijo:
¿Cuando vas a unificar los usuarios para todos los sitios? (Fabio, LDV, TG, Opinology).

TodavÃa me debes los stats de (# comments / # views)
jamás, no me interesa en lo más mÃnimo, son sitios totalmente separados que quiero que tengan vida propia, TG ni siquiera tiene usuarios, LDV debe vivir por su propia cuenta, y mi blog seguirá siendo siempre mÃo asà que no me ineteresa y no lo creo conveniente.
con respecto a las stats, cuando tenga ganas y tiempo de ponerme con el SQL del blog para ver eso
-
Gracias por el artÃculo: me hiciste acordar del tema y me puse a revisar hace cuánto no actualizaba la lista de IPs (manejo todo en mi servidor, porque chequeo todas las visitas para presentar precios/publicidad según el paÃs a cada uno de los usuarios, registrados o no).
Resultó que desde el 2008 no corrÃa la actualización.
Ahora estoy poniéndome al dÃa.
-
en ubuntu o derivados se puede hacer:
$ apt-get install php5-geoip
y con esto ya se tendria todo lo necesario para usar las funciones de geoip http://www.php.net/manual/en/ref.geoip.php
-
Walter dijo:
en ubuntu o derivados se puede hacer:
$ apt-get install php5-geoip
y con esto ya se tendria todo lo necesario para usar las funciones de geoip http://www.php.net/manual/en/ref.geoip.php
si, es una buena opción pero en la mayorÃa de los hostings no incluyen la extensión asà que estás dependiendo de que el sysadmin tenga buena onda, si encima tu site está en un host de esos grandes, olvidate, nunca lo instalarán
lo bueno de la versión nativa es la performance, claro.
Diego Ruiz dijo:
Gracias por el artÃculo: me hiciste acordar del tema y me puse a revisar hace cuánto no actualizaba la lista de IPs (manejo todo en mi servidor, porque chequeo todas las visitas para presentar precios/publicidad según el paÃs a cada uno de los usuarios, registrados o no).
Resultó que desde el 2008 no corrÃa la actualización.
Ahora estoy poniéndome al dÃa.
jajaja en números de IP eso si que estaba desactualizado
-
el viernes después de pagar 5 CUC (un poco mas de 5 USD) pude tener acceso a internet en CUBA, y entre otras cosas q hice en esa meda hora fue entrar a FABIO.COM.AR, menos mal q no me geo bloqueaste!
-
justino dijo:
el viernes después de pagar 5 CUC (un poco mas de 5 USD) pude tener acceso a internet en CUBA, y entre otras cosas q hice en esa meda hora fue entrar a FABIO.COM.AR, menos mal q no me geo bloqueaste!
pero nene, cómo voy a bloquear a los hermanos cubanos que apenas navegan!
-
Vos escribis:
Tan sólo llamando a código de paÃs + .png ya tenemos la imagen de la bandera del paÃs visitante, obviamente hay casos en los que no tendremos paÃs alguno, todo puede fallar, pueden ponerle una bandera pirata si quieren para esos casos
el codigo de pais que te devuelve son 2 letras (AR, BR, FR) y los pngs son los nombres...
No entiendo lo de "Codigo de pais + .png"...
Saludos.
-
Axel Wdoviak dijo:
Vos escribis:
Tan sólo llamando a código de paÃs + .png ya tenemos la imagen de la bandera del paÃs visitante, obviamente hay casos en los que no tendremos paÃs alguno, todo puede fallar, pueden ponerle una bandera pirata si quieren para esos casos
el codigo de pais que te devuelve son 2 letras (AR, BR, FR) y los pngs son los nombres...
No entiendo lo de "Codigo de pais + .png"...
Saludos.
los PNG que yo bajé tienen de nombre dos letras (el código) y la extensión, fijate bien cual bajaste!
