织梦(dedecms)将IP地址转换为纯真IP数据库的地区的实现函数

大家知道织梦(dedecms)的后台可以查询发布文章和评论的IP地址,dedecms默认的IP地址库却不是现在最流行纯真IP数据库,那么如何将织梦cms的IP地址转换为纯真IP数据库的函数呢?

  可以通过以下方法修改实现

  实现方法

  第一步:函数编写

  在/include/extend.func.php文件中的?>的上面加入以下函数代码:

/*        +------------------------------------------------------------------------+        | 本代码来源于织梦教程网(xuewl.com)        +------------------------------------------------------------------------+        | Author : 华强 (QQ:3421209)         | Email  : master@xuewl.com         | WebSite: http://bbs.xuewl.com         | Contact: http://t.qq.com/dede_tech        | Copyright @ 2007 - 2012 织梦教程网(xuewl.com)        +------------------------------------------------------------------------+        + 不管是否为商业用途,您必须保留此头部信息并不得修改,尊重版权从现在做起 +    */function convertip($ip){           $dat_path = DEDEDATA.'/ip/QQWry.dat';           if(!ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$", $ip)){               return 'IP格式错误';           }           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 'System Error';               }               $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 'System Error';               }               $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));               fseek($fd, $DataSeek);               $ipData2 = fread($fd, 4);               if(strlen($ipData2) < 4) {                   fclose($fd);                   return 'System Error';               }               $ip2num = implode('', unpack('L', $ipData2));               if($ip2num < 0) $ip2num += pow(2, 32);               if($ip2num < $ipNum) {                   if($Middle == $BeginNum) {                       fclose($fd);                       return 'Unknown';                   }                   $BeginNum = $Middle;               }           }             $ipFlag = fread($fd, 1);           if($ipFlag == chr(1)) {               $ipSeek = fread($fd, 3);               if(strlen($ipSeek) < 3) {                   fclose($fd);                   return 'System Error';               }               $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 'System Error';               }               $ipFlag = fread($fd, 1);               if($ipFlag == chr(2)) {                   $AddrSeek2 = fread($fd, 3);                   if(strlen($AddrSeek2) < 3) {                       fclose($fd);                       return 'System Error';                   }                   $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 'System Error';                   }                   $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 = 'Unknown';           }           return $ipaddr;       }

保存后即可

  第二步:IP库存放

  请到纯真IP官方网站下载IP库后,将IP地址文件重命名为QQWry.dat并复制到程序根目录的 /data/ip/ 文件夹(若没有ip文件夹,请自行创建)

  第三步:调用方法

  因为本功能已经被封装了,所以其调用方法非常零活多变。

  比如可以用 {dede:field.ip function=”convertip(@me)”/} 的底层模板来调用,也可以直接在相关的 PHP功能文件里进行转换,比如:$ipadress = convertip($ip);等等。

  功能说明

  本功能可运行在DedeCMS_V5.3 及以上所有版本且不分编码。

支付宝扫码打赏 微信扫码打赏

如果本文对你有帮助,欢迎打赏本站

喜欢 ()or分享
    匿名评论
  • 评论
人参与,条评论