防止天塌下来最好的办法,就是把地给颠倒过去。
阅读视图
WP-UserAgent [纯真增强版] 15.01.01
之前为了下载纯真的ip 地址数据库订阅了他们的公众号,前几天的时候看到推送说什么数据库格式更新了,有了 czdb 的格式,并且提供了各种语言的 sdk。
不过这个东西应该不是最近才推的,因为印象里貌似很久之前就看到皇家园林写的数据库迁移的文章。官方给的sdk 地址是这个:https://github.com/tagphi/czdb_searcher_php
按照文档操作,感觉也不复杂,直接:
composer require czdb/searcher
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
实际效果:
插件下载地址:
温馨提示: 此处隐藏内容需要发表评论,并且审核通过后才能查看。
(发表评论请勾选 在此浏览器中保存我的显示名称、邮箱地址和网站地址,以便下次评论时使用。)
(请仔细检查自己的昵称和评论内容,以免被识别为垃圾评论而导致无法正常审核。)
一个化学实验
咖啡这种东西,搞不懂为什么会有那么多的注意事项。在我看来,那就是一个严谨的实验过程。最终那个结果到底是成功不成功,不同人对同样的东西可能有不同的看法。所以大家追求的到底是什么呢?
首先是咖啡豆,咖啡豆的出生有些时候已经决定了它品质的好坏,比如产地。外国非常在乎某东西的产地,比如同一个品种的葡萄在这里跟在那里种出来酿成葡萄酒,这个地方的就可以称之为某个品牌而另外一个就什么都不是,哪怕可能葡萄的质量是一样的。咖啡豆也一样,咖啡豆的产地让某些咖啡豆子自带光环。产地是一个很重要的因素。
接下来是烘培。好的豆子被搞砸了肯定会让人觉得非常惋惜。对一般的消费者来说。烘培以及之前的那些步骤都不可控,大概普通人不会在家里自己烘培咖啡豆吧。所以对一般消费者来说,拿到烘焙好的咖啡豆才算是这个实验的开始。
拿到了豆子,要怎么储存?储存的容器是有讲究的,因为哪怕是烘培过的豆子也会有呼吸,会产生二氧化碳,所以那个容器,据说那个好的咖啡豆容器是有单向排气阀的,可以让里面的二氧化碳排出去,不让外面的气体进入到里面去。
很多地方现磨咖啡都是很强调现磨这两个字,这就意味着现磨和现成的咖啡粉带出来的效果是不一样的。据说咖啡豆被磨成咖啡粉以后,风味物质很快就会丧失,所以得强调现磨。这里就带出了第2个参数,用什么东西把咖啡豆磨成咖啡粉?在这里就要进一步考虑这个咖啡粉之后是通过什么方式萃取出咖啡液的,不同的萃取方法意味着不同的咖啡粉颗粒度。咖啡店最经典的是意式浓缩咖啡的机器。现在的中国人在家里,我感觉上玩得比较多的是手冲,因为相对于其它来说,不需要太多的高端设备,但又能做出很多不同的效果。除了这两款以外,还有摩卡壶、法式压滤壶、冰滴、冷萃什么的。从化学的角度考虑,如果把手冲看作是普通的过滤,为什么就没有人用抽滤的方式得到咖啡液呢?在我的记忆之中,大学课程里面的过滤,一个是普通的过滤,是在常压状态下进行的,第二个就是抽滤。相对于普通常压过滤来说,抽滤速度很快,而且某些东西如果你不用抽滤的方法,而使用常规的过滤,非常有可能你根本过滤不出来,因为那个东西直接就在滤纸上结晶了。话说回来。当年的抽滤主要是为了得到抽滤液中的固体。相比于一般的过滤,抽滤的速度更快,所以如果咖啡进行这种操作,估计意味着咖啡要先浸泡一段时间然后再抽。这种浸泡式跟法压壶的操作有什么区别呢?唯一的差异大概就是抽滤出来的液体应该都很清澈,但是法压壶会有很多漏网之鱼。
萃取咖啡有很多方式,这些方式里面又自带了很多影响因素,比如温度、时间,还有某些让人觉得需要控制,但不是所有人都能控制好的液体流动。因为有这样那样的因素影响,所以虽然物质基础是相同的,但不同操作者得出的结果估计没有哪个是一样的。
对一般人来说,咖啡可能只是个提神的饮料,但是对痴迷者来说,这个东西的耐玩程度实在高。
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库在地级市的准确率上不是很高。所以不必较真,仅供娱乐而已。
本文链接: WordPress接入纯真IP库CZDB版本