「GeoIp2」のPHPパッケージの使い方(IPアドレスからロケール情報を取得する)

GeoIp2 PHP プログラミング ライブラリ

以下の記事で「 GeoIp2 」をLaravelで使い始めるまでの手順を書きました。

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

今回はLaravelを使わずに素のPHPでGeoIp2を使って各種ロケール情報を取得する方法について書きます。

GeoIp2を使う準備

GeoIp2を使うにはMaxMind社のウェブサイトでライセンスキーを取得する必要があります。

以下の記事にライセンスキー取得の手順を書いているので参考にして頂き、キーを取得します。IPアドレスとロケール情報の関係についても書いているのでよろしければ参考にしてください。

composerをインストールする

composerをインストールしていなければ、インストールします。

下記を参考にグローバルにインストールしておきましょう。

geoip2パッケージをインストールする

php-curlエクステンションとgitが無ければインストールしておく必要があります。

apt-get install -y php-curl
apt-get install -y git

プロジェクトのルートディレクトリに移動して、composerでgeoip2をインストールします。

mkdir project
cp project
composer require geoip2/geoip2:~2.0

composerを実行して以下のようなメッセージが表示されたら、表示されたURLにアクセスしてトークンを生成します。(GitHubアカウントが必要になると思います)

Cloning failed using an ssh key for authentication, enter your GitHub credentials to access private repos
Head to https://github.com/settings/tokens/new?scopes=repo&description=Composer+on+e5ff6649b457+2020-03-09+0437
to retrieve a token. It will be stored in "/root/.composer/auth.json" for future use by Composer.
Token (hidden):

トークンが発行されるので、これを入力します。

インストールはここまでです。

データベースファイルのダウンロード

IPアドレスとロケール情報のデータベースは以下のURLにHTTP GETリクエストするとことで取得できます。

https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&suffix=tar.gz&license_key=[ライセンスキー]

ライセンスキーはMaxMind社のウェブサイトで取得したものを使います。
ライセンスキー取得の手順については以下を参考にしてください。

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

PHPで取得する方法はいくつかありますが、HTTPクライアントのguzzleを使います。以下のコマンドでプロジェクトディレクトリにインストールします。

composer require guzzlehttp/guzzle
<?php
require 'vendor/autoload.php';

$license = 'AourlkKceW0gEETn';
$downloadUrl = 'https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&suffix=tar.gz&license_key=';
$downloadFilename = 'geoip_database.tar';
$databasePath = 'database';
$databaseFilename = 'GeoLite2-City.mmdb';

// download tar file
$client = new GuzzleHttp\Client();
$uri = $downloadUrl.$license;
$client->request('GET', $uri, ['sink' => $downloadFilename]);

// extract file
$phar = new \PharData($downloadFilename);
$phar->extractTo($databasePath);

// copy file
$dirs = array_diff(scandir($databasePath), array('..', '.'));
$folder = end($dirs);
copy("$databasePath/$folder/$databaseFilename", $databaseFilename);

// delete tmp file
unlink($downloadFilename);
array_map('unlink', glob("$databasePath/$folder/*"));
rmdir("$databasePath/$folder");
rmdir($databasePath);

プロジェクトディレクトリに「GeoLite2-City.mmdb」というファイルが出来ると思います。

これがGeoIp2で使うIPアドレスとロケール情報のデータベースファイルになります。

wgetコマンド等で手動でファイルを取得し、任意の場所に配置しても問題ありません。

データベースリーダーを使ってIPアドレスからロケール情報を取得する

ダウンロードしたデータベースを使ってロケール情報を取得するには以下のようにします。

<?php
require 'vendor/autoload.php';
use GeoIp2\Database\Reader;

$reader = new Reader('GeoLite2-City.mmdb');

$record = $reader->city('128.101.101.101');

// isoCode
print($record->country->isoCode . PHP_EOL);

// country name
print($record->country->name . PHP_EOL);

// city name
print($record->city->name . PHP_EOL);

// postal code
print($record->postal->code . PHP_EOL);

実行結果は以下です。

US
United States
Saint Paul
55108

$recordの中身を全部出してみると以下のような感じ。

var_dump($record);

