小玩具-博客园积分排名变动监控工具

一个简单的在线服务监控和提醒工具

1   概述

前段时间自己准备重新开启自己的博客园,然后还和一些圈子里面的朋友夸下海口,自己要开始像打游戏那样,进行博客园的 天梯 攀升。持续的发一些优质的文章或者随笔,然后不断地提升自己博客园的积分和排名,看自己最终将稳定在多少。

这样就造成了自己有了一个 强迫症 :

经常有事没事就去刷自己的博客,看排名变化了没(确实有点小神经质了)。然后自己也有一些关注的人,也关心着他们的排名,所以也在看自己的同时也刷着别人的页面,确实挺无聊的。

这样浪费了自己不少时间和精力,所以决定写个脚本来帮自己来做这个事情吧。

主要实现如下功能:

  • 根据指定的博客ID获取其积分和排名
  • 监测积分和排名数值的变化
  • 如果有变化会发邮件通知
  • 程序能够一直运行

2   引申场景

本文为了让文章 接地气 ,所以就使用了如上的场景。

其实本文本质上所阐述的内容本质上是一个简单的 在线服务监控和提醒工具 ,可以广泛的应用于对那些需要 7×24h 持续稳定运行的服务进行监控。只要是状态值发生了变化,就立刻进行邮件或者短信通知。在智能手机如此普遍的今天,这些消息都可以及时的推送到手机上面,能够让开发人员尽快发现服务故障并进行排查,减少IT生产损失。

3   原理分析

在博客园里面,每个用户都会有一个ID,比如我的博客的ID是 beer,然后用户的主页的格式一般www域名后面带上ID路径,比如我的主页就是:

http://www.cnblogs.com/beer/

博客园为每个用户提供了积分和排名的插件,而且一般情况下,用户都会在自己的博客主页上面加上此插件。毕竟,很多人在辛苦整理了学习笔记之后,也会关注一下自己的影响力的。如果用户在自己的博客首页加上了此插件,那么就可以在个人博客首页看到如前面所示的 积分和排名 了。

本文研究的对象就是:加入了 积分和排名 的个人博客园首页。毕竟还没有找到博客园官方提供的获取此数据的API接口。

一般查看http页面的接口,就通过web调试利器 chrome :

可以看出,在浏览器里面输入博客域名地址之后,浏览器最终呈现的内容并不是一次性的载入的。然后对主要的通讯接口进行内容查看:

发现和 积分与排名 数据相关的接口为:

http://www.cnblogs.com/beer/mvc/blog/sidecolumn.aspx?blogApp=beer

所有的侧边栏内容是通过一个独立的api来实现的。显然这个api的格式也是有一定的模板的,也是一个和博客的ID相关的URL,有两个地方是由ID动态生成的(中间一个,最后一个)。这个特性有用于我们最后将工具做成一个通用的工具,只要输入相应的博客园ID,就可以知道其api了,从而获取其积分和排名了。

4   实现方式

通过以上的分析,可以知道,要达到如上所提到的 目的 ,主要的技术手段如下:

  1. 找到用户的博客ID
  2. 通过http请求获取 积分和排名 页面的内容
  3. 解析页面获取 积分和排名 的数值
  4. 比较本次数值和上次数值的区别,如果有区别则发起通知
  5. 做一个以 博客ID 为参数的定时请求的线程
  6. 做一个无限循环的主线程,可以启用不同的 博客ID 的线程

主要功能实现如下:

主要用的标准库:

  • 解析HTML

    BeautifulSoup

  • 发起HTTP请求

    requests

  • 运行日志记录

    logging

自己写的一些包装的库:

  • MailMsg

    发送邮件的对象(封装的smtplib邮件库)

  • dtlog

    对logging进行的封装的指定格式的日志输出(纯粹是方便调试)

由于这两个方法具有很强的独立性,此处就不再写具体实现,用户可以自己用 print 替代 dtlog 的功能,使用 smtplib 实现MailMsg即可以运行如下程序。

