web-dev-qa-db-ja.com

Ruby on Rails

訪問者のIPアドレスからユーザーの国名を抽出したい。

remote_ipでIPアドレスを取得できました。しかし、国名を取得する最も簡単な方法は何でしょうか?

正確である必要はありません。これを行うにはRubyライブラリ(gemまたはプラグイン))?

私はこのためのシンプルで簡単な解決策を求めています。

35
TK.

geoipgemを使用できます。

environment.rb

config.gem 'geoip'

GeoIP.dat.gzhttp://www.maxmind.com/app/geolitecountryからダウンロードします。ファイルを解凍します。以下は、#{Rails_ROOT}/dbディレクトリの下を想定しています。

@geoip ||= GeoIP.new("#{Rails_ROOT}/db/GeoIP.dat")    
remote_ip = request.remote_ip 
if remote_ip != "127.0.0.1" #todo: check for other local addresses or set default value
  location_location = @geoip.country(remote_ip)
  if location_location != nil     
    @model.country = location_location[2]
  end
end
49
Chandra Patni

" Geocoder "を使用することもできます

それはあなたの人生を楽にするだけです。 Gemfileに次の行を入れ、bundle installコマンドを発行します

gem 'geocoder'

このGemを使用すると、元のIPの国、IP、または都市を簡単に取得できます。以下の例を参照してください

request.ip  # =>    "182.185.141.75"
request.location.city   # =>    ""
request.location.country    # =>    "Pakistan"
29
Nadeem Yasin

私はこのワンライナーを使用しています:

locale = Timeout::timeout(5) { Net::HTTP.get_response(URI.parse('http://api.hostip.info/country.php?ip=' + request.remote_ip )).body } rescue "US"
9
stef

最も簡単なのは、これに既存のWebサービスを使用することです。

モデルをジオロケーション対応(geokit-Rails)にするなど、さらに多くのことを実行できるプラグインがありますが、たとえば国コードだけが必要な場合は、HTTPGetをhttp://api.hostip.info/country.phpに送信するだけです(他のサービスですが、これはAPIキーを必要としません)はそれを返します、例えば:

Net::HTTP.get_response(URI.parse('http://api.hostip.info/country.php'))
=> US


または、ポーリング http://api.hostip.info/ は、都市、緯度、経度などを含む完全なXML応答を返します。

得られる結果は100%正確ではないことに注意してください。たとえば、今はフランスにいますが、ドイツと同じように報告されています。これは、ほとんどすべてのIPベースのサービスに当てはまります。

6
JRL

これを行うために使用できるサービスの1つは、私自身のサービスです https://ipinfo.io 。それはあなたに国コードと他の多くの詳細を与えます:

$ 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"
}

国だけが必要な場合は、/countryをリクエストして取得できます。

$ curl ipinfo.io/country
US

次に、 http://country.io のデータを使用するか、 http://ipinfo.io/developers/full)の例を使用して、国コードから名前にマップできます。 -国名

5
Ben Dowling

作成した IPLocate.io API のgemを公開しました。

非常に簡単で、ダウンロードするデータベースがなく、1日あたり1,500件の無料リクエストがあります。

require 'iplocate'

# Look up an IP address
results = IPLocate.lookup("8.8.8.8")

# Or with an API key
results = IPLocate.lookup("8.8.8.8", "abcdef")

results["country"]
# "United States"

results["country_code"]
# "US"

results["org"]
# "Google LLC"

results.inspect
# {
#   "ip"=>"8.8.8.8",
#   "country"=>"United States",
#   "country_code"=>"US",
#   "city"=>nil,
#   "continent"=>"North America",
#   "latitude"=>37.751,
#   "longitude"=>-97.822,
#   "time_zone"=>nil,
#   "postal_code"=>nil,
#   "org"=>"Google LLC",
#   "asn"=>"AS15169"
# }  

宝石なし

RubyのNet::HTTPURIを使用するだけで、gemなしで使用することもできます。

response = Net::HTTP.get( URI.parse( "https://www.iplocate.io/api/lookup/8.8.8.8" ) )

リクエストはJSONを返すため、次のように解析してアクセスできます。

country = JSON.parse( response )["country"]
# => "US"
2
ttarik

geoip gemは、新しいMaxMindデータベースでは機能しなくなりました。これを行う新しい宝石があります MaxMind-DB-Reader-Ruby

MaxMind からCityまたはCountryバイナリのgzipされたデータベースをダウンロードし、解凍して、次のようなコードを使用します。

require 'maxmind/db'

reader = MaxMind::DB.new('GeoIP2-City.mmdb', mode: MaxMind::DB::MODE_MEMORY)

# you probably want to replace 1.1.1.1 with  request.remote_ip
# or request.env['HTTP_X_FORWARDED_FOR']
ip_addr = '1.1.1.1'
record = reader.get(ip_addr)
if record.nil?
  puts '#{ip_addr} was not found in the database'
else
  puts record['country']['iso_code']
  puts record['country']['names']['en']
end

reader.close

