EmlogPro显示评论者的IP地理位置非插件 - 陌路人博客

EmlogPro显示评论者的IP地理位置非插件-陌路人博客-第1张图片陌路人

陌路人博客(blog.imlr.cn)
用心传递快乐,初心不变。

EmlogPro显示评论者的IP地理位置非插件


EmlogPro显示评论者的IP地理位置非插件-陌路人博客-第2张图片

emlog 评论显示IP地理信息的两种方法,可以为你的博客评论区增加已评论者的IP地理位置显现,也不算什么有用的功能,看别的网站都有所以就加上了,还有就是《使用了cdn获取不到真实IP的解决办法》看这篇文章。

第一步:把下面代码添加到你模板的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']);?>
图片显示方法:
<a title= <?php echo getaddress($comment['ip']);?>>&nbsp;<img src="./ip.png"></a>
其中ip.png这个图标会显示在评论人的后面,鼠标放上去会显示地理地址。



×

感谢您的支持,我们会一直保持!

EmlogPro显示评论者的IP地理位置非插件-陌路人博客- 第4张图片
请土豪扫码随意打赏

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

打赏作者
版权所有,转载注意明处:陌路人博客 » EmlogPro显示评论者的IP地理位置非插件
标签: 教程 emlog 代码

发表评论

表情

网友评论(0)