miércoles, 19 de enero de 2011

ASP.NET - Obtener ip, pais, ciudad, region del usuario

get_ip_country_city Este también es un tema muy frecuente en foros y nunca pasa de moda.
La solución que les propongo es obtener tales datos a partir del uso de un web service gratuito que proporcionan en este sitio web:
http://freegeoip.appspot.com/

Para obtener los datos de país, ciudad o región, debemos pasarle como parámetro a este web service la IP del usuario, osea… debemos obtener primero la IP.

Adicionalmente diré que este servicio web ofrece varias alternativas de devolución de datos: XML, JSON, CSV… uds eligen el formato que prefieran manipular.

En este post yo voy a recuperar la información en formato XML, preferiría el formato JSON, pero recuerdo que por allí había un ejemplo en JSON, así que decidí variar.
Para obtener los datos en formato XML, debo construir la uri en este estilo:
http://freegeoip.appspot.com/xml/ + IP

De igual manera, si quisiera JSON sería
http://freegeoip.appspot.com/json/ + IP

Más información en el mismo web site ;)

Este es el código completo:
Dim ipAddress As String = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
If IsNothing(ipAddress) Then ipAddress = Request.ServerVariables("REMOTE_ADDR")

Dim xmlString As String
Using web As New Net.WebClient()
xmlString = web.DownloadString("http://freegeoip.appspot.com/xml/" & ipAddress)
End Using

Dim UTF8 As New System.Text.UTF8Encoding()
Dim xmlStream As New IO.MemoryStream(UTF8.GetBytes(xmlString))

Dim nav As System.Xml.XPath.XPathNavigator
Dim doc As System.Xml.XPath.XPathDocument
doc = New System.Xml.XPath.XPathDocument(xmlStream)
nav = doc.CreateNavigator()

Dim Status As String = nav.Select("//Response/Status")(0).ToString
If Status(0).ToString = "true" Then

Dim IP As String = nav.Select("//Response/Ip")(0).ToString
Dim CountryName As String = nav.Select("//Response/CountryName")(0).ToString
Dim RegionName As String = nav.Select("//Response/RegionName")(0).ToString

ltIP.Text = String.Format("{0}<br />{1}<br />{2}", IP, CountryName, RegionName)
Else
'error
End If


Como ven es bien reducido. Lo que hago es obtener un string xml y lo recorro para obtener los datos que me interesan.

Pero el XML además retorna más información, que tal vez también les interese, como código de país, etc…

Este es el xml que devuelve.

<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Status>true</Status>
<Ip>x.x.x.x</Ip>
<CountryCode>BR</CountryCode>
<CountryName>Brazil</CountryName>
<RegionCode>27</RegionCode>
<RegionName>Sao Paulo</RegionName>
<City>São Paulo</City>
<ZipCode></ZipCode>
<Latitude>-23.5333</Latitude>
<Longitude>-46.6167</Longitude>
</Response>

Espero que les sea de utilidad ;)

No hay comentarios.: