Back to page

− Links

 Print 

Source of IP から ccTLD (国別コード)を得る :: XOOPS マニア

Source of UsersWiki:nao-pon/blog/2006-07-28

« Prev[3]  
** IP から ccTLD (国別コード)を得る [#l40617ff]
#keyword()
RIGHT:&tag(プログラミング);

ちょっと前から、いじっているサイト [[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スクリプトの関数
#code(){{{
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接続情報を指定してください。
#code(){{{
$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:つっこみ)
----

« Prev[3]