我在人间贩卖黄昏,只为收集世间温柔见你

给自己的博客评论区加上IP属地

博文 10 评

效果图如下:
效果图
要实现此效果共分两部分,我们一步一步来。

首先第一步在 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
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
    $list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
    $_SERVER['REMOTE_ADDR'] = $list[0];}

如果本文对您有用的话,欢迎在下方留言评论!

如何做好网站SEO
10 评论
    zkmhyChrome 123Windows 10    IP属地:四川省南充市 移动
    4月7日回复

    有个小bug,评论使用下面的颜文字表情,居然提示“禁止使用日文”

      依晨Chrome 117Android    IP属地:广西 移动数据上网公共出口
      4月7日回复

      @zkmhy 现在应该好了,评论插件拦截了

    zkmhyChrome 123Windows 10    IP属地:四川省南充市 移动
    4月7日回复

    看看我的ip

    小赫QQ Browser 6Android R    IP属地:山东省青岛市 联通
    2023年04月09日回复

    只能站长能看到吗,游客能不能看到

    JJChrome 110Windows 10    IP属地:广东省云浮市 电信
    2023年02月10日回复

    看看我在哪?

      依晨Chrome 109Windows 10    IP属地:广西 移动数据上网公共出口
      2023年02月10日回复

      @JJ 广东云浮市

    Mr.ChouChrome 109Android Q    IP属地:广东省 联通数据上网公共出口
    2023年02月08日回复

    👌谢谢分享,来测试一下看看我在哪里。

      依晨Chrome 95Android 12    IP属地:广西 电信数据上网公共出口
      2023年02月08日回复

      @Mr.Chou 广东省OωO

    胡子延Safari 16iPhone    IP属地:广东省东莞市 移动
    2023年02月06日回复

    我在哪里

      依晨Chrome 95Android 12    IP属地:广西 移动数据上网公共出口
      2023年02月06日回复

      @胡子延 广东东莞

任何事都是意犹未尽的时候最好