阅读视图

发现新文章,点击刷新页面。

WP-UserAgent [纯真增强版] 15.01.01

之前为了下载纯真的ip 地址数据库订阅了他们的公众号,前几天的时候看到推送说什么数据库格式更新了,有了 czdb 的格式,并且提供了各种语言的 sdk。

不过这个东西应该不是最近才推的,因为印象里貌似很久之前就看到皇家园林写的数据库迁移的文章。官方给的sdk 地址是这个:https://github.com/tagphi/czdb_searcher_php

按照文档操作,感觉也不复杂,直接:

composer require czdb/searcher

composer导入,就一行命令的事,但是为了弄个插件,需要在服务器上装这么个东西?那插件安装到别的地方也麻烦啊。想着一次性解决这个问题,直接下载源码,修改导入方式,按照网上的教程一通改,并不好使,最后 还是请教杜郎,才解决了这个问题:

composer

真不错,直接小花花+1.

下载 copmoser 导出的包,直接扔到插件目录下,

因为最终要修改的是 ip2text.php 文件中的convertip函数,所以直接扔到 show-useragent 目录下,在代码中导入代码,并且初始化:

require_once __DIR__ . '/vendor/autoload.php';

use Czdb\DbSearcher;

$v4databasePath = dirname(__FILE__).'/czdb/db/cz88_public_v4.czdb';
$v6databasePath = dirname(__FILE__).'/czdb/db/cz88_public_v6.czdb';

$queryType = 'MEMORY';
$key = 'n2pf2******************==';

// Initialize the DbSearcher with the command line arguments
// $instance = new SomeNamespace\SomeClass();

$v4dbSearcher = new DbSearcher($v4databasePath, $queryType, $key);
$v6dbSearcher = new DbSearcher($v6databasePath, $queryType, $key);

// $dbSearcher = new DbSearcher($databasePath, $queryType, $key);

function convertip($ip) {
    global $v4dbSearcher;
    global $v6dbSearcher;
    try{
        if(strpos($ip, ':') != false){
            $region = $v6dbSearcher->search($ip);
        }else if (strpos($ip, '.')!= false)
        {
            $region = $v4dbSearcher->search($ip);
        }else{
            $region='Unknown';
        }
    }catch (Exception $e) {
        // Handle the exception and inform the user
        $region = 'Exception';
    }
   
    return $region;
}

这里初始化了两个DbSearcher,分别对应 v4 和v6的查询。查询代码也很简单,就上面这几行。

同样,既然有了国家代码,那剩下的就是去掉原来通过接口查询所属国家的问题了,之前用接口是因为qqwry.dat 旧版本没有 v6 的数据,后来也一直没更新,所以归属地现实国旗是通过接口实现的,现在既然 46 都有了,那就可以直接本地解析了,不过比较坑爹的是 v4 的地址是“-”拼接的,v6 的地址感觉是空格,实际上是个制表符’\t’,为了这个制表符废了半天的劲,一直解析不出来,直接头大:

function getCountryName($str) {
    $parts = explode('–', $str);
    $name = count($parts) > 0 ? $parts[0] : '';
    // print($name);
    if (strpos($name, " ")!==false){
        $parts = explode(" ", $str);
        $name = count($parts) > 0 ? $parts[0] : '';
        // print($name);
    }
    if (strpos($name, "\t")!==false){
        $parts = explode("\t", $str);
        $name = count($parts) > 0 ? $parts[0] : '';
        // print($name);
    }
    return $name;
}

之所以解析不出来是最开始的if (strpos($name, “\t”)!==false)用的单引号,后来才发现,单引号下转义字符无效,这尼玛是凭什么啊,果然 php 是最好的语言。

后面就是讲国家名转换为 2 位国家代码了:

function getCountryCode($countryName) {
    $countryMap = array(
        '中国' => 'CN',
        '美国' => 'US',
        '日本' => 'JP',
        '韩国' => 'KR',
        '俄罗斯' => 'RU',
        '法国' => 'FR',
        '德国' => 'DE',
        '英国' => 'GB',
        '意大利' => 'IT',
        '加拿大' => 'CA',
        // 省略部分国家地区
        '瓦利斯和富图纳' => 'WF',
        '也门' => 'YE',
        '赞比亚' => 'ZM',
        '津巴布韦' => 'ZW',
        );
    $countryName = removeWhitespace($countryName);
    $countryCode = 'unknown';
    if (isset($countryMap[$countryName])) {
        $countryCode = $countryMap[$countryName];
    }
    // ; return $countryCode;
    return strtolower($countryCode);
}

到这里改造基本就全部完成了。

更新日志:

= v15.01.01 =
* 替换本地IP归属地查询数据库为纯真CZDB格式
* 替换IPv6归属地查询,替换为本地数据库,去掉查询服务器配置功能
* 鉴于纯真数据库需要授权码,需要去 https://cz88.com/geo-public 获取授权密钥以及数据库文件
* 密钥配置文件,ip2c-text.php $key = 'n2pf2******************pg==';
* 数据库下载之后放入show-useragent\czdb\db 目录下,文件名分别为: cz88_public_v4.czdb cz88_public_v6.czdb

