某日突发奇想,想把博客网站的访问数据导出来,看看访问量的变化情况。
在开发之前,先要确认两件事情。首先是不蒜子有没有提供类似的功能,可以直接将历史访问数据导出来。翻看不蒜子官网,发现并没有提供类似的功能。这样好理解,毕竟只是一个极简计数器,没有记录访问时间。第二,有没有人做过类似的扩展。经过一番搜索,发现还真有:导出不蒜子的访问量数据。可惜找来找去,只有这一篇。但是又不太符合自己的需求,只好自己重新开发。主要是别人写的看不懂,自己不会维护( ╯□╰ )。
¶准备
首先要定义好需求。定时导出每篇博文的访问量数据,并绘制成可视图形。根据这个需求,有以下点需要实现。
- 利用不蒜子提供的接口,导出一篇博文的访问量数据。
- 获取博客网站所有博文的URL。
- 定时执行脚本。
- 数据可视化:TODO。先按照一定的格式存储到文件中。
¶使用不蒜子的接口获取数据
根据查询到的资料,和阅读不蒜子的XML文件,访问如下URL可以获取访问量数据。URL最后的数字是一个随机数,可以不用太关心。
1 | http://busuanzi.ibruce.info/busuanzi?jsonpCallback=BusuanziCallback_1046609647591 |
使用Chrome打开任何一个添加了不蒜子计数的网站,进入开发者模式,在Network选项卡下,可以找到下图所示的信息。如果没有,刷新一下网页。可以看出,在Header中,通过referer指定查询的URL。经过实验,每访问一次,site_uv、page_pv、site_pv都会增加1。加上cookie后,site_uv不会增加,page_pv和site_pv还是会增加1。cookie是一个32位的UUID。
通过curl可以验证这个接口。返回的数据是jsonp格式,需要稍微处理一下。
1 | [root@localhost ~]# curl -H 'referer: http://test.inc' -H 'cookie: busuanziId=967989F380504D9E8F3A5FA7B5F9EFAD' -X GET 'http://busuanzi.ibruce.info/busuanzi?jsonpCallback=BusuanziCallback_1046609647591' |
¶获取博客网站所有博文的URL
开启sitemap可以达到这个目的,sitemap.xml存储了本网站的所有URL。如果是使用的HEXO,在hexo根目录下执行下面两条命令,开启sitemap功能。
1 | npm install hexo-generator-sitemap --save |
¶定时执行
可以在自己的电脑上,或服务器上加个定时任务。但这里决定白嫖Github Actions。定时执行,并将存储到文件的结果commit到GitHub仓库。
¶脚本实现
传送门:https://github.com/pkemb/blog_puv_statistics
¶数据抓取和提交
脚本export_busuanzi_data.py负责抓取数据,并存储到文件page_puv_statistics_{year}.json。考虑到是用文本文件,长久运行后数据量可能比较大,所以按年分割,存储到不同的文件。
脚本commit.sh负责提交数据到GitHub仓库。
¶设置Github actions
Github actions脚本有两点要注意。首先需要设置运行环境,因为脚本需要Python2.7、bs4和lxml,需要在运行之前安装好。这里需要一些语法知识,可以参考官方文档和阮一峰的GitHub Actions 入门教程
第二是设置deploy key,在提交结果到仓库的时候,不可能手动输入密码,所以要设置deploy key。在本地终端执行下面的指令,-C后面的邮箱换成自己的,也可以换成任意注释字符串。执行完成之后,会得到私钥文件id_rsa和公钥文件id_rsa.pub。
1 | ssh-keygen -t rsa -f id_rsa -C "email@email.com" |
私钥设置到Actions secrets。进入到仓库的设置界面,点击左下角的Secrets,然后点击右上角的New repository secret。Name可以随意填,后面会用到。Value填文件id_rsa的内容。
公钥设置到Deploy keys。同样进入仓库的设置界面,左边选择Deploy keys,然后点击右上角的Add deply key。Title随意填,Key填写文件id_rsa.pub的内容。由于是要提交数据,需要勾选下方的Allow write access。
下方是actions设置key的代码。SECRETS_KEY是Actions secrets的名字,根据实际设置的名字修改即可。
1 | - name: Setup Deploy Private Key |
¶数据可视化
TODO,待填坑。