引言
今天无聊在瞎逛其他博客站点,在一位博主的站点上看到了相关的文章:给评论区添加IP归属地,感觉还不错,于是自己也上手折腾了,操作起来十分的简单,当然要根据自己的主题代码来使用这项功能,灵活变通即可。
给博客评论区添加IP归属地,只需要一段长代码(functions.php)、一段短代码(引用代码)、一个文件(网站根目录)。
效果:
实现步骤
思路:将一段长代码放进主题functions.php文件中,然后还需要将一个文件放在网站的根目录下,随后引用函数代码即可,下面以本站作为演示。
1.将以下代码放入主题的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
<?php echo convertip($comments->ip); ?>
此时,博客评论区添加IP属地功能就添加完成了,受数据库影响,其真实地址不一定准确。
思路仅供参考,具体情况请根据自己的主题来添加此功能。
原教程链接:https://blog.sdgou.cc/archives/174.html
永恒末匕
11月11日学习学习
广西贵港市 Windows 10 · Google Chromesxltx
2022年11月11日666666
山东省 Windows 10 · Google Chrome溯源
2022年09月12日能不能出个引用的哇,8M放本地太大了
广东省肇庆市 Windows 10 · Google Chrome呆呆怪 博主
2022年09月13日@溯源 ,引用的话,也简单呀,代码第七行: $dat_path = './qqwry.dat'; 改成引用的路径即可。
美国 Windows 10 · Google Chrome溯源
2022年09月30日@呆呆怪 ,外链也可以嘛
广东省肇庆市 Windows 10 · Google Chrome呆呆怪 博主
2022年09月30日@溯源 ,应该可以的!我具体也没试过,哈哈哈哈
广东省广州市海珠区 Windows 10 · Google Chromehero
2022年08月09日6666
山东省 Windows 10 · Google Chrome小李
2022年05月30日过来试试
山西省长治市 Windows 7 · Google Chrome呆呆怪 博主
2022年05月31日@小李 ,OωO
广东省广州市 Windows 10 · Google Chrome小赵同学
2022年05月26日hello 我是你的美国朋友
美国 Windows 10 · Google Chrome呆呆怪 博主
2022年05月26日@小赵同学 ,老乡见老乡,我也是美国
美国 Windows 10 · Google Chrome