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

Tahoo!!

自分の勉強していること(コンピュータ関連 / ネットワーク / セキュリティ / サーバ)や趣味について書いていきます

GeoIP2を使ってIPアドレスの情報を取得 (PHP編)

PHPIPアドレスから国や地域を取得できる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>

結果

f:id:takahoyo:20150119200059p:plain

変数に格納されている情報

どの変数にどの情報が保存されているのかを下表に示す。(上記サンプルコードのようにデータベースを読み込んだ場合)

変数 情報
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'));

日本語データベースを利用した時の結果は以下のようになる。

f:id:takahoyo:20150119200118p:plain