Me resulta sorprendente que Google no ofrezca ningún servicio o método en Google App Engine para obtener la localización geográfica a partir de la IP. Es algo que ellos tienen más que resuelto, y no veo motivo por el cual no lo ofrezcan a los desarrolladores en la parte del servidor (en la parte del cliente se puede usar google.loader.ClientLocation en javascript)
Por suerte, este es un problema que se puede resolver fácilmente de dos maneras distintas.
Solución 1: haciendo peticiones a otro servidor
Hacer peticiones HTTP a http://geoip.wtanaka.com/ y éste nos devolverá el código de país:
Por ejemplo para saber el país de la dirección 72.14.235.121 sólo habría que hacer una petición a http://geoip.wtanaka.com/cc/72.14.235.121
Para código sobre cómo hacer este tipo de peticiones, podeis echarle un vistazo a http://code.google.com/p/geo-ip-location/wiki/GoogleAppEngine
Solución 2: implementarlo en el propio servidor
A mi esta otra solución me gusta más. Se trata símplemente de bajarse la última versión de GeoIP.dat y usarla con la librería pygeoip.py
Luego es tan fácil como hacer:
def getCountryByIP (remote_addr): GEOIP = pygeoip.Database('GeoIP.dat') info = GEOIP.lookup(remote_addr) return info.country
Nótese que la librería no está pensada para hacer esto así, ya que cada vez que se llama a pygeoip.Database se carga el archivo entero a una cadena en memoria, y, en principio, a nosotros nos interesaría cargarlo sólo una única vez.
Por otra parte, en mi caso sólo me interesaba hacer un único lookup, así que cargar el archivo a memoria no tenía mucho sentido.
He actualizado la librería para permitir dos modos. El modo cargarlo a memoria (mejor si vas a hacer cientos de lookups), y el modo acceder directamente al archivo en disco (mejor si vas a hacer pocos lookups, ya que consume menos memoria y tarda igual o incluso menos).
Aquí os dejo el archivo pygeoip.py con mis cambios. Para usarlo he añadido la función disk_lookup:
pygeoip.disk_lookup (remote_addr)
Para hacer un único lookup va más rápido y consume infinitamente menos memoria.
Desde aquí quiero felicitar a David Wilson, el autor de esta librería, porque ha sido muy fácil implementar estos cambios (por supuesto le he mandado un e-mail, ahora es cosa suya incluir mis cambios o no hacerlo).
English
288 Comments on "GeoIP en Google App Engine"
Trackbacks
[...] GeoIP en Google App Engine [...]
[...] Geolocalización en Google App Engine [...]