前言:故事是这样的,该学校要求听8次校级和院级讲座,但是大家现在热情很高,讲座供不应求,跟春节抢火车票有一拼,看到一个师兄弄了一个代码自动通知微信群,于是也想玩一玩,正好之前才学习完发邮件的,我就用邮件通知了。
1.技术路线
- 登录高等讲堂网页版
- 得到讲座信息
- 判断有无余位
- 若有余位则发送邮件
- 循环执行上述操作
2.查询是否有讲座有余位
def findlecture(level,page):
url = "http://yjsqd.tongji.edu.cn/Pc/getActivityList.json"
header = {
"Host": "yjsqd.tongji.edu.cn",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36",
"Cookie": "cookie"
}
postdata = {
"page": str(page), "seltype": "", "level": str(level)
}
if level==1:
l="校级"
else:
l="院级"
response = requests.post(url, data=postdata, headers=header)
result = response.json()
data = result["data"]["data"]
status = "busy"
for dict in data:
level = dict["level"]
activity_name = dict["activity_name"]
activity_place = dict["activity_place"]
activity_start_time = dict["activity_start_time"]
activity_end_time = dict["activity_end_time"]
activity_status = dict["activity_status"]
datas = (level, activity_name, activity_place, activity_start_time, activity_end_time, activity_status)
if activity_status == "2":
makemessage(datas)
status = "free"
if status == "busy":
print("暂时无%s空余讲座"%l)
经过观察level参数是校级(1)和院级(2)的区分,page参数是页数,且活动有余位时,activity_status为2
3.如何发送邮件
若判断有余位后,则调用makemessage函数
def makemessage(datas):
if datas[0]=="1":
level="校级"
else:
level="院级"
message="等级:%s\n讲座名字:%s\n讲座地点:%s\n开始时间为:%s\n结束时间为:%s"%(level,datas[1],datas[2],datas[3],datas[4])
sendmessage(message)
sendmessage函数具体讲解可以参见前面的博文用python群发邮件(可带附件)
4.如何循环执行上述操作
这里需要用到python里的定时器,通俗的讲就是可以让程序定时循环执行
这部分可以参加前面的博文python如何让程序定时循环执行
5.代码示例
# -*- coding: utf-8 -*-
import requests
import json
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from threading import Timer
import time
def sendmessage(message):
# 发件人邮箱
sender = "[email protected]"
#服务器授权码
password = "sssssssss"
# 服务器地址,这里是QQsmtp服务器
mail_host = 'smtp.qq.com'
# 收件人地址,可填写多个
receivers = ['[email protected]']
# 设置email信息
msg = MIMEMultipart()
# 邮件主题
msg["Subject"] = 'test'
msg["From"] = sender
# 邮件正文
msg_content = message
msg.attach(MIMEText(msg_content, 'plain', 'utf-8'))
# 登录并发送邮件
try:
# QQsmtp服务器的端口号为465或者587
s = smtplib.SMTP_SSL('smtp.qq.com', 465)
s.set_debuglevel(1)
s.login(sender, password)
# 给receivers列表中的地址逐个发邮件
for item in receivers:
msg['To'] = to = item
s.sendmail(sender, to, msg.as_string())
print("send to %s has succeed" % item)
s.quit()
print('send to all succeed')
except smtplib.SMTPException as e:
time.sleep(10)
print("failed for %s" % e)
def makemessage(datas):
if datas[0]=="1":
level="校级"
else:
level="院级"
message="等级:%s\n讲座名字:%s\n讲座地点:%s\n开始时间为:%s\n结束时间为:%s"%(level,datas[1],datas[2],datas[3],datas[4])
sendmessage(message)
def findlecture(level,page):
url = "http://yjsqd.tongji.edu.cn/Pc/getActivityList.json"
header = {
"Host": "yjsqd.tongji.edu.cn",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36",
"Cookie": "cookie"
}
postdata = {
"page": str(page), "seltype": "", "level": str(level)
}
if level==1:
l="校级"
else:
l="院级"
response = requests.post(url, data=postdata, headers=header)
result = response.json()
data = result["data"]["data"]
status = "busy"
for dict in data:
level = dict["level"]
activity_name = dict["activity_name"]
activity_place = dict["activity_place"]
activity_start_time = dict["activity_start_time"]
activity_end_time = dict["activity_end_time"]
activity_status = dict["activity_status"]
datas = (level, activity_name, activity_place, activity_start_time, activity_end_time, activity_status)
if activity_status == "2":
makemessage(datas)
status = "free"
if status == "busy":
print("暂时无%s空余讲座"%l)
def delayrun():
list = [1, 2]
for level in list:
for page in range(1,4):
findlecture(level, page)
class RepeatingTimer(Timer):
def run(self):
while not self.finished.is_set():
self.function(*self.args, **self.kwargs)
self.finished.wait(self.interval)
t = RepeatingTimer(15,delayrun)
t.start()