如何查看博客园积分排名趋势图工具的使用方法?
摘要:一个使用 curl+sed+grep+shell+定时任务+git+gnuplot 生成博客积分排名趋势图的小工具
问题的提出
在博客园写文章有一段时间了,除了自己有一些新的发现想与别人分享外,推动我写文章的最大动力就是看博客园排名不断增长啦!然而在博客园后台,只能看到当天的积分与排名,历史值和趋势却没有办法查询,对于文章发表后对自己积分与排名的影响并不直观,于是就想到自己动手做一个积分与排名趋势图这样一个工具。
具体步骤
1. 打开博客园积分与排名显示
这个就不消多说了,在博客园后台,选项->控件显示设置中,将积分与排名勾选并保存。
刷新页面后,可以在侧边栏看到自己博客的积分与排名:
2. 使用 curl 在本地获取当天信息
为了获取当天的积分与排名,需要使用 curl 下载页面。
curl -s 'https://www.cnblogs.com/goodcitizen/ajax/sidecolumn.aspx'
为什么是这个页面,而不是主页,我也不清楚,我是从附录 1 得到的启发。输出比较多,只看我们关心的部分
可以看到积分是在名为 liScore 的 html 元素中,排名是在 liRank,没有找到解析 html 的趁手命令,直接使用 grep + sed 搞起
curl -s 'https://www.cnblogs.com/goodcitizen/ajax/sidecolumn.aspx' | grep 'liScore' -A 6 | sed -n -e 3p -e 7p
这句话后半段翻译一下就是,取看到 liScore 关键字所在行(含)的后面 6 行,积分与排名的值分别位于第 3 行、第 7 行,使用 sed 过滤这两行,就成这样了
4709
113450
完整的脚本如下
score.sh
1 #! /bin/sh
2 git pull origin master
3 day=$(date +"%Y-%m-%d")
4 last=$(cat ./score.txt | tail -1 | awk '{ print $1 }')
5 if [[ "$day" < "$last" ]] || [[ "$day" = "$last" ]]; then
6 echo "has updated, skip"
7 exit 0
8 fi
9
10 data=$(curl -s 'https://www.cnblogs.com/goodcitizen/ajax/sidecolumn.aspx' | grep 'liScore' -A 6 | sed -n -e 3p -e 7p)
11 score=$(echo $data | sed -n 1p)
12 rank=$(echo $data | sed -n 2p)
13 echo "$day $score $rank" >> score.txt
14 git add score.txt
15 git commit -m "udpate score"
16 git push origin master
增加的部分主要是
添加日期列作为横轴 (line 3,13)
将当天信息作为一行追加到 score.txt 文件 (line 11-13)
添加当天信息前判断是否已经记录过,如果是则跳过,防止重复添加 (line 4-8)
将修改后的 score.txt 文件上传到 github (line 14-16)
3. 使用定时任务记录每天的信息
经过长时间的暗中观察,我发现博客园的积分与排名是每天更新一次。于是我们可以增加一个定时任务,每天中午跑一下,来获取当天的信息。不同的系统,方法不一,下面分别说明
3.1 计划任务 (Windows)
什么,你这个不是 shell 脚本吗,怎么还能在 Windows 上跑?嘿嘿,不错。上面的例子我就是运行在 Windows 上的,因为我装了一个 git bash,它自带 msys2 环境,类似于 mingw,也是一种在 Windows 上运行的 Linux 微环境,一些常用的 Linux 命令都支持的,例如上面说到的 grep、sed、git,并且可以直接跑 shell 脚本。
