Ruby である IP アドレスがどの国・地域に属するものなのかを調べてみたくなった。IP アドレスから国・地域を調べるには MaxMind の提供するデータベースを参照すると良いらしい。
有償版 の GeoIP2 と無償版 の GeoLite2 があり、有償版のほうが精度が高いようだ。が今回はそこまでの精度を求めないし趣味でやっている事なので無償版を利用する事にした。
無償版のデータベースは以下からダウンロードできる。
http://dev.maxmind.com/ja/geolite2/
City と Country の二種類がある。国だけでなく都市まで調べるなら City を選ぶ。
Ruby から上記 MaxMind のデータベースを利用するには maxminddb gem を利用すると良い。
https://github.com/yhirose/maxminddb
試しにブログが動いているサーバーの IP アドレスを検索してみた。
db = MaxMindDB.new('./GeoLite2-City.mmdb') # ダウンロードしたデータベースを指定する
ret = db.lookup('49.212.217.57')
ret.found? # => true
ret.country.name # => "Japan"
ret.city.name # => "Osaka"
さくらの VPS の大阪リージョンなのでデータは合っているようだ。
国名や都市名は多言語に対応しているので、以下のように言語を指定して取得できる。
ret.country.name(:ja) # => "日本"
ret.country.name(:es) # => "Japón"
ret.country.name(:ru) # => "Япония"
ret.city.name(:ru) # => "Осака"
ret.city.name(:de) # => "Ōsaka"
# rails で i18n 使ってるなら以下のような感じで表示できる
ret.country.name(I18n.locale)
他には ISO コードとか緯度経度、タイムゾーンも取得できる。
ret.country.iso_code # => "JP"
ret.location.latitude # => 34.6864
ret.location.longitude # => 135.52
ret.location.time_zone # => "Asia/Tokyo"
Google Map で検索したところ 34.6864,135.52 は大阪府庁の座標だった。
通常 IP アドレスから利用者の住所を取得することは警察でも無い限りできないが、国・都市レベルまでならこうやって取得が可能だ。
ちなみに MaxMindDB の正確さは国によるが日本では 72% のようだ。データベースが必ず正しいというわけではないのでそこは注意が必要だろう。
https://www.maxmind.com/en/geoip2-city-database-accuracy
コメント