GeoIPでIPアドレスから座標・国名・都市名などを取得する

GeoIP Legacy

IP アドレスの情報収集を行っている MaxMind 社のデータベース GeoIP。

これを使ってIPアドレスから座標・国名・地域名・都市名などを取得してみる。

今回使うのは、フリーのデータベース GeoLite Legacy Databases と
MaxMind 社製の PHP のモジュール

とりあえず、GeoLite Legacy Databases から
GeoLite City(GeoLiteCity.dat.gz)をダウンロードしてきて解凍。

次に、GitHub から、以下の4ファイルをダウンロードしてくる。

  • geoip.inc
  • geoipcity.inc
  • geoipregionvars.php
  • timezone.php

以上のファイルを同じディレクトリにぶっ込んで、
簡単なサンプルコードを書いてみた。

以下、サンプルの index.php

<?php
include_once( "./geoipcity.inc" );
include_once( "./timezone.php" );

$ip   = "98.139.183.24";    // Yahoo.com の IP アドレス
$host = gethostbyaddr( $ip );

$gip = geoip_open( "./GeoLiteCity.dat", GEOIP_STANDARD );
$dat = GeoIP_record_by_addr( $gip, $ip );
geoip_close( $gi );

if( isset( $GEOIP_REGION_NAME[$dat->country_code][$dat->region] ) ) {
    $dat->region_name = $GEOIP_REGION_NAME[$dat->country_code][$dat->region];
}
$dat->time_zone = get_time_zone( $dat->country_code, $dat->region );

echo "<pre>";
echo "ip            = " . $ip . "<br>";
echo "host          = " . $host . "<br><br>";
echo "city          = " . $dat->city . "<br>";
echo "region_name   = " . $dat->region_name . "<br>";
echo "region        = " . $dat->region . "<br>";
echo "area_code     = " . $dat->area_code . "<br>";
echo "time_zone     = " . $dat->time_zone . "<br>";
echo "longitude     = " . $dat->longitude . "<br>";
echo "metro_code    = " . $dat->metro_code . "<br>";
echo "country_code3 = " . $dat->country_code3 . "<br>";
echo "latitude      = " . $dat->latitude . "<br>";
echo "postal_code   = " . $dat->postal_code . "<br>";
echo "dma_code      = " . $dat->dma_code . "<br>";
echo "country_code  = " . $dat->country_code . "<br>";
echo "country_name  = " . $dat->country_name . "<br>";
echo "</pre>";
?>

表示結果(Yahoo.com のアドレス)

ip            = 98.139.183.24
host          = ir2.fp.vip.bf1.yahoo.com

city          = Sunnyvale            // 都市名
region_name   = California           // 地域名
region        = CA                   // 地域コード
area_code     = 408                  // エリアコード?
time_zone     = America/Los_Angeles  // タイムゾーン
longitude     = -122.0074            // 経度
metro_code    = 807                  // なにこれ?
country_code3 = USA                  // 国コード(3文字)
latitude      = 37.4249              // 緯度
postal_code   = 94089                // 郵便番号
dma_code      = 807                  // わからん?
country_code  = US                   // 国コード(2文字)
country_name  = United States        // 国名

おー、すげぇー (゜Д゜)

・・・って、おもーじゃん?

これを、Yahoo.co.jp のアドレスでやってみると

ip            = 183.79.135.206
host          = f1.top.vip.kks.yahoo.co.jp

city          = Akasaka
region_name   = Aichi
region        = 01
area_code     = 
time_zone     = Asia/Tokyo
longitude     = 137.3
metro_code    = 
country_code3 = JPN
latitude      = 34.85
postal_code   = 441-0202
dma_code      = 
country_code  = JP
country_name  = Japan

Yahoo Japan の本社は東京の赤坂だが・・・
愛知県名古屋市の赤坂町になってしまうwww

他にも、いろんなアドレスを試してみたが、
本来、東京のはずが愛媛になったり、神奈川が岐阜だったり・・・

地域・都市名は、全く当てにならない。

でも、国名は高精度
jp とか com とか、トップレベルドメインで判断するよりは、かなり正確。

まぁ、今のところ国名取得にしか使えないね。

ちなみに、GeoLite Legacy でなく
最新の GeoIP2 でも地域名・都市名は、全然ダメ。

MaxMind のデモ版でアドレス入力してみると分かるw

IT・ICT

Posted by るな