emlog系统存储了评论人的IP地址,有的时候,需要显示该IP的真实地理地址,可以通过以下两种方法获得。
一、本地获得IP地理地址。通过本地查找本地IP数据库(纯真版)来获得,IP数据库可以到http://www.cz88.net/下载安装后,在安装目录里把qqwry.dat文件提取出来放到emlog根目录即可。 (保证与index.php同在一个目录中)
在module.php中添加以下代码:
<?php //获取IP地理地址 $data = '254.254.254.254'; class IpLocation { var $fp; var $firstip; var $lastip; var $totalip; function getlong() { $result = unpack('Vlong', fread($this->fp, 4)); return $result['long']; } function getlong3() { $result = unpack('Vlong', fread($this->fp, 3).chr(0)); return $result['long']; } function packip($ip) { return pack('N', intval(ip2long($ip))); } function getstring($data = "") { $char = fread($this->fp, 1); while (ord($char) > 0) { $data .= $char; $char = fread($this->fp, 1); } return $data; } function getarea() { $byte = fread($this->fp, 1); switch (ord($byte)) { case 0: $area = ""; break; case 1: case 2: fseek($this->fp, $this->getlong3()); $area = $this->getstring(); break; default: $area = $this->getstring($byte); break; } return $area; } function getlocation($ip) { if (!$this->fp) return null; $location['ip'] = gethostbyname($ip); $ip = $this->packip($location['ip']); $l = 0; $u = $this->totalip; $findip = $this->lastip; while ($l <= $u) { $i = floor(($l + $u) / 2); fseek($this->fp, $this->firstip + $i * 7); $beginip = strrev(fread($this->fp, 4)); if ($ip < $beginip) { $u = $i - 1; } else { fseek($this->fp, $this->getlong3()); $endip = strrev(fread($this->fp, 4)); if ($ip > $endip) { $l = $i + 1; } else { $findip = $this->firstip + $i * 7; break; } } } fseek($this->fp, $findip); $location['beginip'] = long2ip($this->getlong()); $offset = $this->getlong3(); fseek($this->fp, $offset); $location['endip'] = long2ip($this->getlong()); $byte = fread($this->fp, 1); switch (ord($byte)) { case 1: $countryOffset = $this->getlong3(); fseek($this->fp, $countryOffset); $byte = fread($this->fp, 1); switch (ord($byte)) { case 2: fseek($this->fp, $this->getlong3()); $location['country'] = $this->getstring(); fseek($this->fp, $countryOffset + 4); $location['area'] = $this->getarea(); break; default: $location['country'] = $this->getstring($byte); $location['area'] = $this->getarea(); break; } break; case 2: fseek($this->fp, $this->getlong3()); $location['country'] = $this->getstring(); fseek($this->fp, $offset + 8); $location['area'] = $this->getarea(); break; default: $location['country'] = $this->getstring($byte); $location['area'] = $this->getarea(); break; } if ($location['country'] == " CZNET") { $location['country'] = "未知"; } if ($location['area'] == " CZNET") { $location['area'] = ""; } return $location; } function IpLocation($filename = "qqwry.dat") { $this->fp = 0; if (($this->fp = @fopen($filename, 'rb')) !== false) { $this->firstip = $this->getlong(); $this->lastip = $this->getlong(); $this->totalip = ($this->lastip - $this->firstip) / 7; register_shutdown_function(array(&$this, '_IpLocation')); } } function _IpLocation() { if ($this->fp) { fclose($this->fp); } $this->fp = 0; } } function getaddress($myip){ $ipOrDomain=$myip; $iplocation = new IpLocation(); $location = $iplocation->getlocation($ipOrDomain); $address=mb_convert_encoding($location['country'].$location['area'], "utf-8", "gbk"); return $address; } ?>
然后在需要显示的地方插入 <?php echo getaddress($comment['ip']);?> 即可。
二、通过远程网站相关接口实现。
在module.php中添加以下代码:
<?php
//blog:获取IP地址所在地,提取新浪IP接口
function getaddress($ip)
{
//调用sina查询接口
$str = file_get_contents("http://counter.sina.com.cn/ip?ip=".$ip);
//转换字符集
$str = mb_convert_encoding($str,"UTF-8","GBK");
//匹配结果
preg_match_all('/[\x{4e00}-\x{9fa5}]+/u',$str,$get);
//将数组转换成字符串
$add = implode('-',$get[0]);
//返回结果
return $add;
}
?>
然后在需要显示的地方插入 <?php echo getaddress($comment['ip']);?> 即可。
附我的博客的显示方式,需要修改module.php文件:
1.查找<strong><?php echo $comment['poster']; ?></strong>修改为 <strong><?php echo $comment['poster']; ?></strong><a title= <?php echo getaddress($comment['ip']);?>> <img src="./content/templates/uu_hcms/images/common/ip.png"></a>
//"./content/templates/uu_hcms/images/common/ip.png"根据实际情况修改
2.继续查找<strong><?php echo $comment['poster']; ?></strong>修改为 <strong><?php echo $comment['poster']; ?></strong><a title= <?php echo getaddress($comment['ip']);?>> <img src="./content/templates/uu_hcms/images/common/ip.png"></a>
其中ip.png这个图标会显示在评论人的后面,图片自找,或到我的博客复制一个,鼠标放上去会显示地理地址。