スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ipアドレスから国を判別 PHP編

Webサイトに訪れたユーザがどこの国からアクセスしているかを判別したく、色々調べた結果下記のような方針で進めることにした。
なお、今回は「国内からか、それ以外か」だけを判別する。

■準備するもの
・IPアドレスの一覧をしまっておくDB(テキストファイルでも良い)
・PHPが動くWebサーバ

■手順
1. まずは日本のIPアドレスのリストを作る。下記にIP振り分け一覧があるので、この中でJPとなっているものが日本に割り当てられているもの。
http://ftp.apnic.net/stats/apnic/delegated-apnic-latest

上記の見方は下記にあり、パイプ(|)で区切られている2つ目が国名を表している。

http://www.apnic.net/publications/media-library/documents/resource-guidelines/rir-statistics-exchange-format#Format

上記にIP一覧を取得するすべがあるのでこれをリストとして利用してもいいようなものだが、アクセスの頻度や可用性などから独自のコピーを作ることに。
必要なカラムは
- start (IPアドレスの開始)
- value (開始から何個取得されているか)
の2つのみ。
例えば、

apnic|JP|ipv4|27.133.244.0|512|20100421|allocated

こういう行であれば

- start -> 27.133.244.0
- value -> 512

となる。
この2つのカラムだけを抽出、DBにIPAddressテーブルを作成して挿入した。
細かい説明は省略するが、全データをメモ帳に貼り付けてパイプ(|)をカンマに置き換えた後csv形式で保存し、それをエクセルで開いてJPだけ抽出する、などのステップで簡単に完了。

2. IPの一覧とユーザのIPアドレスを比較
リストができてしまえばあとは実際に比較をするだけ。
例えばこんな感じ。

//$IP_from_list にリストからIPを格納済
//$VALUE_from_list にリストからvalueを格納済
$client_ip = ip2long($_SERVER["REMOTE_ADDR"]); //ユーザのIPを取得してlong型にキャスト
for($i=0;$i $from = ip2long($IP_from_list[$i]);
$to = $from + $VALUE_from_list[$i];
if($from <= $client_ip && $client_ip <= $to){
//このユーザはJPです
exit();
}
}

と、非常に簡単。
肝はip2long関数にIPアドレスを渡して10進数を得るところ。こんな便利な関数があるとは。




■まとめ
上記の方法で100パーセントカバーできるわけではないと思うが、まあそれなりに判別は可能だと思う。

コメント

コメントの投稿

非公開コメント

PR

PR

プロフィール

何でも書くman

Author:何でも書くman
思ったことや備忘録など、とりあえずなんでも書きます。IT系のことや趣味、生活に関わることなども。

ページの先頭へ戻る
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。