基于纯真IP库实现评论者IP归属地

7个月前 12

还记得纯真IP——QQWry.dat吗?

从我开始会上网的时候,外挂版QQ上的小卡片就显示对方的IP地址及其归属地了。

来自于知乎

QQWry.dat文件是显IP版QQ的数据库文件,用于获取对方IP及位置,纯真IP数据库也采用了这个格式,并沿用至今。

纯真IP库[官网]是民间自发收集、提交、聚合而来的数据库,囊括了国内外的大量IP数据,部分记录甚至比商业付费数据库更加准确。它的官网提供了记录提交和纠错的功能,来自全国各地的网友将不同地区的ISP及位置数据上传,管理员在统一整合后每5天更新一次。从2005年到现在的16年间,这个数据库已经聚合了超过五十万条IP记录。

纯真IP库是完全免费的,它的官网上有在线查询功能,同时也可以下载离线数据库用于低延迟场景,但数据不可用于商业用途。这些记录在稍加分析处理后能达到不错的效果,基本满足定位IP所处城市及ISP信息的需求,不过它目前只支持IPv4地址,在一些应用场景下稍显不足。

话不多说,言归正传,此PHP解析纯真IP数据库的源代码来自于itbdw/ip-database,有很长一段时间没更新了,最新版本为3.X,支持ipv4+ipv6,如需要2.x稳定版请访问 https://github.com/itbdw/ip-database/tree/2.x

下载好文件IpLocation.php、QQwry.php、IpV6wry.php、StringParser.php、IpParserInterface.php,放在一个文件夹里(或者直接用我整理好的文件),上传到主题目录里。

把以下代码甩进functions.php即可:

//解析纯真IP获取评论者ip归属地 开始
//Code By HJYL.ORG
require get_template_directory() . '/qqwry/IpParserInterface.php';
require get_template_directory() . '/qqwry/IpLocation.php';
require get_template_directory() . '/qqwry/QQwry.php';
require get_template_directory() . '/qqwry/IpV6wry.php';
require get_template_directory() . '/qqwry/StringParser.php';
use itbdw\Ip\IpLocation;
function getCity($ip){
	if(empty($ip)) $ip = get_comment_author_IP();
	$qqwry_filepath = get_template_directory() .'/qqwry/qqwry.dat';
    $getLocation = json_encode(IpLocation::getLocation($ip, $qqwry_filepath), JSON_UNESCAPED_UNICODE) . "\n";
    $IPinfo = json_decode($getLocation, true);
    $country = $IPinfo['country'];
    $province = $IPinfo['province'];
/***************************************
    //优先显示城市,其次省,最后国家
    $city = $IPinfo['city'];
	if($ip == '127.0.0.1'){
		$data = '小黑屋';
	}elseif($city != ""){
        $data = $city;
    }elseif($province !== "" && $city == ""){
        $data = $province;
    }else{
    	$data = $country;
    }
**************************************/
	if($ip == '127.0.0.1'){
		$data = '小黑屋';
    }elseif($province !== ""){
        $data = $province;
    }else{
    	$data = $country;
    }
    
    return $data;
}
//解析纯真IP获取评论者ip归属地 结束

调用方法:

echo getCity(get_comment_author_IP());

它支持composer写入内存,再读取:

composer require 'itbdw/ip-database'   #注意^3.0只支持PHP5.4~7.0

到此结束!

画外音:折腾了一圈才发现,纯真数据库qqwry.dat也有 IPIP.net 格式版——qqwry.ipdb,来自于metowolf /qqwry.ipdb,目前最新纯真IP免费版数据库日期为2023.09.20。也就是说我之前用的大发分享的WordPress插件Easy Location IP数据库也可以更新到纯真IP最新版数据库了,不想麻烦的,也可以用这个。

—— 完 ——

12 条评论

  1. #1

    有时候不准确的,比如我的地址有时候在你显示为昆明,有时候显示为重庆

    • @sagrre 是的,这可能就是免费版本与付费版本的区别吧!

  2. #2

    特意看了下,不是你一个人不对,我自己的也不对,估计库就错了

    • @sagrre 好吧,还不如前几年的那个数据库。只不过最近突然不显示了,所以才折腾这个。不要求太准确。哈哈。

  3. #3

    不错不错,,显示正确

  4. #4

    竟然有免费的v6的地址了?之前没发现呢

    • @obaby 我看目前这个免费版还没有IPv6啊,只是这个解析程序支持解析ipv6

  5. #5
    啊baby
    啊baby -@

    没有IPv6库?

    • @啊baby 是的,纯真IP社区版确实只支持IPv4,不支持IPv6的。商业版支持IPv6。

  6. #6
    KK
    KK -@

    收藏本文哈哈哈