# coding=utf-8
"""获取博客的排名并自动邮件通知
"""
from bs4 import BeautifulSoup
from time import sleep
import requests
import logging
import threadfrom dtlib.notice import MailMsg
from dtlib.dtlog import dlog__author__ = 'Harmo'def get_nums(blogs_des):"""get page ranks from string:param blogs_des::return:"""split_str = blogs_des.split('-')[1].strip()return split_strclass BlogRankMonitor(object):"""博客园积分排名监控工具"""def __init__(self, id):self.gap_seconds = 60 * 30  # 间隔时间为30minself.url_fmt = 'http://www.cnblogs.com/%s/mvc/blog/sidecolumn.aspx?blogApp=%s'self.id = idself.score = 0self.rank = 0self.his_score = 0self.his_rank = 0def get_blog_ranks(self):"""解析页面获取博客积分和排名:return:"""url = self.url_fmt % (self.id, self.id)res = requests.get(url)soup = BeautifulSoup(res.text)lis = soup.findAll('div')for item in lis:if 'sidebar_scorerank' == item.get('id'):li_lists = item.findAll('li')for li_item in li_lists:if u'积分' in li_item.text:self.score = get_nums(li_item.text)elif u'排名' in li_item.text:self.rank = get_nums(li_item.text)else:print 'Error'continuedef monitor_score_rank(self):"""监控博客积分及排名的变化:return:"""while True:self.get_blog_ranks()if self.score != self.his_score or self.rank != self.his_rank:# region 发送邮件mail_title = '[e-notice]:blog-rank-changes'mail_body = "[%s]time-(score,rank):old-(%s,%s),now-(%s,%s)" \% (self.id,self.his_score, self.his_rank,self.score, self.rank)mail_obj = MailMsg()mail_obj.set_title(mail_title)mail_obj.set_body(mail_body)mail_obj.send()dlog.debug('send mail message:%s' % self.id)# endregionself.his_score = self.scoreself.his_rank = self.ranksleep(self.gap_seconds)def start_score_rank_thread(self):"""开启监控的线程:return:"""thread.start_new_thread(self.monitor_score_rank, ())if __name__ == '__main__':logging.getLogger("urllib3.connectionpool").setLevel(logging.WARNING)id_list = ['zhangfei','beer']for id in id_list:blog = BlogRankMonitor(id)blog.start_score_rank_thread()#让主线程一直运行while 1:sleep(3600)

 

5   发布与部署

此脚本文件名称为 blogs_rank_demo.py ,在服务器上执行如下命令:

nohup python blogs_rank_demo.py &

即可在后台一直运行,如果怕机器重启后此进程结束掉,则可以在 /etc/rc.local 里面设置启动项。

当然,如果熟悉一些进程管理工具的同学,则可以使用更高级的工具,例如 supervisor 进行进程管理,这样会使得此服务的运行更稳定,更可控一些,这些都是后话了,此处略去不表了。

如下实现了周期性轮询状态变化,如果有变化则发送邮件,但是邮件不像即时消息那样立刻通知相应的人,如何能够做到发邮件后就能立刻收到提醒呢?由于目前已经是移动互联网应用如此普及的年代了,有如下两种方法可以参考:

  • 下载手机QQ邮件客户端,可以进行即时邮件提醒。
  • 使用QQ邮箱和微信绑定,关注邮件微信号,可以进行即时邮件提醒。

6   效果演示

最后让此程序运行了一段时间,对自己的博客和某个朋友的博客进行了监控。发现博客园的排名变化好久才进行更新,而且经常会是夜间或者是早上进行更新,下面是某天早上8点多的时候,收到的排名变化的提醒(由微信推送的邮件到达的提醒):

7   总结与展望

其实上面介绍的就是一个最简单的自动化监控和提醒工具的实现方式。这些思想和技术手段被广泛的应用于服务器接口监控,数据库连接监控,服务器运行状态监控等等。进行博客排名的监控只是一个好玩的小应用而已。

OK,介绍完毕,如果大家觉得有意思,或者有帮助,请点击博客下面的 推荐 ,谢谢了。


作者: Harmo哈莫
作者介绍: https://zhengwh.github.io
技术博客: http://www.cnblogs.com/beer
Email: dreamzsm@gmail.com
QQ: 1295351490
时间: 2015-10
版权声明: 欢迎以学习交流为目的读者随意转载,但是请 【注明出处】
支持本文: 如果文章对您有启发,可以点击博客右下角的按钮进行 【推荐】

