EMLOG显示评论者IP地理信息的方法
为了将留言访客的资料设置的更全面,很多站长都在前端进行了评论者IP地址的展现,EMLOG原生模板中没有这项功能,因此博客志就来分享一个EMLOG显示评论者IP地理信息的方法。
一、操作步骤
1、打开模板文件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; } ?>
2、或者插入如下代码也可以,效果一样
<?php function convertip($ip) { $dat_path = EMLOG_ROOT.'/qqwry.dat'; //*数据库文件路径*// if(!$fd = @fopen($dat_path, 'rb')){ return 'IP数据库文件不存在或者禁止访问或者已经被删除!'; } $ip = explode('.', $ip); $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3]; $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; 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 '系统出错!'; } $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 '系统出错!'; } $DataSeek = implode('', unpack('L', $DataSeek.chr(0))); fseek($fd, $DataSeek); $ipData2 = fread($fd, 4); if(strlen($ipData2) < 4) { fclose($fd); return '系统出错!'; } $ip2num = implode('', unpack('L', $ipData2)); if($ip2num < 0) $ip2num += pow(2, 32); if($ip2num < $ipNum) { if($Middle == $BeginNum) { fclose($fd); return '未知'; } $BeginNum = $Middle; } } $ipFlag = fread($fd, 1); if($ipFlag == chr(1)) { $ipSeek = fread($fd, 3); if(strlen($ipSeek) < 3) { fclose($fd); return '系统出错!'; } $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 '系统出错!'; } $ipFlag = fread($fd, 1); if($ipFlag == chr(2)) { $AddrSeek2 = fread($fd, 3); if(strlen($AddrSeek2) < 3) { fclose($fd); return '系统出错!'; } $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 '系统出错!'; } $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 = '未知'; } $ipaddr = iconv('gbk', 'utf-8//IGNORE', $ipaddr); if( $ipaddr != ' ' ) return $ipaddr; else $ipaddr = '评论者来自火星,无法或者其所在地!'; return $ipaddr; } ?>
3、在需要显示评论者IP地址的地方,插入如下代码
<?php echo getaddress($comment['ip']);?>
4、下载纯真IP数据库并安装到本地电脑,将安装目录里的qqwry.dat文件提取出来,上传到网站根目录
5、打开任意文章页,测试评论即可
二、原理解析
其实就是将文章页链接上的post替换为其他你需要的字符而已,比如emlog、article等等你喜欢的任意字符
三、注意事项
1、本教程中所必须的qqwry.dat文件放置的目录必须和网站的index.php在同一目录中
2、本教程第2步中,显示留言者IP的地址可以在module.php上,也可以在echo_log.php上
3、本教程中所必须的qqwry.dat已放置在底部附件上,可直接下载,也可以选择在纯真IP数据库上提取最新版本
四、附件下载
EMLOG显示评论者IP大小:5.1M | 密码:无 | 来源:本站下载