折腾重定向之后(详见 站内文章这篇文章),一个以前没考虑到的小问题来了——不蒜子页面的统计量清零了。

虽然不是什么大问题,但是感觉有点可惜啊。而且通过页面浏览量还能分析哪些文章比较多人看,可以把维护精力放到一些不是很水的文章上面(我猜蜀黍也容易在那出没)。这种情况应该很多博主都遇到,于是赶紧友链朋友圈搜搜大家都是怎么做的:

  • 方法一:自建不蒜子服务,并通过其他项目将不蒜子数据迁移到自建服务上。但是看起来好麻烦啊喂😮,不是很想再维护多一个系统。
  • 方法二:选用其他的统计服务。但是我的目的是想知道 busuanzi 中原来记录有的数据。
  • 方法三:使用 Waline 评论系统带有页面浏览量统计,Butterfly 主题支持切换。结果打开配置文件一看,我早就把 Waline 的这个功能关闭了,统计还是得从头算起。

最后我的方案是:

  • 决定把统计数据交给 Waline,「内聚」一下,少一点系统的维护。而且数据存在于服务器 MySQL 里,个人容易掌控。
  • 我需要工具或脚本获取 busuanzi 服务器中原有的数据,导出成文件以便整理
  • 根据导出的数据生成 SQL 方便在 Waline 中更新

于是,一个 Python 命令行程序诞生了:

Readme Card

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 表是专门用于统计每个页面的数据的,比如页面浏览量、各个反应表情的数量。

image.png

注意到,url 字段并不是 UNIQUE 的,Waline 在更新数据时会更新所有 url 属性匹配的记录。

并且,只有在文章被浏览,或有人点了文章反应,一条对应 url 的记录才会出现在数据库中。

小插曲:找出缺失的那道菜

给你两份菜单,除了其中一份菜单少一样菜外,两份菜单中的菜名都能一一对应起来,两份菜单上的菜排列顺序是乱的,如何找出缺失的那道菜是什么?不要写代码,立即通过现成的软件解决。

背景是我发现 Waline 数据库莫名其妙多出一个文章记录,我想找出来是哪一条。

IDEA、记事本等文本编辑器没想出来。我反正使用了 Excel 的排序和函数弄出来了。

此外,ChatGPT、讯飞星火、文心一言、豆包也都能正确回答。

生成 SQL

我们总不会一个一个更改数据表或手动添加记录。我的思路是,数据表 wl_Counter 有对应 url 的记录就跳过,没有的就加上。对应的 SQL 应该长这样:

1
2
INSERT INTO wl_Counter (url, time) SELECT '/p/d4bc55f2/', 0 WHERE NOT EXISTS (SELECT 1 FROM wl_Counter WHERE url = '/p/d4bc55f2/');  
INSERT INTO wl_Counter (url, time) SELECT '/p/e1ee5eca/', 0 WHERE NOT EXISTS (SELECT 1 FROM wl_Counter WHERE url = '/p/e1ee5eca/');

为匹配的 url 增加页面统计量,那么用于更新的 SQL 应该长这样:

1
2
UPDATE wl_Counter SET time = IFNULL(time, 0) + 2 WHERE url = '/p/d4bc55f2/';  
UPDATE wl_Counter SET time = IFNULL(time, 0) + 2 WHERE url = '/p/e1ee5eca/';

我们可以编写脚本完成这些事情。

不蒜子数据导出脚本

Readme Card

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/"  
	}  
]  

其中:

得到文件 out_ins.sqlout_add.sql 即为生成的 SQL。

完成

然后就大功告成了!你还可以修改 sitemap.txt 文件,将一些奇奇怪怪地址的统计量聚合一下。比如以下这两个地址其实指向同一个页面,我们可以将分别获取它们的统计量多次更新 Waline 数据库即可。

  • https://a.com/xxx/index.html
  • https://a.com/xxx

此外,刷出某网站的页面统计量的功能也算是脚本的额外功能吧。如果你想将评论系统中的页面访问数据迁移到不蒜子,可以通过这个脚本刷出来。具体方法是在 sitemap.txt 构造多个相同的地址就行。

本文参考