用python检索tj大学高等讲堂并发送邮件通知空位

前言:故事是这样的,该学校要求听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()
发布了62 篇原创文章 · 获赞 118 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/qq_38412868/article/details/100899643