插件安装无法直接使用,请按照下面的步骤操作:

* 需要去 https://cz88.com/geo-public 获取授权密钥以及数据库文件

* 密钥配置文件,ip2c-text.php $key = ‘n2pf2******************pg==’;

* 数据库下载之后放入show-useragent\czdb\db 目录下,文件名分别为: cz88_public_v4.czdb cz88_public_v6.czdb

实际效果:

插件下载地址:

温馨提示: 此处隐藏内容需要发表评论,并且审核通过后才能查看。
(发表评论请勾选 在此浏览器中保存我的显示名称、邮箱地址和网站地址,以便下次评论时使用。
(请仔细检查自己的昵称和评论内容,以免被识别为垃圾评论而导致无法正常审核。)

WordPress接入纯真IP库CZDB版本

之前,本站基于纯真IP库实现评论者IP归属地,用的好好的,突然官方又改变策略了,推出czdb数据格式,并在10月1日开始停止dat格式和exe格式的发布(详情见官方公众号)。

新版本的要求就多了,首先你得在官方注册登录,其次根据它的要求帮它宣传(我是在本博客底部加上他们网站的链接),并截图给他审核,通过之后你才会有授权,你才能得到key。有了这个key你才能使用czdb格式数据库。我个人是不太喜欢需要通过这种方式才能得到的一些东西,吃相有点难看了。但是没办法,好像也找不到更好的选择了。

CZDB目前官方已支持JAVA、C语言和PHP解析程序,我们直接拿来用就可以了。下面主要说说咱们WordPress的食用方法,也就是PHP的解析程序。

PHP解析程序的GitHub地址:czdb_searcher_php

在项目目录下运行以下命令来安装 CZDB Searcher:

composer require czdb/searcher

如果找不到包,可能是因为你没有使用composer 2.x版本,可以使用以下命令来安装composer 2.x版本:

composer self-update --2

然后将下面代码扔进functions.php文件里:

//解析纯真IP获取评论者ip归属地 开始

require_once __DIR__ . '/vendor/autoload.php';

use Czdb\DbSearcher;

//评论作者归属地函数
//Code by HJYL.ORG
//IP数据库由纯真CZ88提供
function getCity($ip){
    $dbSearcher = new DbSearcher("cz88_public_v4.czdb的路径", "BTREE", "key");
    // get_template_directory() . "/czdb/cz88_public_v4.czdb" 这是某主题目录下的文件夹
    // 默认BTREE,搜索模式(例如,"BTREE" 少量查询 或者 "MEMORY" 大量查询)。
    // key,即密钥,从https://cz88.net/geo-public获取
    
    $region = $dbSearcher->search($ip);
    // 将字符串拆分成各个部分
    if(strpos($region, "\t")){
        $region = preg_replace('/\t+/','–',$region);

    }elseif(strpos($region, " ")){
        $region = str_replace(' ','–',$region);
    }

    $region = explode("–", $region);

    //分别获取国家、省、市字段
    $country = $region[0] ?? "";
    $province = $region[1] ?? "";
    $city = $region[2] ?? "";

    $dbSearcher->close();

    //优先显示城市,其次省,最后国家
    if($ip == '127.0.0.1'){
        $data = '小黑屋';
    }elseif($city == "" || false !== strpos($city, '移动') || false !== strpos($city, '电信') || false !== strpos($city, '联通')){
        $data = $province;
    }elseif($province == "" || false !== strpos($province, '移动') || false !== strpos($province, '电信') || false !== strpos($province, '联通')){
        $data = $country;
    }else{
        $data = $city;
    }
    
    return $data;
}

//解析纯真IP获取评论者ip归属地 结束

调用方法:

echo getCity(get_comment_author_IP());

结束撒花~~~

花絮:

这个版本的数据库支持IPv4和IPv6,其实之前的那个itbdw/ip-database也是支持IPv4和IPv6的,只是纯真没有IPv6数据库。这次发布了IPv6数据库,但是我也用不上。

这段代码的解析思路是这样的:根据IP查询数据库,得到的格式是这样的——“中国–安徽–合肥 移动”,然后将其拆解,分别得到国家、省、市。别看这格式很简单,我测试了很久,才发现移动前的空格不仅有空格,还有制表符“\t”,这是目前我遇到的,不知道还有没有其他看不见的符号了。

最让人吐槽的是纯真社区版IP库在地级市的准确率上不是很高。所以不必较真,仅供娱乐而已。

版权声明: 本文采用 BY-NC-SA 协议进行授权,如无注明均为原创,转载请注明转自 皇家元林
本文链接: WordPress接入纯真IP库CZDB版本
❌