Back to page

− Links

 Print 

Backup diff of IP から ccTLD (国別コード)を得る (No. 1) :: XOOPS マニア

Backup diff of UsersWiki:nao-pon/blog/2006-07-28(No. 1)

  Next »[4]
1: 2006-07-28 (Fri) 10:32:42 source[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/)
  Next »[4]