前言

众所周知,明日方舟的官方美术设定集有那么一点水,于是在收到了众多博士的反馈和建议后,鹰角做了个业界史无前例的决定:将对设定集进行优化,并免费寄给购买了设定集的博士!鹰角yyds!!!

各位博士到时需要在这个网站上填写相关信息《明日方舟官方美术设定集VOL.1》RESET版 (hypergryph.com)

但是因为疫情原因,网站暂时无法立刻开启登记通道,后续通道开启具体时间将由微博【明日方舟朝陇山】发布

但咱平时也不玩微博,可能没法第一时间得到相关信息,别到时候开启了登记通道都不知道,为了避免这样的情况发生,我打算写个脚本监测一下官网,有消息第一时间通知我,借此还能学一学python如何发送邮件

python发送邮件

发送邮件需要用到SMTP协议

需要用到的模块为smtplibemail,Python自带

email模块负责构造邮件,smtplib模块负责发送邮件

想要发送邮箱,就需要一个SMTP服务器,这里以QQ邮箱为例

在设置中开启IMAP/SMTP服务,可以获得授权码,使用这个授权码即可登录QQ邮箱的SMTP服务器

image-20220501153524645

再来看一下smtplib模块

# 发信服务器
smtp_server = 'smtp.qq.com'
server = smtplib.SMTP_SSL()

指定SMTP服务器,同时有SSL认证,不用SSL的话是smtplib.SMTP(),但是不安全,现在都是smtplib.SMTP_SSL()

还有就是在python 3.7及后面版本这样写会报错server_hostname cannot be an empty string or start with a leading dot,这是因为python 3.7 修改了 ssl.py ,导致了smtplib.SMTP_SSL 的问题,修改为如下即可

# 发信服务器
smtp_server = 'smtp.qq.com'
server = smtplib.SMTP_SSL(smtp_server)

指定了SMTP服务器后进行连接登录

# 发信方的信息:发信邮箱,QQ邮箱授权码
from_addr = 'xxx@qq.com'
password = '授权码'

# SMTP_SSL默认端口为465,SMTP默认端口为25
server.connect(smtp_server,465)
server.login(from_addr, password)

最后发送邮件并关闭服务器

# 发送邮件
server.sendmail(from_addr, to_addr, message.as_string())
# 关闭服务器
server.quit()

现在来构造邮件内容

from email.mime.text import MIMEText
from email.header import Header
# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
message = MIMEText('hello,world', 'plain', 'utf-8')
# 发件人
message['From'] = Header('xiaolong22333')
# 收件人
message['To'] = Header('xiaolong')
# 标题
message['Subject'] = Header('Python 邮件发送测试')

测试一下

# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 发信方的信息:发信邮箱,QQ邮箱授权码
from_addr = 'xxx@qq.com'
password = '授权码'
# 发信服务器
smtp_server = 'smtp.qq.com'

# 收信方邮箱
to_addr = 'xxx@qq.com'

server = smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server,465)
server.login(from_addr, password)

# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
message = MIMEText('hello,world', 'plain', 'utf-8')
# 发件人
message['From'] = Header('xiaolong22333')
# 收件人
message['To'] = Header('xiaolong')
# 标题
message['Subject'] = Header('Python 邮件发送测试')

# 发送邮件
server.sendmail(from_addr, to_addr, message.as_string())
# 关闭服务器
server.quit()

image-20220501174513460

so easy~

编写脚本

我的想法是根据返回包的长度来判断官网有没有更新,长度变了就发邮件

# -*- coding: utf-8 -*-
'''
@File: Arknights.py
@Time: 2022/05/01 17:01:47
@Author: xiaolong
@Version: 1.0
@Link: https://xiaolong22333.top
'''

import smtplib
import requests
from email.mime.text import MIMEText
from email.header import Header


def senfMail():
    # 发信方的信息:发信邮箱,QQ邮箱授权码
    from_addr = 'xxx@qq.com'
    password = '授权码'
    # 发信服务器
    smtp_server = 'smtp.qq.com'

    # 收信方邮箱
    to_addr = 'xxx@qq.com'

    server = smtplib.SMTP_SSL(smtp_server)
    server.connect(smtp_server,465)
    server.login(from_addr, password)

    # 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
    message = MIMEText('博士,网站更新了,快去看看吧~\nhttps://ak.hypergryph.com/artworks_vol1', 'plain', 'utf-8')
    # 发件人
    message['From'] = Header('xiaolong22333')
    # 收件人
    message['To'] = Header('xiaolong')
    # 标题
    message['Subject'] = Header('博士,有最新消息,请注意查收')

    # 发送邮件
    server.sendmail(from_addr, to_addr, message.as_string())
    # 关闭服务器
    server.quit()

def isComingSoon():
    url1 = 'https://ak.hypergryph.com/artworks_vol1'
    url2 = 'https://web.hycdn.cn/arknights/artworks_vol1/index.d89673.js'
    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0",
        "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"
    }
    result1 = requests.get(url=url1,headers=headers)
    result2 = requests.get(url=url2,headers=headers)
    if (len(result1.content) != 1203) or (len(result2.content) != 247343):
        senfMail()

if __name__ == '__main__':
    isComingSoon()

应该没什么问题

定时

上传到服务器,每天早上8点半和晚上8点半执行

30 8 * * * /usr/bin/python3 /root/Arknigths/Arknights.py
30 20 * * * /usr/bin/python3 /root/Arknigths/Arknights.py
最后修改:2023 年 12 月 15 日
如果觉得我的文章对你有用,请随意赞赏