接口应用小玩具-博客园积分排名变动监控工具相关推荐

  1. 痞子衡嵌入式:我的博客园积分排名终于挤进了前3000名榜单

    继今年2月解锁了写技术博客第一个目标 <我的博文总量终于追平了中文Kinetis博客第一人jicheng0622> 之后,时隔两个月,痞子衡又达成了第二个小目标,博客首次进入博客园榜单(该 ...

  2. [其它] - 博客园积分算法探讨

    来源:http://www.cnblogs.com/weidagang2046/archive/2009/07/31/1535902.html 今天在dudu的<博客园FAQ>上看到了博客 ...

  3. 博客园积分与排名升级攻略 //转

    博客园积分算法探讨 今天在dudu的 <博客园FAQ>上看到了博客积分算法规则.因为同样是搞互联网的,平时工作也涉及到用户积分算法的设计,所以特把此问题拿出来分析探讨.初衷只是纯学术的研究 ...

  4. 【Vegas2010】cnblogs(博客园)排名原来是这样算的~

    在博客园呆了有快4年多了,几乎是每月都有很多文章往上写,但不知怎的,最近博客排名,再也不像以前那样明显的提升了. 查了半天,才发现博客园的排名积分规则是这么定的: 博客排行榜排名分值是如何计算的? 博 ...

  5. PageRank 计算博客园用户排名

    PageRank 通过网页与网页之间的链接关系计算各网页权重,一般权重高的网页特点是:链接向它的网页数量多.链向它的网页其权重也较高.PageRank 就是通过这样的连接关系,一轮轮迭代计算后得出各网 ...

  6. NodeJS入门04-Express路由和中间件 - 小之 - 博客园

    nodeJS入门04-Express路由和中间件 Express框架是后台的Node框架,在后台的受欢迎的程度,和jQuery一样,就是企业的事实上的标准. 路由 路由是指如何定义应用的端点(URIs ...

  7. mysql 内联函数_内联函数 - freeboy小亮 - 博客园

    (1)什么是内联函数? 内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内. (2)为什么要引入内联函数? 当然,引入内联函数的主要目的是:解决程序中函数调用的效率问题.另外,前面我们 ...

  8. mysql 类图_类图 - 吴小凯 - 博客园

    类图(Class Diagram): 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 类一般由三部分组成: 类名(Class):每个类都必须 ...

  9. 一个简单的小项目博客园(2)登录、注册页面

    目录: 注册功能(使用forms组件) 登录功能(使用验证码) 注册功能(使用forms组件) 解耦合在app01中创建myforms.py from django import forms from ...

最新文章

  1. python类的成员函数_python特殊成员函数
  2. 2006上半年程序员级试题答案
  3. 面向对象,面向服务(转)
  4. 越不服务器显示异常什么原因,计算机异常问题都有哪些常见类型
  5. oracle 11gR2 RAC root.sh 错误 ORA-15072 ORA-15018
  6. C什么k什么_K线图基础知识丨什么是K线散兵坑形态?K线散兵坑形态的操作与案例详解...
  7. Git之同一台电脑连接多个远程仓库
  8. Oracle expdp 导出
  9. java 给字典类型赋值_java使用forEach填充字典值
  10. nginx安装和配置实例
  11. python中隔行输出_在Python中的分隔行上打印列表元素
  12. C++的冒泡排序法的原理是什么?
  13. kubernetes视频教程笔记 (21)-存储-configmap
  14. 第三章:SQL Server2019数据库 之 开启 SQL 语言之旅
  15. 传输rp文件到ftp服务器并通过浏览器访问html
  16. 大数据入门教程系列之Hbase安装(伪分布式)
  17. 中国联通沃商店校园大使招募书
  18. Android Room框架使用
  19. python游戏csgo开挂_V社:用深度学习检测CSGO中的开挂行为
  20. 原创-VBA金税盘开票XML生成

热门文章

  1. java 有多少api_Java常用API(二)
  2. matlab内将数组内所有数累乘,数学实验上机汇总【未完成】
  3. 用户表如何区分普通用户和管理员_普通用户如何辨别铝合金型材的好坏?
  4. 激光IMU融合——LIO-Mapping / LIOM / LINS / LIO-SAM算法解析
  5. 【CV秋季划】图像质量提升与编辑有哪些研究和应用,如何循序渐进地学习好?...
  6. c++多字节与宽字节字符串转换(windows平台)
  7. 以色列农业奇迹-丰收节贸易会:谋定符合国情制度和方式
  8. maven打war包
  9. linux面试题-基础题1
  10. js,jquery获取页面元素距离浏览器工作区顶端的距离