GeoIPでIPアドレスから座標・国名・都市名などを取得する
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
ディスカッション
コメント一覧
まだ、コメントがありません