为StatPressCN添加腾讯IP查询结果

by noz

StatPressCN是StatPress的升级版,在StatPress的基础上添加了许多适合中国本地化的功能。详细信息可以访问其官方网站。最方便的也是我最推崇的当然是它可以利用有道的IP地址API查询来访者的地理信息。

作者采用的有道API虽然开放性很好,也可以基本满足查询要求,但是,总感觉其数据库太小,很多时候都查询不到对应的结果。而众所周知,腾讯在这方面有非常大的优势,其IP分享计划中的数据由于都是来自其广大的QQ用户自己修改,所以精度非常高,可以达到县区级水平。

腾讯IP分享计划

腾讯IP分享计划

所以我就想要在StatPressCN中使用腾讯的数据。以下为修改过程,代码来自这个已经不存在的博客和保留了原文的这个百度空间

找到.../plugins/statpresscn/statpresscn.php中的以下语句:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ipquery_url = get_option('statpress_ipsearchtools').$ip;
if (function_exists('curl_version')) {
$ch = curl_init();
$timeout = 5; // set to zero for no timeout
curl_setopt ($ch, CURLOPT_URL, $ipquery_url);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
ob_start();
curl_exec($ch);
curl_close($ch);
$ipinfo = ob_get_contents();
ob_end_clean();
}
// else if(get_cfg_var('allow_url_fopen')){
// $ipinfo = file_get_contents($ipquery_url);
// }
if (function_exists("mb_convert_encoding")) {
$ipinfo = mb_convert_encoding($ipinfo,"utf-8","UTF-8,CP936,EUC-CN,BIG-5");
}else if (function_exists("iconv")) {
$ipinfo = iconv("gb2312","utf-8",$ipinfo);
}else {
return "";
}
if(preg_match('@<location>(\S*)(?:\s+\S*)*</location>@u',$ipinfo,$matches)) {
return $matches[1];
}

将其替换为:

1
2
3
4
5
6
7
8
9
10
11
$url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$ip;
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_ENCODING ,'gb2312');
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
$result = mb_convert_encoding($result, "utf-8", "gb2312");
curl_close($ch);
preg_match("@<span>(.*)</span></p>@iU",$result,$ipArray);
$loc = $ipArray[1];
return $loc;

这样,StatPressCN中的查询结果可以从腾讯IP分享计划中取得。当然,在StatPressCN选项中,仍然要选择http://www.youdao.com(中文用户专用)这个选项。我也希望,StatPressCN的作者可以添加其他IP地理查询的API,让使用者有更多的选择。