GeoIP2/GeoLite2 を使いIPアドレスから国情報取得!

IPアドレスの Geoロケーション情報

WordPress プラグインで日本製のプラグインを識別出来る方法がないか探していると MaxMind の GeoIP2 という IP アドレスから国情報を取得できるライブラリがあるというのを知り使ってみました

使用するには composer を使ってインストールします

準備

composer

composer ? 名前は知っていましたが、使ったことありません (^_^;)

composer は、PHPライブラリの導入や依存関係を管理してくれるツールです
ライブラリの管理はプロジェクト単位に行こなわれ、他のプロジェクトには干渉しないようになっています

また、ライブラリを利用する時には autoload が使えます

require __DIR__ . '/vendor/autoload.php';

これだけ記述しておけばクラスを使用するときに必要に応じて自動的に必要なモジュールを読み込んでくれます

インストール

Installation – Windows

Windows のローカル開発環境 XAMPP に構築してみます

Windows用のインストーラもあるようですが、今回はコマンドラインからインストールしてみます

c:\xampp\php でコマンドプロンプトを開いて下記を実行

php -r "readfile('https://getcomposer.org/installer');" | php

じぇじぇ 失敗です (^_^;)

clip_image001

エラーになる場合は、php.ini の extension=php_openssl.dll が有効になっているか確認して、コメントアウトされていたら ; を取ります

もう一回

image

OK のようです

Php ディレクトリに composer.phr が出来ているはずなので、これを Windows7 でコマンドとして実行できるよう composer.bat ファイルにして、バージョン表示されるか確認します

image

Php ディレクトリ以外でも実行できるように C:\xampp\php を環境変数の path に追加しておきます

これで、composer が使えるようになりました。

composer について詳しく知りたい方は、ここらへんの記事を参照することをお勧めしてお茶を濁しておきます (^_^;)

Composerを使ってPHPのパッケージを簡単インストール
 本連載では、Composerを使ったパッケージ管理を紹介します。PHPではデフォルトでインストールされているPEARがありますが、最近では、Composerというパッケージ管理ツールも使われつつあります。例えば、JavaなどではMavenのようなツールでパッケージ管理をしたり、Rubyではbundlerといったパッケージ管理が使われるなど、現在では多くの言語でパッケージ管理ツールが使われています。
Composerを使ってPHPのパッケージを簡単インストール

 

GeoIP2 ライブラリ

今回は WordPress の wp-plugin-ranking というプラグインを作り、そのプラグインだけで使えればOKなので、そこをプロジェクトルートとしてインストールします

プロジェクトルートへ移り、そこから下記コマンドを実行すればOKです

composer require geoip2/geoip2:~2.0

image

インストールされました すばらしい じぇじぇじぇ (^^)

 

GeoLite2 データベース

次にライブラリで使用するデータベースを導入します

GeoLite Databases and Web Services
MaxMind offers free geolocation and ASN data in downloadable database and web service formats.
Sign Up for GeoLite Start building today with GeoLite databases and web services. Explore GeoLite Learn more about what you can do with GeoLite, and view redistribution options. Find what you need:
Understanding IP geolocation Integration Generating a license key to authenticate GeoLite GeoLite database formats Automate database downloads and updates Look up IP addresses in the GeoLite databases and web services Database fields Web service fields Resources for working with GeoLite Understanding IP geolocation IP geolocation is inherently imprecise. Locations in MaxMind’s data are often near population centers. Any location provided by GeoLite or GeoIP® should not be used to identify a particular address or household.

クリエイティブ・コモンズライセンスで使用できる無償のデータベース GeoLite2 City、GeoLite2 Country があります。

今回は国情報だけわかれば十分なのでデータベースサイズもコンパクトな GeoLite2 Country (約2.8Mバイト) を使ってみました

GeoLite2-Country.mmdb.gz をダウンロードして解凍します

解凍した GeoLite2-Country.mmdb データベースファイルをプロジェクトへアップロードします

 

実行確認

これで実行準備が出来ましたので、簡単なプログラムを作り動作を確認してみます

下記のようなPHPプログラムを作り、試しに自サイト(国内レンタルサーバー)のURLで確認してみました


//GeoIP2 ライブラリ
require_once __DIR__ . '/vendor/autoload.php';
use GeoIp2\Database\Reader;

function get_ipcountry($geodb, $url) {
    $purl = parse_url($url);
    $ip_addr = gethostbyname( $purl['host'] );
    try {
        $record = $geodb->country($ip_addr); 
        $country = $record->country->name;
    } catch (Exception $ex) {
        $country = '';
    }
    return $country;
}

$geodb = new Reader( __DIR__ . '/geo_db/GeoLite2-Country.mmdb');
$country = get_ipcountry($geodb, 'https://celtislab.net/wp_plugin_celtispack/');

NetBeans を使ってデバッガから取得データを見てみます

image

動作しているようです (^^)

 

下記サイトも参考にさせていただきました

GeoIP2を使ってIPアドレスの情報を取得 (PHP編) – Tahoo!!
PHPでIPアドレスから国や地域を取得できるGeoIP2を使ってIPアドレスの解析したのでやり方等のメモ。 MaxMind – GeoIP2: 業界をリードする IP 情報収集
GeoIP2を使ってIPアドレスの情報を取得 (PHP編) - Tahoo!!

 

使用感

WordPress プラグインの日本製プラグインを判別するのに使用してみました
どのくらいの精度なのかはわかりませんが、おおむねあっているような感じです (^^)

WordPressプラグインアンテナ – Yet Another Plugin Directory
WordPress プラグインは現在30000個以上もあるようです。その中から使用するプラグイン選ぶ時の
参考となるように人気のプラグインを紹介いたします。 日本製プラグインも応援してます (^^)

 

GeoIP2 を使うのに composer を利用したライブラリの導入はとても簡単でした

また、composer を使ったライブラリ構築は、今回のように WordPress プラグイン内で限定して使う用途にもマッチしてます

サーバー上で composer を使えるのがいろいろ自由に操作出来るので望ましいのでしょうが、レンタルサーバー上に composer がインストールされていなくても、ライブラリを含んだ形でプラグイン化してアップロードすればプラグイン自体は問題なく動作するのでお手軽です

以上

 

composer と GeoLite2 を使用したIPアドレスから国情報を取得する方法について紹介しました

次回は、$wpdb を使用した MySQL データベース処理あたりについて紹介できればと思います

 


まとめ記事紹介

go-to-top