はじめに
IPアドレスから国名や都市名を判別する方法は、ApacheやAWS Route53等で可能なのですが、アプリケーション内で判別したいケースもあるかな(ないかな?)と思いましたのでまとめました。
今回利用するリソース
MaxMindさんの GeoIP2-php
および GeoLite 2データベース
を使います。
※データベースは無料版を使います(データの更新は毎月第一火曜日とのことです。)
導入手順
GeoIP2-php
composerでインストールインストールします。
$ ./composer.phar require geoip2/geoip2:~2.0
~~~合わせてインストールされたpackageが表示(割愛)~~~
$
GeoLite 2データベース
https://dev.maxmind.com/geoip/geoip2/geolite2/
のページ下部にある「Downloads」より、
- GeoLite2 Country
- GeoLite2 City
の「MaxMind DB binary, gzipped」をダウンロードします。
ダウンロード後は、以下の2ファイルを使います。
- GeoLite2-Country.mmdb
- GeoLite2-City.mmdb
実装例
国名までの情報があれば良い場合は「GeoLite2-Country.mmdb」、都市名まで情報が欲しい場合は「GeoLite2-City.mmdb」をロードすれば良いようです。
<?php
require './vendor/autoload.php';
use GeoIp2\Database\Reader;
// ダウンロードしたバイナリを指定
$reader = new Reader('./db/GeoLite2-City.mmdb');
// チェックしたいIPアドレスを指定
$abeshi = $reader->city('128.101.101.101');
// IPアドレスの各情報を取得
var_dump($abeshi->country->isoCode); //国コード
var_dump($abeshi->country->name); //国名
var_dump($abeshi->country->names['ja']); //国名(日本語)
var_dump($abeshi->city->name); //都市名
var_dump($abeshi->city->names['ja']); //都市名(日本語)
$ php ./test.php
string(2) "US"
string(13) "United States"
string(21) "アメリカ合衆国"
string(10) "Saint Paul"
string(18) "セントポール"
$
さいごに
以上を活用すれば、アプリケーション内で国や都市によって挙動を変える実装ができますが、
IP geolocation is inherently imprecise.
「IP位置情報は本質的に不正確です」とある通り、過信して利用しない方が良いようです。