MaxMindのGeoLite2を使ってIPアドレスからロケール情報を取得するLaravelパッケージを使ってみます。
試すのはこちら。
danielme85/laravel-geoip2
この記事の説明はパッケージのリポジトリのREADMEとほぼ同じ内容ですが、Laravel6での説明が無かったので確認したものです。
以下Laravel6.2で動作確認しています。
概要
以下のような流れです。
- パッケージインストール
- ライセンスキー取得、設定
- configのコピー
- GeoIPデータのダウンロード
- 動作確認
成功すると以下のようなコードで国コードが取得できます。
use danielme85\Geoip2\Facade\Reader;
$reader = Reader::connect();
$result = $reader->city('xxx.xxx.xxx.xxx'); // グローバルIPを指定
echo $result->country->isoCode; // 「JP」「US」などが出力される
パッケージインストール
composerでインストールします。
> composer require danielme85/laravel-geoip2
GeoLite2のライセンスキー取得
下記サイトからMaxMindのアカウントを作成、ダッシュボードからライセンスキーを取得します。
無料です。
GeoLite2 Free Downloadable Databases « MaxMind Developer Site
画面付きのライセンスキー取得の説明は以下。
LaravelでIPアドレスを元にロケール判別する – mrkmyki@フリーランスブログ
.envにGEOIP2のライセンスキーを設定する
Laravelの.envに取得したライセンスキーを設定します。
GEOIP2_LICENSE=XXXXX
configファイルの配置
laravel-geoip2のconfigを自分のプロジェクトにコピーします。
> php artisan vendor:publish --provider="danielme85\Geoip2\Geoip2ServiceProvider"
GeoIPデータのダウンロード
IPアドレスのデータベースファイルをダウンロードします。
ダウンロードファイルは30MB、解凍後のファイルは60MBほどあります。
> php artisan geoip:download
storage/app/geoip2/GeoLite2-City.mmdb
にファイルがダウンロードされます。
実際に運用する際には定期的にどこかでダウンロードしておいてWebサーバに配置する感じでしょうか。
動作確認
以上で動くようになりました。
use danielme85\Geoip2\Facade\Reader;
$reader = Reader::connect();
$result = $reader->city('xxx.xxx.xxx.xxx'); // グローバルIPを指定
echo $result->country->isoCode; // 「JP」「US」などが出力される
国コードの他に、都道府県、市区町村、郵便番号などが取得できます。
精度は完璧ではありませんが、市区町村まではほぼ合ってそうです。
アクセス制限やマーケティングデータの収集、ロケールごとの言語やページの切り替えに使えると思います。
以上です。
他、ロケール判別について調べた事を少し書いています。
LaravelでIPアドレスを元にロケール判別する