Геоданные по вашему IP

Написано 15/12/2008

Неожиданным образом явилась задачка по определению географических координат исходя из IP-адреса.

После некоторых раздумий, мучений и испытаний, родилось решение:

<!--- получаем IP через форму и передаём его на whois-api.com --->
<cfhttp url="http://www.whois-api.com/?#form.ip#" method="GET" useragent="Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14"/>
    <cfif IsXML(cfhttp.filecontent)>
      <cfset x = XMLParse(cfhttp.filecontent)>
      <cfset geodata = StructNew()>
      <cfif not structkeyexists(x, "ipdata")>
         <cfset geodata.error = 1>
         <cfset geodata.msg = cfhttp.filecontent>
      <cfelse>
         <cfset geodata.error = 0>
         <cfif structkeyexists(x.ipdata, "ip")>
            <cfset geodata.ip = x.ipdata.ip.xmltext>
         </cfif>
         <cfif structkeyexists(x.ipdata, "code")>
            <cfset geodata.code = x.ipdata.code.xmltext>
         </cfif>
         <cfif structkeyexists(x.ipdata, "country")>
            <cfset geodata.country = x.ipdata.country.xmltext>
         </cfif>
         <cfif structkeyexists(x.ipdata, "city")>
            <cfset geodata.city = x.ipdata.city.xmltext>
         </cfif>
         <cfif structkeyexists(x.ipdata, "areacode")>
            <cfset geodata.areacode = x.ipdata.areacode.xmltext>
         </cfif>
         <cfif structkeyexists(x.ipdata, "area")>
            <cfset geodata.area = x.ipdata.area.xmltext>
         </cfif>
         <cfif structkeyexists(x.ipdata, "isp")>
            <cfset geodata.isp = x.ipdata.isp.xmltext>
         </cfif>
         <cfif structkeyexists(x.ipdata, "organization")>
            <cfset geodata.organization = x.ipdata.organization.xmltext>
         </cfif>
         <cfif structkeyexists(x.ipdata, "location")>
            <cfset geodata.latitude = x.ipdata.location.mm.latitude.xmltext>
            <cfset geodata.longitude = x.ipdata.location.mm.longitude.xmltext>
         </cfif>
      </cfif>
   <cfelse>
      <cfset geodata = cfhttp.filecontent>
   </cfif>
<cfif isstruct(geodata)>
    <cfoutput>
    IP: #geodata.ip#<br>
    Код страны: #geodata.code#<br>
    Страна: #geodata.country#<br>
    Город: #geodata.city#<br>
    Широта: #geodata.latitude#<br>
    Долгота: #geodata.longitude#<br>
    Код территории: #geodata.areacode#<br>
    Территория: #geodata.area#<br>
    Провайдер: #geodata.isp#<br>
    Точное название провайдера: #geodata.organization#
    </cfoutput>
<cfelse>
    <cfoutput>
    #geodata#
    </cfoutput>
</cfif>

Удачи!