Emlog代码实现显示评论者ip地理信息

Emlog代码实现显示评论者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’]);?>

方法二:

<?php
function convertip($ip) {   
    $dat_path = EMLOG_ROOT.’/content/templates/你的模板文件/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;   
}
?>
在要显示评论的地方添加以下代码,module.php

<?php echo convertip($comment[’ip’]); ?>
方法二来自:@FLYER

Comments: 0

「人生在世,留句话给我吧」

提交评论