最近很火的评论用户显示地理位置

发布时间:2022-05-18

前言

这个以前很多博客就已经有了,最近抖音、微博、微信公众号等平台添加了显示用户地理位置的功能,然后博主们也开始了安排上了.其实这个功能是很利于网络舆论的,按照目前的方向可能日后全部都要实名制了...话不多说,朋友们,看教程~

代码

将下方代码放入主题的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";即可.

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

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

文件

文件下载 - 奶牛快传 传输口令 - 【sdk7aq】

问题

我添加之后发现IPV6竟然不显示位置,IPV4是正常的,挂了全局代理的也不能正常显示真实地址.后续显示IPV6真实地址请教了老大哥1xg通过数据库的方法来实现,

打赏


哇 你要支持我吗?太慷慨了!谢谢
上一篇
下一篇
评论 ( 27 )
  1. 林羽凡

    我滴个妈,这个好复杂,我是直接获取ip,再通过接口获取地理位置,10行就搞定了。

    2022年05月18日 回复
    1. 其实我就是懒折腾 如果用接口我还要看看怎么使用

      2022年05月18日 回复
      1. 林羽凡

        你也有这个表情包。

        2022年05月18日 回复
        1. 那必须呀的

          2022年05月19日 回复
      2. 林羽凡

        相信自己,折腾起来。

        2022年05月18日 回复
        1. 正在折腾呢~

          2022年05月19日 回复
  2. vian

    这个功能确实火了一把 不过我不打算加 只能说没必要吧 显示出来不太好 不像微博啥人都有 博客小圈子都是自己人 显示地址多有冒犯

    2022年05月18日 回复
    1. 其实我是想像林羽凡博客哪样显示地方的特色,但小老弟技术有限,无这个能力.

      2022年05月18日 回复
      1. vian

        直接请教他

        2022年05月18日 回复
        1. 等下厚脸皮去他博客留言

          2022年05月18日 回复
  3. 小赵同学

    不错的 其实只显示省份会更好 有的访客不太喜欢显示到市区

    2022年05月18日 回复
    1. 小赵同学 已经改好了 来看看效果呀

      2022年05月18日 回复
    2. 好的 我看看怎么更改

      2022年05月18日 回复