Emlog显示评论者IP地理信息的两种方法

    选择打赏方式

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']);?>


即可。

 

图片显示方式:


<a title= <?php echo getaddress($comment['ip']);?>>&nbsp;<img src="./content/templates/default/images/ip.png"></a>


其中ip.png这个图标会显示在评论人的后面,图片自找,鼠标放上去会显示地理地址。

版权声明:若无特殊注明,本文皆为《 迷糊小侠 》原创,转载请保留文章出处。
本文链接:Emlog显示评论者IP地理信息的两种方法 http://guzhengdong.cn/emlogxianip.html
正文到此结束

热门推荐

发表吐槽

你肿么看?

你还可以输入 250 / 250 个字

嘻嘻 大笑 可怜 吃惊 害羞 调皮 鄙视 示爱 大哭 开心 偷笑 嘘 奸笑 委屈 抱抱 愤怒 思考 日了狗 胜利 不高兴 阴险 乖 酷 滑稽

评论信息框

吃奶的力气提交吐槽中...

已有20条吐槽

仍有

2017-12-12 23:00 广东省佛山市电信
我也想用这个主题了。
 Windows 7 x64   Firefox 57.0

匿名

2017-12-12 22:58 广东省佛山市电信
e974d8ae6a1876092f62dda0d10da7aa这个写在哪里。
 Windows 7 x64   Firefox 57.0

亲大爷

2015-07-26 02:29 广东省惠州市电信
你好
 CoolPad 8675   UC浏览器 10.5.2.598

起重机车轮

2015-04-02 09:38 河南省焦作市移动
支持一下
 Windows 7   Google Chrome 38.0.2125.122

晨曦

2014-10-16 20:08 重庆市移动数据上网公共出口
这个好机智,回头试试
 Windows Server 2003   UC浏览器 9.9.6.495

跑步机

2014-08-29 18:11 河北省石家庄市电信
不错,谢谢博主分享
 Windows XP   Google Chrome 36.0.1985.143

充气娃娃

2014-08-29 10:38 广东省深圳市电信
原来用过一段时间的emlog,原来被K了,没管他。话说也去给我评论一下可好,拉到下面就是我的博客,上面是广告哈。
 Windows 8.1 x64   Firefox 31.0

迷糊小侠

2014-08-29 10:42 江苏省苏州市电信
@充气娃娃:哦!!!
 Xiaomi 3C   QQ 5.1.0.2225

vfhky

2014-08-14 00:30 山东省联通
感觉纯真文件方式有个缺点就是不断的打开和关闭文件流,比较耗资源。
 Android   360 Aphone Browser

园林

2014-08-12 21:16 广东省深圳市电信
呵呵,不错,受用,谢谢分享
 Windows 8.1 x64   Firefox 31.0

胶粘剂

2014-08-11 21:32 广东省深圳市电信
懒得去折腾,只要天天有人光顾的我博客,就开开心心,哈哈,期待博主回访我的博客
 Windows 8.1 x64   Firefox 31.0

匿名

2017-11-04 22:37 山东省聊城市高唐县联通
@胶粘剂:face  face 看看
 Android 5.1   MQQBrowser 7.1