博客评论区添加IP属地功能

代码
2513 53

效果图如下:

火狐截图_2022-05-07T12-43-12.302Z.png

教程:
将下方代码放入主题的functions.php文件中

/** 获取评论者地址 */
function convertip($ip){  
  $ip1num = 0; 
  $ip2num = 0; 
  $ipAddr1 =""; 
  $ipAddr2 =""; 
  $dat_path = './qqwry.dat';         
  if(!preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{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 = '可能来自火星';  
  }
  $ipaddr = iconv('gbk', 'utf-8//IGNORE', $ipaddr); 
  return $ipaddr;  
}

注:只显示地区,不显示后面的网络请把$ipaddr = "$ipAddr1 $ipAddr2";改为$ipaddr = "$ipAddr1";即可。

下载QQWry.Dat放在网站根目录,注意是网站根目录!!!不是主题目录。

此处内容需要评论回复后(审核通过)方可阅读。

添加完成后,再次打开主题评论模板comments.php文件,在您想显示的位置加上如下代码。

<?php echo convertip($comments->ip); ?>

此时,博客评论区添加IP属地功能就添加完成了,受数据库影响,其真实地址不一定准确哈。

同时,Typecho配置CDN后获取访客真实IP地址可能会受到影响,请在Typecho站点根目录里的config.inc.php添加下面这段代码即可。

    //绕过 CDN 代理IP获取客户真实IP地址
    if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
    {
    $list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
    $_SERVER['REMOTE_ADDR'] = $list[0];
    }

至此,所有教程完毕。

原文参考:https://www.jdeal.cn/136.html

最后更新 2022-05-07
评论 ( 53 )
OωO
隐私评论
  1. 来学习学习

    12天前广西回复
  2. 感谢!!

    1个月前辽宁省鞍山市回复
  3. 赞一个,我被IP数据库路径不正确整疯了

    2个月前山东省回复
  4. 安知

    不错不错

    2个月前内蒙古回复
  5. 教程很好

    2个月前山东省回复
  6. 云心怀鹤

    教程很好

    3个月前广西南宁市回复
  7. 客官

    嗨嗨

    4个月前山东省青岛市回复
  8. 拿走了

    4个月前山东省青岛市回复
  9. 拿走了

    5个月前广东省广州市回复
  10. 兮兮

    偷了偷了

    5个月前甘肃省兰州市回复
  11. 66666博主

    5个月前山东省回复
  12. 1111

    111

    5个月前山东省济南市回复
  13. 来看看。

    6个月前河南省周口市回复
  14. 试图copy🤪

    6个月前甘肃省回复
  15. 撒大大大

    6个月前河南省郑州市回复
  16. gg

    学习一下

    6个月前北京市回复
  17. 啦啦

    看看准不准

    6个月前甘肃省酒泉市回复
    1. @啦啦

      可能会有偏差

      6个月前安徽省合肥市回复
  18. hhh

    来看看

    6个月前广西钦州市回复
  19. liank

    哈哈哈哈

    6个月前广西钦州市回复
  20. 来一个

    6个月前江苏省回复