将不蒜子中的数据迁移到 Waline
折腾重定向之后(详见 站内文章这篇文章),一个以前没考虑到的小问题来了——不蒜子页面的统计量清零了。
虽然不是什么大问题,但是感觉有点可惜啊。而且通过页面浏览量还能分析哪些文章比较多人看,可以把维护精力放到一些不是很水的文章上面(我猜蜀黍也容易在那出没)。这种情况应该很多博主都遇到,于是赶紧友链朋友圈搜搜大家都是怎么做的:
- 方法一:自建不蒜子服务,并通过其他项目将不蒜子数据迁移到自建服务上。但是看起来好麻烦啊喂😮,不是很想再维护多一个系统。
- 方法二:选用其他的统计服务。但是我的目的是想知道 busuanzi 中原来记录有的数据。
- 方法三:使用 Waline 评论系统带有页面浏览量统计,Butterfly 主题支持切换。结果打开配置文件一看,我早就把 Waline 的这个功能关闭了,统计还是得从头算起。
最后我的方案是:
- 决定把统计数据交给 Waline,「内聚」一下,少一点系统的维护。而且数据存在于服务器 MySQL 里,个人容易掌控。
- 我需要工具或脚本获取 busuanzi 服务器中原有的数据,导出成文件以便整理
- 根据导出的数据生成 SQL 方便在 Waline 中更新
于是,一个 Python 命令行程序诞生了:
GitHub 项目地址:uuanqin/busuanzi2waline: 将不蒜子的页面浏览量导出为 json 格式的文件,并生成SQL语句以更新Waline数据库
自我吐槽:写脚本花的时间也很多好吧!
这篇文章主要分享解决思路,具体操作详看该项目的 README 说明。
获取不算子中的统计数据
不蒜子并没有提供现成的 API 直接获取数据。参考了一些文章,他们的方式是向不蒜子的服务器发送一个 HTTP 请求,请求头 Referer
参数设置为目标网址。比如使用 curl
命令如下:
1 | curl -H "Referer: {url}" -X GET http://busuanzi.ibruce.info/busuanzi?jsonpCallback=BusuanziCallback_577649258772 |
然后返回以下字符串:
1 | try{BusuanziCallback_1046609647591({"site_uv":21497,"page_pv":2,"version":2.4,"site_pv":38425});}catch(e){} |
page_pv
就是我们想要的数据,可以用一个正则提取出 JSON 就行。
拿到所有的网址
直接处理网站地图就行。因为安装有插件 hexo-generator-sitemap,网址地图 sitemap.txt
就躺在根目录下,我们只需要简单处理即可。
我的文章路径为 https://blog.uuanqin.top/p/xxxxxxx/
,我就把这些挑出来就行(使用顺手的编辑器快速编写正则)。
Waline 存储页面浏览量的方式
Waline 数据库有三个表,其中 wl_Counter
表是专门用于统计每个页面的数据的,比如页面浏览量、各个反应表情的数量。
注意到,url
字段并不是 UNIQUE
的,Waline 在更新数据时会更新所有 url
属性匹配的记录。
并且,只有在文章被浏览,或有人点了文章反应,一条对应 url
的记录才会出现在数据库中。
小插曲:找出缺失的那道菜
给你两份菜单,除了其中一份菜单少一样菜外,两份菜单中的菜名都能一一对应起来,两份菜单上的菜排列顺序是乱的,如何找出缺失的那道菜是什么?不要写代码,立即通过现成的软件解决。
背景是我发现 Waline 数据库莫名其妙多出一个文章记录,我想找出来是哪一条。
IDEA、记事本等文本编辑器没想出来。我反正使用了 Excel 的排序和函数弄出来了。
此外,ChatGPT、讯飞星火、文心一言、豆包也都能正确回答。
生成 SQL
我们总不会一个一个更改数据表或手动添加记录。我的思路是,数据表 wl_Counter
有对应 url 的记录就跳过,没有的就加上。对应的 SQL 应该长这样:
1 | INSERT INTO wl_Counter (url, time) SELECT '/p/d4bc55f2/', 0 WHERE NOT EXISTS (SELECT 1 FROM wl_Counter WHERE url = '/p/d4bc55f2/'); |
为匹配的 url 增加页面统计量,那么用于更新的 SQL 应该长这样:
1 | UPDATE wl_Counter SET time = IFNULL(time, 0) + 2 WHERE url = '/p/d4bc55f2/'; |
我们可以编写脚本完成这些事情。
不蒜子数据导出脚本
GitHub 项目地址:uuanqin/busuanzi2waline: 将不蒜子的页面浏览量导出为 json 格式的文件,并生成SQL语句以更新Waline数据库
本脚本的主要功能有:
- 根据提供的 sitemap 将不蒜子中存储的数据导出为 JSON 格式
- 支持通过从不蒜子导出的数据生成对应的 SQL 语句,以将数据更新到 Waline 中
- 由于每次脚本请求会记入不蒜子的统计量,有特殊需求的用户可以通过构造 sitemap 刷新网站的页面统计量
可调整的参数:
- 线程启动的间隔时间。设置太小的话请求速度过快,容易出错。
- 请求失败重试次数(梯度随机重试)
只需运行脚本:
python sql_generator.py -gi -gu
得到 out_add.json
文件中的数据即为导出的数据。
[
{
"site_uv": 419,
"page_pv": 2,
"version": 2.4,
"site_pv": 434,
"url": "/p/d4bc55f2/"
},
{
"site_uv": 420,
"page_pv": 2,
"version": 2.4,
"site_pv": 435,
"url": "/p/e1ee5eca/"
}
]
其中:
page_pv
表示对应路径url
下的页面浏览量site_pv
表示网站 https://blog.uuanqin.top 的页面浏览量site_pv
表示网站 https://blog.uuanqin.top 的独立访客数
得到文件 out_ins.sql
、out_add.sql
即为生成的 SQL。
完成
然后就大功告成了!你还可以修改 sitemap.txt
文件,将一些奇奇怪怪地址的统计量聚合一下。比如以下这两个地址其实指向同一个页面,我们可以将分别获取它们的统计量多次更新 Waline 数据库即可。
https://a.com/xxx/index.html
https://a.com/xxx
此外,刷出某网站的页面统计量的功能也算是脚本的额外功能吧。如果你想将评论系统中的页面访问数据迁移到不蒜子,可以通过这个脚本刷出来。具体方法是在 sitemap.txt
构造多个相同的地址就行。