青年大学习提醒系统
作为班上的团支书,每周提醒班上同学做青年大学习是每周的必做工作,以青年大学习后台网站为例,笔者通过python制作了一个简单的程序用于提醒同学完成学习~
这里展示了一部分运行的截图,还可以用QQ邮箱来提醒大家这里就不展示了,只能说嘎嘎好用!
好了话不多上上代码!!
先引入相关的包
# -*- coding: utf-8 -*- #
# ------------------------------------------------------------------
# Author: Yangxin
# Created: 2022/07/18
import requests
import PySimpleGUI as sg #这里的可视化界面使用的是PySimpleGUI,大家也可以用其他的GUI模块,如Tkinter或者是pyqt5
import numpy as np
import pandas as pd #用的excel表格代替数据库,用pandas查表
import re
import smtplib #用于发送邮件
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
在做此类项目的时候我们需要先查看我们需要登录的网站的源代码,当然静态的网站我们可以直接从源代码中获取相关的信息,但像这种需要登录的网站我们需要通过F12的方法获取网站接收的账号密码的格式,我这里使用的是谷歌浏览器自带的F12进行操作
我们先找到这个请求方式为post的表单
这里我们通过查看载荷发现表单的数据一共是有四个字段的,第一个是网站提供的token,我们暂时是没有的;第二个就是我们的账号了;第三个是我们的密码但是这里与我们的密码不一致并且非常长,初步判断是做了MD5处理;第四个是一个名为verifyCode的字段,它的值为空我们不需要过多的注意它~
我们先来说说这个token,关于token大家可以看一下这位博主的文章:
session、cookie、token 详解
token大部分可以通过访问登录网站的源码来找到,这里我们去源码里面找一下
这里通过搜索也是找到了这个值,值得注意的是一段时间后token的值会发生变化,所以我们每次启动脚本程序的时候都必须爬取一次源代码中token的值
网站登录
url="xxxxx"
session=requests.Session()
p1=re.compile("id='_jfinal_token' value='(.*)'")
response=session.get(url=url)
with open(r".\study.txt", encoding="utf-8") as fp:
num0, num1 ,email,passward,num2= fp.read().split(" ")
# 读取账号、密码、qq邮箱的授权码(主要用于发送邮箱)、邮箱密码、每个用户的唯一ID(这个后面再说)```
url_demo="xxxxxx" #需要post的网址
header={ #post的请求头
xxxxx
}
data="_jfinal_token="+p1.search(response.text).group(1)+"&userCode="+num0+"&password="+num1+"&verifyCode="
#这里正常情况下应该使用json格式的数据,但由于verifyCode的值为空,只能像笔者这样写才能使用(其实这里笔者也有一定的疑惑,望大佬解惑一波)
try:
response_demo=session.post(url=url_demo,headers=header,data=data,timeout=2)
except:
pass
因为MD5需要逆向js,笔者现在还做不到,所以密码直接在抓包中获得…好了,做到这里已经成功登录了
我们在fetch/XHR中找到了这个数据list,里面包括了同学们的学习记录
接下来查看标头得到它需要提交的请求的构造格式,这里发现inid每个团支部都是不同的,iclassID是青年大学习的期数,需要我们input我们需要查询的期数,同时需要提前在这里得到inid的值并且读入到我们的num2中
好了到现在我们的思路基本就捋清了,接下来只需要爬取一定页数的网站并将他们的信息与xlsx表格中的数据对比就能找到哪些同学还没有完成青年大学习了~
学习信息
try:
chooseint=sg.popup_get_text("输入青年大学习期数:")
except:
exit(0)
if chooseint!=None:
for i in range(10) :
try:
url2="xxxxxxxxxxxxiclassId="+chooseint+"&inid="+num2+"&pageNumber="+str(i)+"&pageSize=20"
except:
break
header2={
xxxxxxx
}
try:
response2=session.get(url=url2,headers=header2)
data+=response2.text
except:
break
class_name=pd.read_excel(r".\study.xlsx")
list1=np.array(class_name.iloc[:,0]).tolist()
list3=np.array(class_name.iloc[:,1]).tolist()
list4=np.array(class_name.iloc[:,2]).tolist()
好了接下来我们需要实现我们的邮箱提醒功能了,这部分没有什么需要讲的直接套代码就ok
邮箱功能部分代码
"""这里注意一下前面有空格,是接着上面代码段写下来的"""
QQzip=dict(zip(list1,list4))
bag=dict(zip(list1,list3))
k=0
sr=''
QQ_email=[]
for i in bag.keys():
if str(i) not in data and bag[i] not in data:
sr+=str(i)
sr+='-'
sr+=bag[i]
sr+="\n"
k+=1
QQ_email.append(str(QQzip[i])+"@qq.com")
if k==0:
sr="全班已经完成青年大学习!"
else:
sr+="{}名同学未完成本周的青年大学习!!!".format(k)
sr+="\n"
sr+="如有bug请联系QQ:我的QQ哈哈哈"
sg.popup(sr,title="未完成名单",text_color='blue',grab_anywhere=True)
if len(QQ_email) ==0:
tpo='No'
else:
tpo = sg.popup_yes_no ("是否需要一键邮箱提醒?", title="一键提醒")
if(tpo=='Yes'):
msg=MIMEMultipart()
conntent="第"+chooseint+"期的青年大学习请尽快完成!"
msg.attach(MIMEText(conntent,"plain","utf-8"))
msg["Subject"]="青年大学习提醒"
msg["From"]=email
to=QQ_email
s=smtplib.SMTP_SSL("xxxx",465)
s.login(email,passward)
s.send_message(msg,email,to)
sg.popup("发送成功",title="提示")
这里总结一下,其实这个项目的话使用面向对象的写法的可读性会更高,但是为了方便我是直接顺着思路写下来了,其中有一些变量的命名比较不标准我给大家进行了注释,第一次写博客也是望大家包含,非常期待大家宝贵的意见!!!