青年大学习提醒系统

青年大学习提醒系统


作为班上的团支书,每周提醒班上同学做青年大学习是每周的必做工作,以青年大学习后台网站为例,笔者通过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="提示")
	        

这里总结一下,其实这个项目的话使用面向对象的写法的可读性会更高,但是为了方便我是直接顺着思路写下来了,其中有一些变量的命名比较不标准我给大家进行了注释,第一次写博客也是望大家包含,非常期待大家宝贵的意见!!!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值