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

发布时间: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. Mr.Chou

    同样的程序,赶紧下来试试。谢谢

    2022年06月01日 回复
    1. 这个方法是比较麻烦的,接口的方法更简单.

      2022年06月02日 回复
  2. 荒野孤灯

    是个大神!

    2022年05月25日 回复
    1. 我是小菜鸟一枚

      2022年05月25日 回复
  3. 风记星辰

    测试一下

    2022年05月19日 回复