如何从IP地址找出用户的国家和城市?

时间:2014-06-22 15:54:16

标签: ruby-on-rails ruby-on-rails-4 ip-address geocoding

我知道我可以获得用户的IP地址:

remote_ip = request.remote_ip

现在我想知道如何从他的IP地址中找出用户的国家和城市?我发现这只买国家:

http://api.hostip.info/country.php

城市可以这样找到:

http://api.hostip.info

问题是它没有正确显示城市。我目前在世界上最大的城市之一,它说这是一个未知的城市。

从他的IP地址中找出用户所在国家/地区和城市的最佳方法是什么?我正在寻找一个免费的解决方案,或者至少是非常便宜的东西。

谢谢:)

4 个答案:

答案 0 :(得分:10)

您可以尝试geocoder gem通过IP地址获取位置:

Geocoder.search('5.18.186.107').first.city # => "Saint Petersburg"
Geocoder.search('213.180.204.26').first.country # => "Turkey"

甚至使用没有过渡操作的内置功能:

# somewhere in your action
result = request.location # returns Geocoder::Result object

默认情况下,它使用http://freegeoip.net/服务进行IP解析,因此如果您不想使用任何其他宝石,可以使用REST API与其进行通信。

答案 1 :(得分:1)

您可以尝试我的API,https://ipinfo.io。它默认返回JSON,包含许多不同的字段:

$ curl ipinfo.io
{
  "ip": "24.6.61.239",
  "hostname": "c-24-6-61-239.hsd1.ca.comcast.net",
  "city": "Mountain View",
  "region": "California",
  "country": "US",
  "loc": "37.3845,-122.0881",
  "org": "AS7922 Comcast Cable Communications, LLC",
  "postal": "94040"
}

每天最多可提供1000个请求。有关详细信息,请参阅https://ipinfo.io/developers

答案 2 :(得分:0)

您可以使用IP地址运行WHOIS。我不确定这是否可以通过代码完成,但如果您只想为几个IP执行此操作,那么http://www.tools.whois.net/whoisbyip/等网站可以提供包括城市位置在内的信息。我相信不同的网站提供不同深度的信息。

答案 3 :(得分:0)

另一个解决方案是将ruby gem用于Yandex定位器(https://tech.yandex.ru/locator/)。 Yandex定位器是一种在圆圈描绘的区域中查找移动设备的服务。该服务返回经度,纬度和精度。 https://github.com/sergey-chechaev/yandex_locator

client = YandexLocator::Client.new(api_key: 'api key', version: '1.0')
result = client.lookup(ip: { address_v4: '178.247.233.3' })
result.position
# => {"altitude"=>0.0, "altitude_precision"=>30.0, "latitude"=>41.00892639160156, "longitude"=>28.96711158752441, "precision"=>100000.0, "type"=>"ip"}