现在的位置: 首页 > IT运维 > 正文

FireStats显示详细城市位置信息

2010年08月13日 IT运维 ⁄ 共 3373字 评论数 2 ⁄ 被围观 1,571+

FireStats是Wordpress的一款不错的访问统计插件,可以显示访问者的IP地址、搜索关键词等信息,从而为网站的发展方向提供有效的参考。FireStats目前的版本为1.6.7稳定版本,官方网址:http://firestats.cc/wiki/

FireStats默认会显示访问者的国家标识,而对于我们来说,显示到具体的城市、街道将会更直观,虽然我们可以复制ip地址到网络上查询,但一个一个查询比较慢..,于是想到了QQ显IP外挂,地址信息显示的就比较详细准确,其中包含比较详细的IP地址库,下面就介绍如何利用IP地址库在FireStats中显示访问者的详细地址信息:

1、先去网络上搜索ip地址库,我这里用的是纯真IP地址库,结果比较准确,呵呵。下载ip地址库,如果是纯真ip地址库,则文件名为 QQWry.Dat,将这个文件放到 firestats/lib/ip2c目录下。

2、在firestats/php/ip2country.php最后的?>前增加如下代码:

function ip2city($ip) {
	$dat_path = FS_ABS_PATH.\'/lib/ip2c/QQWry.Dat\';    //IP数据文件路径
	if(!preg_match("/^\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3}$/", $ip)){
		return \'IP 地址错误!\';
	}
	if(!$fd = @fopen($dat_path, \'rb\')){
		return \'IP数据文件无法读取!\';
	}    //分解IP进行运算,得出整形数
	$ip = explode(\'.\', $ip);
	$ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];    //获取IP数据索引开始和结束位置
	$DataBegin = fread($fd, 4);
	$DataEnd = fread($fd, 4);
	$ipbegin = implode(\'\', unpack(\'L\', $DataBegin));
if($ipbegin < 0) $ipbegin += pow(2, 32);
	$ipend = implode(\'\', unpack(\'L\', $DataEnd));
	if($ipend < 0) $ipend += pow(2, 32);
	$ipAllNum = ($ipend - $ipbegin) / 7 + 1;
   
	$BeginNum = 0;
	$EndNum = $ipAllNum;
$ip1num=\'\'; $ip2num=\'\';   $ipAddr1=\'\';    $ipAddr2=\'\';
	while($ip1num>$ipNum || $ip2num<$ipNum) {
		$Middle= intval(($EndNum + $BeginNum) / 2);
		fseek($fd, $ipbegin + 7 * $Middle);
		$ipData1 = fread($fd, 4);
		if(strlen($ipData1) < 4) {
			fclose($fd);
			return \'System Error\';
		}
		$ip1num = implode(\'\', unpack(\'L\', $ipData1));
		if($ip1num < 0) $ip1num += pow(2, 32);
		if($ip1num > $ipNum) {
			$EndNum = $Middle;
			continue;
		}
		$DataSeek = fread($fd, 3);
		if(strlen($DataSeek) < 3) {
			fclose($fd);
			return \'System Error\';
		}
		$DataSeek = implode(\'\', unpack(\'L\', $DataSeek.chr(0)));
		fseek($fd, $DataSeek);
		$ipData2 = fread($fd, 4);
		if(strlen($ipData2) < 4) {
			fclose($fd);
			return \'System Error\';
		}
		$ip2num = implode(\'\', unpack(\'L\', $ipData2));
		if($ip2num < 0) $ip2num += pow(2, 32); 
		if($ip2num < $ipNum) {
			if($Middle == $BeginNum) {
				fclose($fd);
				return \'Unknown\';
			}
			$BeginNum = $Middle;
		}
	}
	$ipFlag = fread($fd, 1);
	if($ipFlag == chr(1)) {
		$ipSeek = fread($fd, 3);
		if(strlen($ipSeek) < 3) {
			fclose($fd);
			return \'System Error\';
		}
		$ipSeek = implode(\'\', unpack(\'L\', $ipSeek.chr(0)));
		fseek($fd, $ipSeek);
		$ipFlag = fread($fd, 1);
	}    if($ipFlag == chr(2)) {
		$AddrSeek = fread($fd, 3);
		if(strlen($AddrSeek) < 3) {
			fclose($fd);
			return \'System Error\';
		}
		$ipFlag = fread($fd, 1);
		if($ipFlag == chr(2)) {
			$AddrSeek2 = fread($fd, 3);
			if(strlen($AddrSeek2) < 3) {
				fclose($fd);
				return \'System Error\';
			}
			$AddrSeek2 = implode(\'\', unpack(\'L\', $AddrSeek2.chr(0)));
			fseek($fd, $AddrSeek2);
		} else {
			fseek($fd, -1, SEEK_CUR);
		}        while(($char = fread($fd, 1)) != chr(0))
			$ipAddr2 .= $char;        $AddrSeek = implode(\'\', unpack(\'L\', $AddrSeek.chr(0)));
		fseek($fd, $AddrSeek);        while(($char = fread($fd, 1)) != chr(0))
			$ipAddr1 .= $char;
	} else {
		fseek($fd, -1, SEEK_CUR);
		while(($char = fread($fd, 1)) != chr(0))
			$ipAddr1 .= $char;        $ipFlag = fread($fd, 1);
		if($ipFlag == chr(2)) {
			$AddrSeek2 = fread($fd, 3);
			if(strlen($AddrSeek2) < 3) {
				fclose($fd);
				return \'System Error\';
			}
			$AddrSeek2 = implode(\'\', unpack(\'L\', $AddrSeek2.chr(0)));
			fseek($fd, $AddrSeek2);
		} else {
			fseek($fd, -1, SEEK_CUR);
		}
		while(($char = fread($fd, 1)) != chr(0)){
			$ipAddr2 .= $char;
		}
	}
	fclose($fd);
	if(preg_match(\'/http/i\', $ipAddr2)) {
		$ipAddr2 = \'\';
	}
	$ipaddr = "$ipAddr1 $ipAddr2";
	$ipaddr = preg_replace(\'/CZ88.Net/is\', \'\', $ipaddr);
	$ipaddr = preg_replace(\'/^s*/is\', \'\', $ipaddr);
	$ipaddr = preg_replace(\'/s*$/is\', \'\', $ipaddr);
	if(preg_match(\'/http/i\', $ipaddr) || $ipaddr == \'\') {
		$ipaddr = \'Unknown\';
	}
	return iconv(\'GBK\',\'utf-8\',$ipaddr);
}
&#91;/php&#93;
<p>3、在firestats/php/html-utils.php大约648行, 也就是 function fs_get_records_table()函数foreach ($entries as $entry)循环内的$i++;之后插入如下代码:</p>
[php]$ct=ip2city(fs_ip_to_string($entry->ip_int1, $entry->ip_int2));

然后将紧跟其后的$res变量定义中的

<td class="records_table_row2">\'.fs_get_whois_link($entry).\'</td>

替换为如下内容,或者将$ct变量(保存的内容为详细城市信息)放到你想要显示的位置:

<td class="records_table_row2">\'.fs_get_whois_link($entry).\'<p style="font-size:10px;margin:0;letter-spacing:-1px;">\'.$ct.\'</p></td>

好了,看看显示结果吧:P
firestats显示ip对应城市详细地址

目前有 2 条留言 其中:访客:1 条, 博主:1 条

  1. hej748 : 2011年05月17日16:34:11  -49楼

    thanks for sharing.
    不过我照着改了之后是system error>_<

给我留言

您必须 [ 登录 ] 才能发表留言!

×
#