PHPでIPアドレスから国や地域を取得できるGeoIP2を使ってIPアドレスの解析したのでやり方等のメモ。
MaxMind - GeoIP2: 業界をリードする IP 情報収集
データベースのダウンロード
GeoIP2には、更新頻度が高い有料版と、有償版よりも更新頻度が低い無料版がある。
有料版と無料版の違い等は、以下のブログに詳しく書いてある。
今回は、特に商用のサービスを使う訳ではないので、無料版を使う。
GeoIP2無料版のデータベースのダウンロードは以下から可能。
GeoLite2 « Maxmind Developer Site
GeoLite2 CountryがIPアドレスから国を取得するデータベース、GeoLite2 CityがIPアドレスから地域を取得するデータベースである。 データベースを配置している場所を今回は/usr/local/share/GeoIP/にしたが、別の場所でも大丈夫である。
# mkdir /usr/local/share/GeoIP/ # cd /usr/local/share/GeoIP/ # wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz # gunzip GeoLite2-Country.mmdb.gz # wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz # gunzip GeoLite2-City.mmdb.gz
インストール
APIのインストールはComposerを使う。
Github上の公式ページが参考になる。
Composerのインストール
Composerをダウンロードために以下を実行。
$ curl -sS https://getcomposer.org/installer | php
成功するとcomposer.pharと呼ばれるファイルが出来るので、これを/usr/local/binに配置してコマンドとして実行できるようにする。
# mv composer.phar /usr/local/bin/composer
GeoIP2 PHP APIのインストール
次に利用するプロジェクトルートのディレクトリで以下のコマンドを実行すると、GeoIP2 PHP APIのインストールが始まる。
$ composer require geoip2/geoip2:~2.0
ディレクトリ内に、composer.json, composer.lockというファイルとvendorというディレクトリが出来ていれば完了。
使ってみる
以下のGithubのページを参考に、データベースを読み込んでIPアドレスから地域の情報を取得してみる。
サンプルコード
<?php require_once 'vendor/autoload.php'; use GeoIp2\Database\Reader; // データベースの読み込み $reader = new Reader('/usr/local/share/GeoIP/GeoLite2-City.mmdb'); $ip_addr = '157.7.205.139'; $record = $reader->city($ip_addr); //takahoyo.net ?> <html> <head> <meta charset='utf-8'> </head> <body> <?php print("IP Address : ".$ip_addr."<br>\n"); print("Country : ".$record->country->name . "<br>\n"); print("<br>\n"); print("Subdivision : ".$record->mostSpecificSubdivision->name . "<br>\n"); // print("<br>\n"); print("City: ".$record->city->name . "<br>\n"); print("<br>\n"); print("Latitude : ".$record->location->latitude . "<br>\n"); print("Longitude : ".$record->location->longitude . "<br>\n"); ?> </body> </html>
結果
変数に格納されている情報
どの変数にどの情報が保存されているのかを下表に示す。(上記サンプルコードのようにデータベースを読み込んだ場合)
変数 | 情報 |
---|---|
record->continent->name | 大陸名 |
record->continent->code | 大陸コード |
record->country->name | 国名 |
record->country->isoCode | 国名コード |
record->mostSpecificSubdivision->name | 州・県 |
record->mostSpecificSubdivision->isoCode | 州・県コード |
record->city->name | 都市名 |
record->location->latitude | 都市の緯度 |
record->location->longitude | 都市の経度 |
record->location->timeZone | 都市のタイムゾーン |
他にもいろいろあるけど、有用そうなのはこんな感じかなと。
日本語データベースの利用
データベースを読み込む時に、Readerの第2引数に以下のようにする。
$reader = new Reader('/usr/local/share/GeoIP/GeoLite2-City.mmdb',array('ja'));
日本語データベースを利用した時の結果は以下のようになる。