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.:
Publicar un comentario