Welcom ,I hope yo will enjoy here!

Rails:通过IP地址确定城市

一、对于Rails而言,主流方式应该是使用google库的插件geoip

github地址: https://github.com/simplificator/geoip

 

    require 'geoip'  
    GeoIP.new('GeoLiteCity.dat').country('www.atlantis.sk')  
    => ["www.atlantis.sk", "217.67.18.26", "SK", "SVK", "Slovakia", "EU", "02", "Bratislava", "", 48.15, 17.1167, nil, nil, "Europe/Bratislava"]  
      
    Returned values are the requested hostname, the IP address as a dotted quad,  
    Maxmind's country code, the ISO3166-1 country code, the ISO3166-2 country code,  
    the ISO3166 country name, and the continent code.  
      
    GeoIP.new('GeoCity.dat').city('github.com')  
    => ["github.com", "207.97.227.239", "US", "USA", "United States", "NA", "CA", "San Francisco", "94110", 37.7484, -122.4156, 807, 415, "America/Los_Angeles"]  
      
    Returned values are the country values followed by region or state name,  
    city name, postal_code/zipcode, latitude, longitude, USA DMA code, USA area code,  
    timezone name. Sorry it's not a Hash... historical.  
      
    GeoIP.new('GeoIPASNum.dat').asn("www.fsb.ru")  
    => ["AS8342", "RTComm.RU Autonomous System"]  

 

二、另一个geo_ip

使用之前需要在http://ipinfodb.com/ 注册一个用户,激活时可以获得自己的key。需要用自己的key来访问该网站的接口。

github地址: https://github.com/jeroenj/geo_ip

    # 209.85.227.104 = google.be (US)  
      GeoIp.geolocation('209.85.227.104')  
    #returns:  
      
      {  
        :status           =>"OK",  
        :ip               =>"209.85.227.104"  
        :country_code     =>"US",  
        :country_name     =>"United States",  
        :region_code      =>"06",  
        :region_name      =>"California",  
        :city             =>"Mountain View",  
        :zip_postal_code  =>"94043",  
        :latitude         =>"37.4192",  
        :longitude        =>"-122.057"  
      }  

 

      geokithttp://geokit.rubyforge.org/)是一个关于地理的工具,比如根据经纬度确定城市和距离之类,可以结合geo_ip做地理分析

    #Find near latitude and longitude:  
    Store.find(:all, :origin =>[37.792,-122.393], :within=>10)  
    #Find near an address:  
    Store.find(:all, :origin=>'100 Spear st, San Francisco, CA', :within=>10)  
    #Order by distance from the center of a zipcode:  
    Store.find(:all, :origin=>'94117', :within=>10,  
               :order=>'distance asc')  
    #Combine distance conditions with regular conditions  
    Store.find(:all, :origin=>'94117', :within=>10,   
               :conditions=>{:store_type=>'CAFE'})  

 

三、过网络的IP查询API

这个办法IP库更新比较快。通用的库有几个比如google。

xml处理页面完全可以通过nokogiri等专门处理工具代替。

提供IP地址查询的API很多比如网易:

1.http://www.youdao.com/smartresult-xml/search.s?type=ip&q=IP地址

2. http://ip2loc.appspot.com/ #含有详细实例讲解, 但是由于GWF地址可能解析不到

3. 新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js

4. 新浪多地域测试方法:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=218.192.3.42

   #这个比较全,但是有个别ip解析的不对,打个数据库没有更新吧。。。。

5. 搜狐IP地址查询接口(默认GBK):http://pv.sohu.com/cityjson

6. 搜狐IP地址查询接口(可设置编码):http://pv.sohu.com/cityjson?ie=utf-8

7. 搜狐另外的IP地址查询接口:http://txt.go.sohu.com/ip/soip

 

示例:

require "open-uri"
require 'rubygems'
require 'json'
#如果有GET请求参数直接写在URI地址中
uri = 'http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=218.192.3.42'
response = nil
open(uri) do |http|
  response = http.read
end 

#response = Iconv.conv( "gb2312", "utf-8", response)
@res = JSON::parse(response)
p @res 

参考:http://hlee.iteye.com/blog/745533

posted on 2012-07-02 12:39  北国的雨  阅读(1171)  评论(0编辑  收藏  举报

导航