经典教程-emlog显示IP地理地址的两种方法

2014年07月15日 技术资料 5620 views 0

点击查看原图 经典教程-emlog显示IP地理地址的两种方法 第1张

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']);?>>&nbsp;<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']);?>>&nbsp;<img src="./content/templates/uu_hcms/images/common/ip.png"></a> 


其中ip.png这个图标会显示在评论人的后面,图片自找,或到我的博客复制一个,鼠标放上去会显示地理地址。


👍好活当赏🧧