読者です 読者をやめる 読者になる 読者になる

パルカワ2

PerlとRubyとイチャラブ

IPアドレスからそれっぽい位置情報を取得したい

IPアドレスからそれっぽい位置情報を取得したい気がしてきたのでちょっと調べた。

調べたら、MaxMindなるものがあるらしい。
https://www.maxmind.com/ja/home

しかも、よくよく調べてみると無料っぽいのもあるではないか!便利!
http://dev.maxmind.com/geoip/geoip2/geolite2/

gemで探してみたらあった。

https://github.com/da4nik/geoip2
https://github.com/YotpoLtd/geoip2

geoip2が2つあったが、da4nik/geoip2はCライブラリに依存していていろいろ出来、
YotpoLtd/geoip2は、pure rubyapiにのみ対応しているようだった。
ちなみにrubygemsにあがっているのは、YotpoLtd/geoip2だった。

登録せずに無料で使える http://dev.maxmind.com/geoip/geoip2/geolite2/ のバイナリを試したかったので、
上の https://github.com/da4nik/geoip2 を使ってみる。

他のPythonとかのライブラリも同様なのだけど、 https://github.com/maxmind/libmaxminddb が必須で、インストールしておく必要がある。

brew install libmaxminddb
# Gemfile
source 'https://rubygems.org'
gem 'geoip2', github: 'da4nik/geoip2'

# test.rb
require 'geoip2'
require 'pp'

GeoIP2::file './GeoLite2-City.mmdb' # ダウンロードしてきて解凍したヤツ
GeoIP2::locale 'en' # デフォルトがロシア語なので気をつける

city = GeoIP2::locate '77.93.127.33'
pp city
__END__
{"city"=>"Tambov",
 "city_geoname_id"=>484646,
 "country"=>"Russia",
 "country_geoname_id"=>2017370,
 "country_code"=>"RU",
 "continent"=>"Europe",
 "continent_code"=>"EU",
 "continent_geoname_id"=>6255148,
 "subdivision"=>"Tambovskaya Oblast'",
 "subdivision_code"=>"TAM",
 "subdivision_geoname_id"=>484638,
 "postal_code"=>nil,
 "latitude"=>52.731700000000004,
 "longitude"=>41.4433,
 "time_zone"=>"Europe/Moscow"}

なるほど。
Perl版とかもあって、それっぽく使える。(SYNOPSISコピペ)

use GeoIP2::Database::Reader;

my $reader = GeoIP2::Database::Reader->new(
    file    => '/path/to/database',
    locales => [ 'en', 'de', ]
);

my $omni = $reader->omni( ip => '24.24.24.24' );
my $country = $omni->country();
say $country->is_code();

参考URL