之前为了下载纯真的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
实际效果:
插件下载地址:
86 comments
我自从使用了edgeone,我的位置就一直飘忽不定
这属于高端漫游了,哈哈哈
你这个插件还集成了这个归属地啊,厉害了!
那个制表符也废了我很长时间,突然一个意外才让我发现这个是个制表符。
对了是不是服务器需要支持 IPv6 才能记录访问者的 IPv6 啊?
是哒 需要服务器支持V6 我的现在也不支持 还被杜郎嘲笑了 因为我要做v6的适配 哈哈哈
哈哈,也不奇怪啊!或许其他人需要呢!
嗯呢,想着是,既然折腾一次,就给折腾好了。
是调本地的,还是调远程接口?我用的是调免费接口,还挺稳定的
全部远程接口都去掉了。纯本地代码查询
那要是有新的ip出来也会同步更新吗?
ip地址库是定时更新的,如果要提升准确度就得定期更新地址库。
新增ip应该不会,毕竟是按地址段来的,最多会细化一些。
要是知道会被挂出来,我会认真一点,不写错别字。
瑕不掩瑜,不要在意这些细节,嘎嘎
一直觉得WP很重,今天看了你的依赖包,才大概知道了有多重!
最后,PHP是最好的语言!
这个插件本来设计的架构就比较重,所以,再一层层的添加功能就变得更加庞大了。
你这网站就挂了个黑客帝国风格的瀑布流啊~~
٩(•̤̀ᵕ•̤́๑)ᵒᵏᵎᵎᵎᵎ 看来你已经忘记了入口密码了
啊?这,密码是啥?
论破解,你是专业的,所以,首页密码这点小把戏肯定难不倒你。
哼唧,哼唧,干嘛把 blog 链接藏起来嘛~~
快说,除了能看到的那些是不是还有见不得人东西?
藏起来,可以过滤一部分无效流量,最后能找到入口的,肯定是很有趣的人。这样很有意思,不是嘛!
嗯嗯,很有道理的样纸,真是个小机灵鬼~~
一直用的你的13,前段时间不是查照我网站评论慢的原因,所有的插件都去掉了。现在正常了,正巧15也更新了,晚点儿的时候试试。一上午优化我的卡片功能,你的页面标题和描述,一会儿能抓取成功,一会儿又抓取不了了,飘忽不定。
嗯嗯,这个 归属地去掉网络查询之后,速度应该能快不少,尤其是评论多的时候。
可以先去申请下那个密钥,这个审核大概得一两天。
没看懂他那个审核前需要用户上传的截图?把15的相关代码截图发过去吗?怎么证明正在使用纯真?
不用证明在用,就是帮他们宣传,类似酱紫的。
看我博客的右下角:
明白了,我加到页脚下。
其实他这个有点丑,我想把那个链接换成图片,结果他们的 logo 是透明的,哈哈哈。
我把他们 logo 改了下颜色,给换上了。哈哈哈
logo霸占了,我要左边这个标志就行。
啊,哪个 logo?
你那改完透明的LOGO。
https://www.cz88.com/assets/logo_white-qqXrA-tc.png
他这个本身就是透明的
这个是单独的 logo
https://h4ck.org.cn/img/cz88-icon.png
我在https://github.com/nmgliangwei/qqwry/releases下载了cz88_public_v4.czdb和cz88_public_v6.czdb,并放入了对应目录,现在缺少一个密钥,我以为是开发者密钥,但看文件里你发的开头部分应该不是。我激活数次没有成功,一直提示“无法启用插件,因为它引起了一个致命错误(fatal error)。”,查看网站错误日志,提示错误如下https://my1981.cn/cuowutishi.jpg。我的环境如下:PHP8.3+Nginx -Tengine2.2.4(3.1.0)+MYSQL5.6,WP是最新版本。
这两个文件是需要和密钥对应的,感觉是不同的密钥要下载不同的数据库,这个通用的应该解不出来。
show-useragent 目录下有个 sample.php,可以直接使用 php 加参数运行,如果这个跑不起来就说明密钥和数据库不对应,这个不是开发者密钥,要审核通过之后再下载页面才能复制到密钥。
等于说是需要所有的先配置好才能激活插件。
是的呢~~
谢谢灵妹子不吝赐教,静等审核了。
客气啦
已经通过审核并成功激活了。php8.3下有个小BUG,激活后前台提示/wp-useragent/show-useragent/show-useragent.php第65行if($ip == ‘127.0.0.1’){中$ip未定义,需要在64行function CID_get_flag_without_template($ip, $country_code这里左括号(后面加个$ip。
嗯嗯,7的代码校验没那么严格,没报错所以就没注意这个变量问题。
速度呢?有没有感觉比上个版本要快一些?
速度我感觉一直都挺快的,上个版本我用的也是本地版。
嗯嗯
牛叉呀,现在我博客都在弱化这个 功能了,经常发现很多地方的这个IP都不准
嗯嗯,的确社区版的准确度差点,不过这中国地大物博,根据归属地聊天,也能知道他那里现在是艳阳高照,还是白雪皑皑,哈哈哈
所以我觉得还是有点意思的,留着这个东西
我看看我这个准不准
咋样,准不准~~嘻嘻
厉害了,我试试我的
嗯嗯
很精准了啊,可以顺着网线去了 哈哈
哈哈哈 这么离谱的吗
hexo用户表示,唉这是啥?这又是啥。哈哈哈
欢迎投入 wp 的怀抱
IP测试
再试试
灵妹妹,你拉链开了
额,~~ 开了就开了吧
这回对了,估计是挂了代理,IP没刷回来
感觉比之前的那个要准确一些。
魔法看看地址在哪儿。
不知道哪个不准,魔法说是日本,显示香港。
香港显示黎巴嫩~好吧
哈哈哈,这,那看来 ip 的准确度还是一般,不过能知道是国外就 ok 了,😂
搞的工程好大啊,我也来测测准确性~
本来就不小了,嘿嘿。我在原来的基础上又加了东西,所以更大啦。
VPN 成功隐藏了我的真实地址,嘿嘿
可不,用 vpn 不就这点好处嘛,嘻嘻
在子比主题下启用插件什么都不显示,周末有空了还需要调试一下
没用过这个主题
真不错
这就厉害了,我来看下我的ip归属能正确识别不
对不
太专业了,没看懂。。。
能用就行 哈哈
从开始接触网络,就没有折腾过IP库!
没需求就可以不折腾啦
很高端啊,先申请个授权试试
嗯嗯,比上个版本改动还是蛮大的。网络请求部分全部改成本地了。
秀。我也来看看。
咋样
走本地也挺好的。之前就用的纯真的,有人说不准,就换了高德的。偶尔会超量。就又换了插件,本地、高德、腾讯可切换的。也是折腾过不少哈哈哈。
高德还有 ip 地址的库?这个倒是没用过
有的。只有IPv4且国内咯。https://lbs.amap.com/api/webservice/guide/api/ipconfig/
那这个确实比较麻烦,之前就是 v4 v6走的不同的方式。