LaravelでIPアドレスを元にロケール判別する

GeoIp2 Laravel PHP フレームワーク プログラミング ライブラリ

LaravelでIPアドレスを元にロケール判別する方法について調べた事をまとめます。

IPアドレスによるロケール判別の基礎

IPアドレスは地域インターネットレジストリ- Regional Internet Registry(RIR) -(Wikipedia参照)という団体によって管理されており、IPアドレスは地域ごとに割り当てられています。

この団体が管理するデータベースを使うことで、IPアドレスから地域を判別する事が可能になります。

IPアドレスによるロケール判別ができるサービス

IPアドレスを検索するサービスが民間、個人で提供されています。

以下その1例です

その他、個人で運営しているウェブサイトもちらほら存在します。

仕組みとしてはRIRで提供されているデータベースと照合するという方法になっている思われます。

IPアドレスによるロケール判別API

自分のアプリケーションで実装する場合もRIRからデータを取得し、IPアドレスを照合するという方法で実装できそうですが、楽できる方法があるなら利用したいところです。

有名なのがMaxMindが提供しているGeoLite2というデータベースおよびAPIです。

GeoLite2 Free Downloadable Databases « MaxMind Developer Site

有料版もありますが、無料版でも地域の特定には十分と思われます。

ライセンス表記すれば商用利用も可という事で、これを使うのが楽そうです。

PHPライブラリは以下となっています。

maxmind/GeoIP2-php: PHP API for GeoIP2 webservice client and database reader

Laravel用 GeoLite2 パッケージ

GeoLite2のAPIをLaravelで簡単に使えるようにパッケージを作っている方がいらっしゃいました。

danielme85/laravel-geoip2: Service provider and DB downloader for Maxminds PHP API GeoIP2.

こちらを利用させて頂きます。

Laravelを使わない素のPHPでの使い方はこちら

使い方はREADMEにある通りなのですが、英語なのでいちおう翻訳しつつ説明します。

以下、Laravel6.2で動作確認済です。

インストール

composer.jsonに以下を追加します。

"require": {
        "danielme85/laravel-geoip2": "dev-master",
        ....
}

またはコマンドでインストールします。

> composer require danielme85/laravel-geoip2

GeoLite2のライセンスキー取得

GeoLite2のウェブサイトからライセンスを取得します。

GeoLite2 Free Downloadable Databases « MaxMind Developer Site

「SIGN UP FOR GEOLITE2のボタンをクリック。

必要事項を記入していきます。

メールで届いたリンクをクリックするとパスワード登録フォームが表示されます。


パスワードを設定したらログインします。

ログインするとこんな画面になります。

左側のメニューの「My License Key」を選択し、「Generate new license key」ボタンをクリック。

「License key description」にキーの名前をを入れます。

「Will this key be for GeiIP Update?」はYesにしておきます。データベースを自動更新するツールがあるようで、このライセンスキーを更新ツールに使うか聞かれているようです。

「Generate a license key and config file for use with geoipupdate version 3.1.1 or newer」にチェックを入れます。新しいバージョンのツールを使うか、古いバージョンを使っているかを選ぶようです。

Confirmを押すとライセンスキーが発行されます。


.envにGEOIP2のライセンスキーを設定する

Laravelの.envファイルにGeoIP2のライセンスキーを設定します。

GEOIP2_LICENSE=XXXXX

configファイルの配置

以下のコマンドでlaravel-geoip2の設定ファイルを自分のプロジェクトに配置します。

> php artisan vendor:publish --provider="danielme85\Geoip2\Geoip2ServiceProvider"

コピーされた設定ファイルは以下のようになっています。

 'https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&suffix=tar.gz', //url db file download
    'folder' => 'app/geoip2', //storage location folder to store Geoip2 files.
    'filename' => 'GeoLite2-City.mmdb',
    'localhost' => '8.8.8.8', //when running on localhost (or for general testing) you can specify a fake ip address here.
    'license' => env('GEOIP2_LICENSE', '')
];

GeoIPデータのダウンロード

下記コマンドでGeoIPデータをダウンロードします。

> php artisan geoip:download

storage/app/geoip2以下にgeoipファイルがダウンロードされます。

動作確認

以下のようにして国コードを取得できます。

use danielme85\Geoip2\Facade\Reader;

$reader = Reader::connect();
$result = $reader->city('xxx.xxx.xxx.xxx'); // グローバルIPを指定
echo $result->country->isoCode;

IPアドレスから「JP」や「US」といった国コードを取得できるようになりました。

他にも都道府県、市区町村、郵便番号なども取得できます。

郵便番号は多少ズレます。

国コードと言語コード

国コードが決まっても、言語が決まるわけではありません。その逆も然りです。

日本の場合は日本=日本語として問題ありませんが、国によっては複数の公用語を持っている場合があります。

複数の国で使われている言語もあります。英語がその代表です。

言語の決定についてはある程度ルールを決めて自動的に言語を割り当てるか、ユーザーが選択可能にするか、アプリケーションごとの検討事項になると思います。

ロケール判別について調べた事は以上です。

コメント/ピンバック

  1. […] LaravelでIPアドレスを元にロケール判別する […]

  2. […] LaravelでIPアドレスを元にロケール判別するLaravelでIPアドレスを元にロケール判別する方法について調べた事をまとめます。mrkmyki.com2020.01.20 […]

タイトルとURLをコピーしました