1: 2006-07-28 (金) 10:32:42 [5] | |||
---|---|---|---|
Line 1: | Line 1: | ||
+ | #freeze uid:1 aid:0 gid:0 | ||
+ | // author:1 | ||
+ | // author_ucd:dQh9JbjdAEAY nao-pon | ||
+ | ** IP から ccTLD (国別コード)を得る [#l40617ff] | ||
+ | #keyword() | ||
+ | #category(#right,:Blog,プログラミング) | ||
+ | ちょっと前から、いじっているサイト [[YouTube NAVI:http://youtube.navi-gate.org/]] は、内容がワールドワイドなコンテンツなので、Amazon のアソシエイツも各国のそれに参加しています。 | ||
+ | |||
+ | 当初は、ブラウザが送ってくる Accept-Charset を見て判別して振り分けていたのですが、Accept-Charset はあくまでも言語指定であって、住んでる地域とは一致しないので、IPを元にアクセス元の国を判別してみようと思い立ちました。 | ||
+ | |||
+ | 調べてみると、http://api.hostip.info/ で、APIとして公開されていたので使ってみたのですが、正しく取得できない場合があったので、自前で構築してみました。 | ||
+ | |||
+ | まずは、リストの取得ですが [[不正アクセスの発信地の国別統計をとろう!:http://www.nminoru.jp/~nminoru/memo/ip-address/what_country_from.html]] で Nakamura Minoru さんという方が、世界に4ヶ所ある IP アドレスを管理している組織が公開しているデータをまとめて公開されているのを発見! | ||
+ | |||
+ | そちらのデーターを元に MySQL にデータベースを作成しまし、PHPスクリプトで問い合わせるものを作ってみました。 | ||
+ | |||
+ | -まずは、MySQL のテーブル構造 | ||
+ | --http://hypweb.net/api/ip2tld/sql/ip2tld_table.sql.txt | ||
+ | -そして、肝心要のデーター | ||
+ | --http://hypweb.net/api/ip2tld/sql/ip2tld_dat.txt | ||
+ | -そして最後にPHPスクリプトの関数 | ||
+ | <<< | ||
+ | function ip2tld($ip) | ||
+ | { | ||
+ | global $config; | ||
+ | |||
+ | if (preg_match("/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/",$ip,$arg)) | ||
+ | { | ||
+ | $ip = $arg[1]; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | $ip = ""; | ||
+ | } | ||
+ | |||
+ | $tld = ""; | ||
+ | |||
+ | if ($ip) | ||
+ | { | ||
+ | $ips = explode(".",$ip); | ||
+ | $ip = $ips[0] * 16777216 + $ips[1] * 65536 + $ips[2] * 256 + $ips[3]; | ||
+ | |||
+ | // データベースに接続し、選択する | ||
+ | $link = mysql_connect($config['db']['host'], $config['db']['user'], $config['db']['pass']) | ||
+ | or die("Could not connect"); | ||
+ | //print "Connected successfully"; | ||
+ | mysql_select_db($config['db']['name'],$link) | ||
+ | or die("Could not select database"); | ||
+ | |||
+ | // SQLクエリを実行する | ||
+ | $query = "SELECT tld FROM `{$config['ip2tld']['table']}` WHERE start <= $ip AND end >= $ip LIMIT 1"; | ||
+ | //echo $query; | ||
+ | $result = mysql_query($query) | ||
+ | or die("Query failed"); | ||
+ | |||
+ | // HTMLに結果を出力する | ||
+ | list($tld) = mysql_fetch_row($result); | ||
+ | |||
+ | // 接続を閉じる | ||
+ | mysql_close($link); | ||
+ | } | ||
+ | |||
+ | if (!$tld) $tld = "XX"; | ||
+ | |||
+ | return $tld; | ||
+ | } | ||
+ | >>> | ||
+ | --$config に配列として DB接続情報を指定してください。 | ||
+ | <<< | ||
+ | $config = array(); | ||
+ | |||
+ | // DB setting // | ||
+ | $config['db']['host'] = "localhost"; // MySQL Server host | ||
+ | $config['db']['name'] = "db name"; // MySQL DB name | ||
+ | $config['db']['user'] = "user name"; // MySQL User name | ||
+ | $config['db']['pass'] = "password"; // MySQL Password | ||
+ | // ---------- // | ||
+ | |||
+ | $config['ip2tld']['table'] = "ip2tld_dat"; // DB Table name (ip2tld_dat) | ||
+ | >>> | ||
+ | |||
+ | ---- | ||
+ | |||
+ | これを利用したのが [[Convert IP to ccTLD:http://hypweb.net/api/ip2tld/form.php]] です。~ | ||
+ | API として利用するなら http://hypweb.net/api/ip2tld/?ip= として IPを与えてください。~ | ||
+ | 現状では利用にあたり制限をしていませんが、継続性は保証できません。ある日突然なくなるかもしれないので、ご了承ください。 | ||
+ | |||
+ | 一式諸々をパックしておきました。ご自由にお使いください。 | ||
+ | -&ref(ip2tld.zip); | ||
+ | --rename.config.php の内容を設定して config.php とリネームしてください。 ;) | ||
+ | |||
+ | ---- | ||
+ | #comment(,btn:つっこみ) | ||
+ | ---- | ||
+ | ***似たような BLOG [#p891d865] | ||
+ | #blogs(like) | ||
+ | #ping(http://www.blogpeople.net/servlet/weblogUpdates,http://i-uranai.net/tb.php/aries/) |
(This host) = https://xoops.hypweb.net