Contents
  1. 1. 需求
  2. 2. 实现
  3. 3. Supervisord
  4. 4. 参考资料

需求

想要监控某个论坛是否有更新帖。如果有帖子更新并且标题符合某种条件就发送邮件通知

实现

用python来实现比较简单,不到100行代码。用requests进行http请求,BeautifulSoup进行html解析。为了加快请求响应速度,设置useragent为手机的useragent,这样子就可以返回手机页面。

编写一个函数获取第一条帖子的标题。这里的例子为discuz论坛。

def getnewesttitle():
    url = 'http://www.test.net/forum.php?mod=forumdisplay&fid=33&filter=author&orderby=dateline'
    headers = {'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36'}
    r = requests.get(url, headers=headers)
    soup = BeautifulSoup(r.text)
    newest = soup.find('span',class_='by')
    return newest.parent.text

主要逻辑为运行时先获取第一条帖子的标题,并保存。然后不断循环获取第一条帖子的标题,如果跟之前保存的不一样,就认为有帖子更新。

newesttitle = getnewesttitle()
while True:
    try:
        thenexttitle = getnewesttitle()
        print('monitoring')
        print newesttitle.encode('utf-8')
        print thenexttitle.encode('utf-8')
        if thenexttitle != newesttitle:
            newesttitle = thenexttitle
            send_mail(smtp_user, smtp_pass, thenexttitle.strip(), thenexttitle.strip())
        else:
            pass
    except RuntimeError:
        print(RuntimeError)
    time.sleep(1)

发送邮件采用QQ邮箱,用sender模块。

def send_mail(smtp_user, smtp_pass, subject='test', body='test', sendto=sendto, smtp_server='smtp.qq.com',
              smtp_port=465):
    mail = Mail(smtp_server, port=smtp_port, username=smtp_user, password=smtp_pass, use_tls=False, use_ssl=True,
                debug_level=None)
    mail.send_message(subject, fromaddr=smtp_user, to=sendto, body=body)

Supervisord

使用Supervisord做进程管理,如果程序挂掉,可以自动重启。

supervisord配置为:

[program:gettahua]
command=python get.py
;numprocs=1                 ; 默认为1
;process_name=%(program_name)s   ; 默认为 %(program_name)s,即 [program:x] 中的 x
directory=/root/ ; 执行 command 之前,先切换到工作目录
user=root            ; 使用 oxygen 用户来启动该进程
; 程序崩溃时自动重启,重启次数是有限制的,默认为3次
autorestart=true
startretries=9999999999
redirect_stderr=true        ; 重定向输出的日志
stdout_logfile = /var/log/test.log
loglevel=info

然后就可以安心干活,不用盯着论坛刷帖了~~

参考资料

Python 进程管理工具 Supervisor 使用教程

Contents
  1. 1. 需求
  2. 2. 实现
  3. 3. Supervisord
  4. 4. 参考资料