共计 3301 个字符,预计需要花费 9 分钟才能阅读完成。
背景
混 V 站好几年了,从上图可以看到我是 14 年入的国军 (大雾 ->V 站), 经常在发完一个主题后迫不及待的想知道有没有人评论我,于是就一个劲儿的刷新 v 站,不得不说这样子实在浪费时间,而且感觉有点傻。
然后我就想到了一些 v 站的第三方客户端是否有通知功能,去 Google play 搜索了一下最终找到了一个叫 V2ex+ 的客户端有通知功能,其实还有一种方法就是装一个叫 feedly 的安卓 app,由于 v 站提供了评论的 atom 协议的 feed 流,添加一个订阅并设置一个小时刷新一下就行了,
以上两种方法呢都需要有个 app 在后台常驻才行,我不希望这样子,所以写了下面的 python 脚本来解决,这样可以只需要后台常驻一个邮箱 app,所有的通知集中在一个地方推送,既节省后台资源省电,又不至于装太多 app。
开发环境
- Mac OSX 10.13.6
- Python 3.6.4
脚本
#!/usr/bin/env python3
# coding=utf-8
import os
import time
import logging
import smtplib
import requests
from bs4 import BeautifulSoup
from email.mime.text import MIMEText
from apscheduler.schedulers.blocking import BlockingScheduler
HOST = 'smtp.qq.com' #smtp 服务的供应商
PORT = 587 # smtp 服务供应商指定的端口
SENDER='' # smtp 服务的发件人,这里我用的是 qq 邮箱
RECEIVER='' # 任意用来接收邮件的邮箱地址
PWD='' # 提供 smtp 服务的邮箱的授权码,注意不是邮箱密码
INTERVAL=300 # 脚本每隔多少秒请求一下 v 站评论 feed,检查是否有新评论
COMMENTS_FEED='' # V 站评论 feed 的 url,点未读提醒可以看到
def dir_check():
if not os.path.isdir('tmp'):
os.mkdir('tmp')
def logger_getter():
logger = logging.getLogger()
if not len(logger.handlers):
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(filename)s - %(asctime)s - %(levelname)s -%(message)s",
datefmt='%Y-%m-%d %H:%M:%S')
dir_check()
file_handler = logging.FileHandler('tmp/record.log')
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
return logger
def data_persistence(data):
dir_check()
with open('tmp/v2ex_timestamp','w') as f:
f.write(data)
logger_getter().debug("Persist the first comment's time stamp into file.")
def mail_send(subject, mail_body):
try:
msg = MIMEText(mail_body, 'plain', 'utf-8')
msg['Subject'] = subject
msg['From'] = SENDER
msg['To'] = RECEIVER
s = smtplib.SMTP(HOST, PORT)
s.debuglevel = 0
s.login(SENDER, PWD)
s.sendmail(SENDER, RECEIVER, msg.as_string())
s.quit()
except smtplib.SMTPException as e:
logger_getter().error(str(e))
exit(1)
def get_soup():
comment_feed_content=requests.get(COMMENTS_FEED).text
soup=BeautifulSoup(comment_feed_content,'html5lib')
return soup
def parser_and_processor():
soup = get_soup()
first_entry = soup.select_one('entry')
title = first_entry.select_one('title').get_text()
published_date=first_entry.select_one('published').get_text()
content=first_entry.select_one('content').get_text()
if not os.path.isfile('tmp/v2ex_timestamp'):
# 此时持久化下来的时间戳所在的评论 entry 可能是一个收藏,但也要持久化一次
data_persistence(published_date)
with open('tmp/v2ex_timestamp') as f:
old_published_date = f.read().strip()
current_time = time.strftime("%m-%d|%H:%M", time.localtime())
if old_published_date != published_date:
# title 为空说明这是一个收藏,暂不发送邮件
if not title:
mail_send(current_time + '您的 V2EX 有了一条新评论哦!', content)
logger_getter().info('您发出了一封邮件哦!')
# 此时要记得更新一下本地的数据
data_persistence(published_date)
else:
logger_getter().debug('您的 V2EX 没有收到新评论哦!')
if __name__ == '__main__':
scheduler = BlockingScheduler()
scheduler.add_job(parser_and_processor, 'interval', seconds=INTERVAL)
scheduler.start()
如何使用
将上述脚本复制粘贴到任意以.py 为后缀的一个文件中,
然后修改脚本的前面几行配置,
HOST = 'smtp.qq.com' #smtp 服务的供应商
PORT = 587 # smtp 服务供应商指定的端口
SENDER='' # smtp 服务的发件人,这里我用的是 qq 邮箱
RECEIVER='' # 任意用来接收邮件的邮箱地址
PWD='' # 提供 smtp 服务的邮箱的授权码,注意不是邮箱密码
INTERVAL=300 # 脚本每隔多少秒请求一下 v 站评论 feed,检查是否有新评论
COMMENTS_FEED='' # V 站评论 feed 的 url,点未读提醒可以看到
再然后在终端模拟器中执行下面的 shell 命令,安装依赖:
$ sudo pip3 install requests==2.22.0
$ sudo pip3 install APScheduler==3.6.3
$ sudo pip3 install html5lib==1.0.1
$ sudo pip3 install beautifulsoup4==4.6.0
然后再执行下面的命令:
$ python3 xxx.py &
最后关掉终端模拟器即可。
正文完