flatray.com | 戻る 更新日時: 2021-01-21

MaxMind GeoLite2への移行方法(perl)

perl で旧来の GeoIP モジュールを使っていたプログラムを GeoLite2 対応に変更する方法です。

GeoIP の頃の書き方の例

use Geo::IP;

$geoip = Geo::IP->new(GEOIP_STANDARD);

# IPアドレスで解決
$result = $geoip->country_code_by_addr($ip);
# ホスト名で解決
$result = $geoip->country_code_by_name($host);

GeoLite2 での書き方の例

use GeoIP2::Database::Reader;

my $reader = GeoIP2::Database::Reader->new(
    file    => "/usr/share/GeoLite2/GeoLite2-Country.mmdb",
    locales => [ 'en', 'ja', ]
    );

# IPアドレスで解決
my $country = $reader->country( ip => $ip )->country->iso_code();
# (ホスト名で解決する方法は標準では提供されていません)

簡単移行モジュール

プログラムを簡単に修正するためのモジュールを作成しました。

GeoIP_emulate.pm

MaxMind GeoLite2の利用方法 の方法でデータベースやコンフィグを設定している前提です。 そうでなければ以下の ConfigReader::Simple の行は削除し $config->get("MMDB") をデータベースファイル名に変更してください。

use ConfigReader::Simple;

...

    my $config = ConfigReader::Simple->new("/usr/share/GeoLite2/config");
    my $geoip = GeoIP2::Database::Reader->new(
        file    => $config->get("MMDB"),
        locales => [ 'en', 'ja', ]
    );

GeoIP_emulate.pm は以下で表示されるエラーメッセージの @INC のディレクトリのどこかに設置してください。

perl -e 'use no_such_module'

そして perl のプログラムを次のように修正してください。

use Geo::IP;
$geoip = Geo::IP->new(GEOIP_STANDARD);
↓
use GeoIP_emulate;
$geoip = GeoIP_emulate->new();

GeoIP_emulate.pm をプログラムと同じディレクトリに置く場合は、上記より前に以下を追加してください。

use FindBin;
use lib $FindBin::Bin;

(以上)