0%

导出不蒜子的访问量数据

某日突发奇想,想把博客网站的访问数据导出来,看看访问量的变化情况。

在开发之前,先要确认两件事情。首先是不蒜子有没有提供类似的功能,可以直接将历史访问数据导出来。翻看不蒜子官网,发现并没有提供类似的功能。这样好理解,毕竟只是一个极简计数器,没有记录访问时间。第二,有没有人做过类似的扩展。经过一番搜索,发现还真有:导出不蒜子的访问量数据。可惜找来找去,只有这一篇。但是又不太符合自己的需求,只好自己重新开发。主要是别人写的看不懂,自己不会维护( ╯□╰ )。

准备

首先要定义好需求。定时导出每篇博文的访问量数据,并绘制成可视图形。根据这个需求,有以下点需要实现。

  1. 利用不蒜子提供的接口,导出一篇博文的访问量数据。
  2. 获取博客网站所有博文的URL。
  3. 定时执行脚本。
  4. 数据可视化:TODO。先按照一定的格式存储到文件中。

使用不蒜子的接口获取数据

根据查询到的资料,和阅读不蒜子的XML文件,访问如下URL可以获取访问量数据。URL最后的数字是一个随机数,可以不用太关心。

1
http://busuanzi.ibruce.info/busuanzi?jsonpCallback=BusuanziCallback_1046609647591

使用Chrome打开任何一个添加了不蒜子计数的网站,进入开发者模式,在Network选项卡下,可以找到下图所示的信息。如果没有,刷新一下网页。可以看出,在Header中,通过referer指定查询的URL。经过实验,每访问一次,site_uvpage_pvsite_pv都会增加1。加上cookie后,site_uv不会增加,page_pvsite_pv还是会增加1。cookie是一个32位的UUID。

通过curl可以验证这个接口。返回的数据是jsonp格式,需要稍微处理一下。

1
2
[root@localhost ~]# curl -H 'referer: http://test.inc' -H 'cookie: busuanziId=967989F380504D9E8F3A5FA7B5F9EFAD' -X GET 'http://busuanzi.ibruce.info/busuanzi?jsonpCallback=BusuanziCallback_1046609647591'
try{BusuanziCallback_1046609647591({"site_uv":1,"page_pv":1,"version":2.4,"site_pv":1});}catch(e){}

获取博客网站所有博文的URL

开启sitemap可以达到这个目的,sitemap.xml存储了本网站的所有URL。如果是使用的HEXO,在hexo根目录下执行下面两条命令,开启sitemap功能。

1
2
npm install hexo-generator-sitemap --save
npm install hexo-generator-baidu-sitemap --save

参考:hexo博客站点sitemap的使用

定时执行

可以在自己的电脑上,或服务器上加个定时任务。但这里决定白嫖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 secretName可以随意填,后面会用到。Value填文件id_rsa的内容。

公钥设置到Deploy keys。同样进入仓库的设置界面,左边选择Deploy keys,然后点击右上角的Add deply keyTitle随意填,Key填写文件id_rsa.pub的内容。由于是要提交数据,需要勾选下方的Allow write access

下方是actions设置key的代码。SECRETS_KEYActions secrets的名字,根据实际设置的名字修改即可。

1
2
3
4
5
6
7
8
- name: Setup Deploy Private Key
env:
SECRETS_KEY: ${{ secrets.SECRETS_KEY }}
run: |
mkdir -p ~/.ssh/
echo "$SECRETS_KEY" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts

数据可视化

TODO,待填坑。