你想收到V2ex新评论的即时邮件通知么

64次阅读
没有评论

共计 3301 个字符,预计需要花费 9 分钟才能阅读完成。

你想收到 V2ex 新评论的即时邮件通知么

背景

混 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 &

最后关掉终端模拟器即可。

正文完
 
sharp097
版权声明:本站原创文章,由 sharp097 2020-03-13发表,共计3301字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)