你想收到Solidot,IT之家,抽屉·挨踢1024和Linux中国的每日文章汇总邮件么

125次阅读
没有评论

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

今天来给大家分享 4 个python 脚本,分别是定时抓取 Solidot,IT 之家,Linux 中国和抽屉·挨踢 1024 这四个媒体的 rss 链接然后定时发送汇总邮件。

注意事项:

  1. 部署采用腾讯云函数,部署方式具体参考本站 这篇文章
  2. 在采用腾讯云函数部署设置定时触发器时,solidot 建议设置在 22 点左右,因为它一般晚上九点多久不更新了;IT 之家建议设置在 23:59 因为之家基本全天 24 小时都在更新,这样设置的话即使早睡也可以在第二天早上起来查看邮件;Linux 中国也可以设置在 22 点左右,因为他一般下午三四点更新三五篇文章;抽屉·挨踢 1024 同理,我一般习惯晚上看
  3. 下面 Linux 中国的脚本在参考上面的部署文章进行 pip install 时要多加一个 user-agent
  4. 抽屉 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 中国的脚本在调试过程中的截图:

你想收到 Solidot,IT 之家, 抽屉·挨踢 1024 和 Linux 中国的每日文章汇总邮件么

最后强调一下这些代码如何部署,一定要参考本站的 这篇文章

 

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