// 実行結果
object(GeoIp2\Model\City)#4 (12) {
  ["city":protected]=>
  object(GeoIp2\Record\City)#13 (3) {
    ["validAttributes":protected]=>
    array(3) {
      [0]=>
      string(10) "confidence"
      [1]=>
      string(9) "geonameId"
      [2]=>
      string(5) "names"
    }
    ["locales":"GeoIp2\Record\AbstractPlaceRecord":private]=>
    array(1) {
      [0]=>
      string(2) "en"
    }
    ["record":"GeoIp2\Record\AbstractRecord":private]=>
    array(2) {
      ["geoname_id"]=>
      int(5045360)
      ["names"]=>
      array(8) {
        ["de"]=>
        string(10) "Saint Paul"
        ["en"]=>
        string(10) "Saint Paul"
        ["es"]=>
        string(10) "Saint Paul"
        ["fr"]=>
        string(10) "Saint Paul"
        ["ja"]=>
        string(18) "セントポール"
        ["pt-BR"]=>
        string(10) "Saint Paul"
        ["ru"]=>
        string(15) "Сент-Пол"
        ["zh-CN"]=>
        string(9) "圣保罗"
      }
    }
  }
  ["location":protected]=>
  object(GeoIp2\Record\Location)#14 (2) {
    ["validAttributes":protected]=>
    array(9) {
      [0]=>
      string(13) "averageIncome"
      [1]=>
      string(14) "accuracyRadius"
      [2]=>
      string(8) "latitude"
      [3]=>
      string(9) "longitude"
      [4]=>
      string(9) "metroCode"
      [5]=>
      string(17) "populationDensity"
      [6]=>
      string(10) "postalCode"
      [7]=>
      string(16) "postalConfidence"
      [8]=>
      string(8) "timeZone"
    }
    ["record":"GeoIp2\Record\AbstractRecord":private]=>
    array(5) {
      ["accuracy_radius"]=>
      int(20)
      ["latitude"]=>
      float(44.9825)
      ["longitude"]=>
      float(-93.1863)
      ["metro_code"]=>
      int(613)
      ["time_zone"]=>
      string(15) "America/Chicago"
    }
  }
  ["postal":protected]=>
  object(GeoIp2\Record\Postal)#15 (2) {
    ["validAttributes":protected]=>
    array(2) {
      [0]=>
      string(4) "code"
      [1]=>
      string(10) "confidence"
    }
    ["record":"GeoIp2\Record\AbstractRecord":private]=>
    array(1) {
      ["code"]=>
      string(5) "55108"
    }
  }
  ["subdivisions":protected]=>
  array(1) {
    [0]=>
    object(GeoIp2\Record\Subdivision)#16 (3) {
      ["validAttributes":protected]=>
      array(4) {
        [0]=>
        string(10) "confidence"
        [1]=>
        string(9) "geonameId"
        [2]=>
        string(7) "isoCode"
        [3]=>
        string(5) "names"
      }
      ["locales":"GeoIp2\Record\AbstractPlaceRecord":private]=>
      array(1) {
        [0]=>
        string(2) "en"
      }
      ["record":"GeoIp2\Record\AbstractRecord":private]=>
      array(3) {
        ["geoname_id"]=>
        int(5037779)
        ["iso_code"]=>
        string(2) "MN"
        ["names"]=>
        array(7) {
          ["en"]=>
          string(9) "Minnesota"
          ["es"]=>
          string(9) "Minnesota"
          ["fr"]=>
          string(9) "Minnesota"
          ["ja"]=>
          string(15) "ミネソタ州"
          ["pt-BR"]=>
          string(8) "Minesota"
          ["ru"]=>
          string(18) "Миннесота"
          ["zh-CN"]=>
          string(15) "明尼苏达州"
        }
      }
    }
  }
  ["continent":protected]=>
  object(GeoIp2\Record\Continent)#7 (3) {
    ["validAttributes":protected]=>
    array(3) {
      [0]=>
      string(4) "code"
      [1]=>
      string(9) "geonameId"
      [2]=>
      string(5) "names"
    }
    ["locales":"GeoIp2\Record\AbstractPlaceRecord":private]=>
    array(1) {
      [0]=>
      string(2) "en"
    }
    ["record":"GeoIp2\Record\AbstractRecord":private]=>
    array(3) {
      ["code"]=>
      string(2) "NA"
      ["geoname_id"]=>
      int(6255149)
      ["names"]=>
      array(8) {
        ["de"]=>
        string(11) "Nordamerika"
        ["en"]=>
        string(13) "North America"
        ["es"]=>
        string(13) "Norteamérica"
        ["fr"]=>
        string(17) "Amérique du Nord"
        ["ja"]=>
        string(15) "北アメリカ"
        ["pt-BR"]=>
        string(17) "América do Norte"
        ["ru"]=>
        string(31) "Северная Америка"
        ["zh-CN"]=>
        string(9) "北美洲"
      }
    }
  }
  ["country":protected]=>
  object(GeoIp2\Record\Country)#8 (3) {
    ["validAttributes":protected]=>
    array(5) {
      [0]=>
      string(10) "confidence"
      [1]=>
      string(9) "geonameId"
      [2]=>
      string(17) "isInEuropeanUnion"
      [3]=>
      string(7) "isoCode"
      [4]=>
      string(5) "names"
    }
    ["locales":"GeoIp2\Record\AbstractPlaceRecord":private]=>
    array(1) {
      [0]=>
      string(2) "en"
    }
    ["record":"GeoIp2\Record\AbstractRecord":private]=>
    array(3) {
      ["geoname_id"]=>
      int(6252001)
      ["iso_code"]=>
      string(2) "US"
      ["names"]=>
      array(8) {
        ["de"]=>
        string(3) "USA"
        ["en"]=>
        string(13) "United States"
        ["es"]=>
        string(14) "Estados Unidos"
        ["fr"]=>
        string(11) "États-Unis"
        ["ja"]=>
        string(21) "アメリカ合衆国"
        ["pt-BR"]=>
        string(14) "Estados Unidos"
        ["ru"]=>
        string(6) "США"
        ["zh-CN"]=>
        string(6) "美国"
      }
    }
  }
  ["locales":protected]=>
  array(1) {
    [0]=>
    string(2) "en"
  }
  ["maxmind":protected]=>
  object(GeoIp2\Record\MaxMind)#9 (2) {
    ["validAttributes":protected]=>
    array(1) {
      [0]=>
      string(16) "queriesRemaining"
    }
    ["record":"GeoIp2\Record\AbstractRecord":private]=>
    array(0) {
    }
  }
  ["registeredCountry":protected]=>
  object(GeoIp2\Record\Country)#10 (3) {
    ["validAttributes":protected]=>
    array(5) {
      [0]=>
      string(10) "confidence"
      [1]=>
      string(9) "geonameId"
      [2]=>
      string(17) "isInEuropeanUnion"
      [3]=>
      string(7) "isoCode"
      [4]=>
      string(5) "names"
    }
    ["locales":"GeoIp2\Record\AbstractPlaceRecord":private]=>
    array(1) {
      [0]=>
      string(2) "en"
    }
    ["record":"GeoIp2\Record\AbstractRecord":private]=>
    array(3) {
      ["geoname_id"]=>
      int(6252001)
      ["iso_code"]=>
      string(2) "US"
      ["names"]=>
      array(8) {
        ["de"]=>
        string(3) "USA"
        ["en"]=>
        string(13) "United States"
        ["es"]=>
        string(14) "Estados Unidos"
        ["fr"]=>
        string(11) "États-Unis"
        ["ja"]=>
        string(21) "アメリカ合衆国"
        ["pt-BR"]=>
        string(14) "Estados Unidos"
        ["ru"]=>
        string(6) "США"
        ["zh-CN"]=>
        string(6) "美国"
      }
    }
  }
  ["representedCountry":protected]=>
  object(GeoIp2\Record\RepresentedCountry)#11 (3) {
    ["validAttributes":protected]=>
    array(6) {
      [0]=>
      string(10) "confidence"
      [1]=>
      string(9) "geonameId"
      [2]=>
      string(17) "isInEuropeanUnion"
      [3]=>
      string(7) "isoCode"
      [4]=>
      string(5) "names"
      [5]=>
      string(4) "type"
    }
    ["locales":"GeoIp2\Record\AbstractPlaceRecord":private]=>
    array(1) {
      [0]=>
      string(2) "en"
    }
    ["record":"GeoIp2\Record\AbstractRecord":private]=>
    array(0) {
    }
  }
  ["traits":protected]=>
  object(GeoIp2\Record\Traits)#12 (2) {
    ["validAttributes":protected]=>
    array(19) {
      [0]=>
      string(22) "autonomousSystemNumber"
      [1]=>
      string(28) "autonomousSystemOrganization"
      [2]=>
      string(14) "connectionType"
      [3]=>
      string(6) "domain"
      [4]=>
      string(9) "ipAddress"
      [5]=>
      string(11) "isAnonymous"
      [6]=>
      string(16) "isAnonymousProxy"
      [7]=>
      string(14) "isAnonymousVpn"
      [8]=>
      string(17) "isHostingProvider"
      [9]=>
      string(17) "isLegitimateProxy"
      [10]=>
      string(3) "isp"
      [11]=>
      string(13) "isPublicProxy"
      [12]=>
      string(19) "isSatelliteProvider"
      [13]=>
      string(13) "isTorExitNode"
      [14]=>
      string(7) "network"
      [15]=>
      string(12) "organization"
      [16]=>
      string(13) "staticIpScore"
      [17]=>
      string(9) "userCount"
      [18]=>
      string(8) "userType"
    }
    ["record":"GeoIp2\Record\AbstractRecord":private]=>
    array(3) {
      ["ip_address"]=>
      string(15) "128.101.101.101"
      ["prefix_len"]=>
      int(21)
      ["network"]=>
      string(15) "128.101.96.0/21"
    }
  }
  ["raw":protected]=>
  array(8) {
    ["city"]=>
    array(2) {
      ["geoname_id"]=>
      int(5045360)
      ["names"]=>
      array(8) {
        ["de"]=>
        string(10) "Saint Paul"
        ["en"]=>
        string(10) "Saint Paul"
        ["es"]=>
        string(10) "Saint Paul"
        ["fr"]=>
        string(10) "Saint Paul"
        ["ja"]=>
        string(18) "セントポール"
        ["pt-BR"]=>
        string(10) "Saint Paul"
        ["ru"]=>
        string(15) "Сент-Пол"
        ["zh-CN"]=>
        string(9) "圣保罗"
      }
    }
    ["continent"]=>
    array(3) {
      ["code"]=>
      string(2) "NA"
      ["geoname_id"]=>
      int(6255149)
      ["names"]=>
      array(8) {
        ["de"]=>
        string(11) "Nordamerika"
        ["en"]=>
        string(13) "North America"
        ["es"]=>
        string(13) "Norteamérica"
        ["fr"]=>
        string(17) "Amérique du Nord"
        ["ja"]=>
        string(15) "北アメリカ"
        ["pt-BR"]=>
        string(17) "América do Norte"
        ["ru"]=>
        string(31) "Северная Америка"
        ["zh-CN"]=>
        string(9) "北美洲"
      }
    }
    ["country"]=>
    array(3) {
      ["geoname_id"]=>
      int(6252001)
      ["iso_code"]=>
      string(2) "US"
      ["names"]=>
      array(8) {
        ["de"]=>
        string(3) "USA"
        ["en"]=>
        string(13) "United States"
        ["es"]=>
        string(14) "Estados Unidos"
        ["fr"]=>
        string(11) "États-Unis"
        ["ja"]=>
        string(21) "アメリカ合衆国"
        ["pt-BR"]=>
        string(14) "Estados Unidos"
        ["ru"]=>
        string(6) "США"
        ["zh-CN"]=>
        string(6) "美国"
      }
    }
    ["location"]=>
    array(5) {
      ["accuracy_radius"]=>
      int(20)
      ["latitude"]=>
      float(44.9825)
      ["longitude"]=>
      float(-93.1863)
      ["metro_code"]=>
      int(613)
      ["time_zone"]=>
      string(15) "America/Chicago"
    }
    ["postal"]=>
    array(1) {
      ["code"]=>
      string(5) "55108"
    }
    ["registered_country"]=>
    array(3) {
      ["geoname_id"]=>
      int(6252001)
      ["iso_code"]=>
      string(2) "US"
      ["names"]=>
      array(8) {
        ["de"]=>
        string(3) "USA"
        ["en"]=>
        string(13) "United States"
        ["es"]=>
        string(14) "Estados Unidos"
        ["fr"]=>
        string(11) "États-Unis"
        ["ja"]=>
        string(21) "アメリカ合衆国"
        ["pt-BR"]=>
        string(14) "Estados Unidos"
        ["ru"]=>
        string(6) "США"
        ["zh-CN"]=>
        string(6) "美国"
      }
    }
    ["subdivisions"]=>
    array(1) {
      [0]=>
      array(3) {
        ["geoname_id"]=>
        int(5037779)
        ["iso_code"]=>
        string(2) "MN"
        ["names"]=>
        array(7) {
          ["en"]=>
          string(9) "Minnesota"
          ["es"]=>
          string(9) "Minnesota"
          ["fr"]=>
          string(9) "Minnesota"
          ["ja"]=>
          string(15) "ミネソタ州"
          ["pt-BR"]=>
          string(8) "Minesota"
          ["ru"]=>
          string(18) "Миннесота"
          ["zh-CN"]=>
          string(15) "明尼苏达州"
        }
      }
    }
    ["traits"]=>
    array(2) {
      ["ip_address"]=>
      string(15) "128.101.101.101"
      ["prefix_len"]=>
      int(21)
    }
  }
}

「$record->プロパティ1->プロパティ2」といった形で各データにアクセスできるようになっています。

PHPでのGeoIp2の使い方は以上です。

コメント/ピンバック

  1. […] Laravelを使わない素のPHPでの使い方はこちら […]

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