给博客评论区添加IP归属地

引言

今天无聊在瞎逛其他博客站点,在一位博主的站点上看到了相关的文章:给评论区添加IP归属地,感觉还不错,于是自己也上手折腾了,操作起来十分的简单,当然要根据自己的主题代码来使用这项功能,灵活变通即可。

给博客评论区添加IP归属地,只需要一段长代码(functions.php)、一段短代码(引用代码)、一个文件(网站根目录)。

效果:


实现步骤

思路:将一段长代码放进主题functions.php文件中,然后还需要将一个文件放在网站的根目录下,随后引用函数代码即可,下面以本站作为演示。

1.将以下代码放入主题的functions.php文件中,如图所示。

代码放入functions.php代码放入functions.php

/** 获取评论者地址 (IP归属地) */
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;  
}

小伙伴如果仔细看代码的话,在第7行处需要引用到一个文件qqwry.dat,这个时候需要把这个文件放在网站的根目录,注意不是主题的根目录。

2.下载QQWry.Dat

随便评论一下即可查看 MuaOoO~

添加完成后,打开主题评论模板comments.php文件,在想要显示的位置加上一下代码: 代码放入comments.php代码放入comments.php

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

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

思路仅供参考,具体情况请根据自己的主题来添加此功能。

原教程链接:https://blog.sdgou.cc/archives/174.html

小伙伴的评论 ( 11 评论)

wave
  1. 永恒末匕

    2023年11月11日

    学习学习

    广西贵港市 Windows 10 · Google Chrome
  2. sxltx

    2022年11月11日

    666666

    山东省 Windows 10 · Google Chrome
  3. 溯源

    2022年09月12日

    能不能出个引用的哇,8M放本地太大了

    广东省肇庆市 Windows 10 · Google Chrome
    1. 呆呆怪 博主

      2022年09月13日

      @溯源 ,引用的话,也简单呀,代码第七行: $dat_path = './qqwry.dat'; 改成引用的路径即可。

      美国 Windows 10 · Google Chrome
      1. 溯源

        2022年09月30日

        @呆呆怪 ,外链也可以嘛

        广东省肇庆市 Windows 10 · Google Chrome
        1. 呆呆怪 博主

          2022年09月30日

          @溯源 ,应该可以的!我具体也没试过,哈哈哈哈

          广东省广州市海珠区 Windows 10 · Google Chrome
  4. hero

    2022年08月09日

    6666

    山东省 Windows 10 · Google Chrome
  5. 小李

    2022年05月30日

    过来试试

    山西省长治市 Windows 7 · Google Chrome
    1. 呆呆怪 博主

      2022年05月31日

      @小李 ,OωO

      广东省广州市 Windows 10 · Google Chrome
  6. 小赵同学

    2022年05月26日

    hello 我是你的美国朋友

    美国 Windows 10 · Google Chrome
    1. 呆呆怪 博主

      2022年05月26日

      @小赵同学 ,老乡见老乡,我也是美国

      美国 Windows 10 · Google Chrome

搜索