共计 4289 个字符,预计需要花费 11 分钟才能阅读完成。
今天来给大家分享 4 个python 脚本,分别是定时抓取 Solidot,IT 之家,Linux 中国和抽屉·挨踢 1024 这四个媒体的 rss 链接然后定时发送汇总邮件。
注意事项:
- 部署采用腾讯云函数,部署方式具体参考本站 这篇文章
- 在采用腾讯云函数部署设置定时触发器时,solidot 建议设置在 22 点左右,因为它一般晚上九点多久不更新了;IT 之家建议设置在 23:59 因为之家基本全天 24 小时都在更新,这样设置的话即使早睡也可以在第二天早上起来查看邮件;Linux 中国也可以设置在 22 点左右,因为他一般下午三四点更新三五篇文章;抽屉·挨踢 1024 同理,我一般习惯晚上看
- 下面 Linux 中国的脚本在参考上面的部署文章进行
pip install
时要多加一个user-agent
库 - 抽屉 1024 的代码在腾讯云函数部署的时候一定要把位置选择为海外的地方,比如硅谷,因为采用了 rsshub 的 rss 链接,而 rsshub 貌似已经需要富强,所以你懂的
solidot
其实本站的 这篇 实战腾讯云函数的文章就是实战的 solidot,只不过那里面的代码缺少一个检测是否是当天发出的文章的功能,由于改动较大就再把新的代码贴到下面一次,否则我就让大家直接去复制粘贴那篇文章中的代码了。
#!/usr/bin/env python3
# coding=utf-8
import re
import time
import smtplib
import requests
import datetime
from bs4 import BeautifulSoup
from email.mime.text import MIMEText
HOST = 'smtp.126.com'
PORT = 25
SENDER = '@126.com'
RECEIVER = '@qq.com'
PWD = ''current_time = time.strftime("%Y-%m-%d", time.localtime())
def english_time_to_num(time_str):
result = re.search(r'(\d+ \w+ \d+)', time_str).group(1)
time_format = datetime.datetime.strptime(result, '%d %b %Y')
time_format = time_format.strftime('%Y-%m-%d')
return time_format
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:
print(str(e))
exit(1)
def get_soup():
url = 'https://www.solidot.org/index.rss'
rss_xml = requests.get(url).text
soup = BeautifulSoup(rss_xml, 'xml')
return soup
def get_mail_body():
contents = get_soup().select('item')
contents_list = []
for c in contents:
pub_date = c.select_one('pubDate').get_text()
pub_date_to_num = english_time_to_num(pub_date)
if pub_date_to_num == current_time:
title = c.select_one('title').get_text()
link = c.select_one('link').get_text()
contents_list.append(title + '\n' + link)
return '\n'.join(contents_list)
def main(arg1, arg2):
mail_send(subject=current_time + 'Solidot 今日文章',
mail_body=get_mail_body())
print('成功发送了一封邮件!')
IT 之家
把上面的 solidot 的代码中的 url 和发邮件的主题字符串替换一下就好了,因为这两家的 rss 都是同样的 atom 协议,所以代码可以复用
具体如下:
把下面的 url 替换为 https://www.ithome.com/rss/
def get_soup():
url = 'https://www.solidot.org/index.rss'
把下面的邮件标题替换 ’ IT 之家今日文章 ’
def main(arg1, arg2):
mail_send(subject=current_time + 'Solidot 今日文章',
mail_body=get_mail_body())
print('成功发送了一封邮件!')
抽屉·挨踢 1024
和上面的 IT 之家一样,把上面的 solidot 的代码中的 url 和发邮件的主题字符串替换一下就好了,因为这两家的 rss 都是同样的 atom 协议,所以代码可以复用
具体如下:
把下面的 url 替换为 https://rsshub.app/chouti/tec
def get_soup():
url = 'https://www.solidot.org/index.rss'
把下面的邮件标题替换 ’ 抽屉挨踢 1024 今日文章 ’
def main(arg1, arg2):
mail_send(subject=current_time + 'Solidot 今日文章',
mail_body=get_mail_body())
print('成功发送了一封邮件!')
Linux 中国
因为 Linux 中国的要设置 http header 修改的地方比较多,我就不说怎么修改代码,而是直接把完整的代码贴在下面了
#!/usr/bin/env python3
# coding=utf-8
import re
import time
import smtplib
import requests
import datetime
from bs4 import BeautifulSoup
from email.mime.text import MIMEText
from user_agent import generate_user_agent
HOST = 'smtp.126.com'
PORT = 25
SENDER = '@126.com'
RECEIVER = '@qq.com'
PWD = ''HEADERS = {'accept':"text/html,application/xhtml+xml,application/xml"";q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'upgrade-insecure-requests': '1',
'accept-encoding': 'gzip, deflate, br',
'user-agent': generate_user_agent(os='win')}
current_time = time.strftime("%Y-%m-%d", time.localtime())
def english_time_to_num(time_str):
result = re.search(r'(\d+ \w+ \d+)', time_str).group(1)
time_format = datetime.datetime.strptime(result, '%d %b %Y')
time_format = time_format.strftime('%Y-%m-%d')
return time_format
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:
print(str(e))
exit(1)
def get_soup():
url = 'https://linux.cn/rss.xml'
rss_xml = requests.get(url, headers=HEADERS).text
soup = BeautifulSoup(rss_xml, 'xml')
return soup
def get_mail_body():
contents = get_soup().select('item')
contents_list = []
for c in contents:
pub_date = c.select_one('pubDate').get_text()
pub_date_to_num = english_time_to_num(pub_date)
if pub_date_to_num == current_time:
title = c.select_one('title').get_text()
link = c.select_one('link').get_text()
contents_list.append(title + '\n' + link)
return '\n'.join(contents_list)
def main(arg1, arg2):
mail_send(subject=current_time + 'Linux 中国今日文章',
mail_body=get_mail_body())
print('成功发送了一封邮件!')
下面是 Linux 中国的脚本在调试过程中的截图:
最后强调一下这些代码如何部署,一定要参考本站的 这篇文章。
正文完