ニーズに基づいて適応します。必要に応じて呼び出すことができる初期化子でメソッドを作成しました。

2
Artelius

Yandex locator gem を試すことができます。サービスは経度、緯度、精度を返します。

conn = YandexLocator::Client.new
result = conn.lookup(ip: "109.252.52.39")
# => {"position"=>{"altitude"=>0.0, "altitude_precision"=>30.0, "latitude"=>55.75395965576172, "longitude"=>37.62039184570312, "precision"=>100000.0, "type"=>"ip"}}
1
Sergey Chechaev

Gem geoip は新しいgem maxminddb に置き換えることができます。新しいMaxMindデータベース形式をサポートします。

db = MaxMindDB.new('./GeoLite2-City.mmdb')
ret = db.lookup('74.125.225.224')

ret.found? # => true
ret.country.name # => 'United States'
ret.country.name('zh-CN') # => '美国'
ret.country.iso_code # => 'US'
ret.city.name(:fr) # => 'Mountain View'
ret.subdivisions.most_specific.name # => 'California'
ret.location.latitude # => -122.0574
1
Pioz

IP2LocationRubyをお試しください

https://github.com/ip2location/ip2location-Ruby

前提条件

http://lite.ip2location.com/ から無料のLITEデータベースをダウンロードし、以下を使用してください。

インストール

gem install ip2location_Ruby

使用法

require 'ip2location_Ruby'

i2l = Ip2location.new.open("./data/IP-COUNTRY-SAMPLE.BIN")
record = i2l.get_all('8.8.8.8')

print 'Country Code: ' + record.country_short + "\n"
print 'Country Name: ' + record.country_long + "\n"
print 'Region Name: ' + record.region + "\n"
print 'City Name: ' + record.city + "\n"
print 'Latitude: '
print record.latitude
print "\n"
print 'Longitude: '
print record.longitude
print "\n"
print 'ISP: ' + record.isp + "\n"
print 'Domain: ' + record.domain + "\n"
print 'Net Speed: ' + record.netspeed + "\n"
print 'Area Code: ' + record.areacode + "\n"
print 'IDD Code: ' + record.iddcode + "\n"
print 'Time Zone: ' + record.timezone + "\n"
print 'Zip Code: ' + record.zipcode + "\n"
print 'Weather Station Code: ' + record.weatherstationname + "\n"
print 'Weather Station Name: ' + record.weatherstationcode + "\n"
print 'MCC: ' + record.mcc + "\n"
print 'MNC: ' + record.mnc + "\n"
print 'Mobile Name: ' + record.mobilebrand + "\n"
print 'Elevation: '
print record.elevation
print "\n"
print 'Usage Type: ' + record.usagetype + "\n"
1
Vlam

これがRuby ipdata.co APIを呼び出す例です。

10個のグローバルエンドポイントがそれぞれ1秒あたり10,000を超えるリクエストを処理できるため、高速で信頼性の高いパフォーマンスが得られます。

この回答では、非常に制限された「テスト」APIキーを使用しており、いくつかの呼び出しをテストすることのみを目的としています。 サインアップ 独自の無料APIキーを使用して、開発のために毎日最大1500件のリクエストを取得します。

78.8.53.5を、検索する任意のIPに置き換えます

require 'rubygems' if Ruby_VERSION < '1.9'
require 'rest_client'

headers = {
  :accept => 'application/json'
}

response = RestClient.get 'https://api.ipdata.co/78.8.53.5?api-key=test', headers
puts response

それはあなたに与えるでしょう

{
    "ip": "78.8.53.5",
    "is_eu": true,
    "city": "G\u0142og\u00f3w",
    "region": "Lower Silesia",
    "region_code": "DS",
    "country_name": "Poland",
    "country_code": "PL",
    "continent_name": "Europe",
    "continent_code": "EU",
    "latitude": 51.6557,
    "longitude": 16.089,
    "asn": "AS12741",
    "organisation": "Netia SA",
    "postal": "67-200",
    "calling_code": "48",
    "flag": "https://ipdata.co/flags/pl.png",
    "emoji_flag": "\ud83c\uddf5\ud83c\uddf1",
    "emoji_unicode": "U+1F1F5 U+1F1F1",
    "carrier": {
        "name": "Netia",
        "mcc": "260",
        "mnc": "07"
    },
    "languages": [
        {
            "name": "Polish",
            "native": "Polski"
        }
    ],
    "currency": {
        "name": "Polish Zloty",
        "code": "PLN",
        "symbol": "z\u0142",
        "native": "z\u0142",
        "plural": "Polish zlotys"
    },
    "time_zone": {
        "name": "Europe/Warsaw",
        "abbr": "CEST",
        "offset": "+0200",
        "is_dst": true,
        "current_time": "2018-08-29T15:34:23.518065+02:00"
    },
    "threat": {
        "is_tor": false,
        "is_proxy": false,
        "is_anonymous": false,
        "is_known_attacker": false,
        "is_known_abuser": false,
        "is_threat": false,
        "is_bogon": false
    },
}
1
Jonathan