概述
学校教务系统更换成了强智教务系统(吐槽:花了200万的教务系统连个手机客户端都没有,且根本没对手机进行适配),导致没有较好的手机客户端能适配,很多同学们用的第三方客户端都出现了乱码或者缺课的现象。由于我手机开发实在不行,所以我萌生了每天0点自动发送今天课表加本周课表到我自己的邮箱的这么一个想法。
抓包分析
登录
我们打开官网后,输入账号密码点击登录按钮,发现第一个包是POST /Logon.do?method=logon&flag=sess返回了一串字符,到这里不清楚这是干啥的;然后第二个包是POST /Logon.do?method=logon,传入了userAccount(学号)和encoded(密文)返回了一个重定向,第三个包是访问了刚刚的重定向网址结果又重定向到了/jsxsd/framework/xsMain.jsp主页。
分析到这里,我们发现密码是被加密了再传输的。我第一个想到的是右键查看源代码看看密文是怎么来的吧,登录按钮直接绑定了js函数login(),跳转到这里发现如下代码:
1 | function login() { |
发现了猫腻,原来这里访问了第一个包得到的字符串是一串可以说是密钥的东西;通过一系列算法把密码加密成密文,我把这段翻译成了Python代码:
1 | def encrypt_password(xuehao, password, dataStr): |
得到密文之后,就可以正常登录了。
1 | s = requests.session() |
[可选]获得姓名
登录后重定向两次到了/jsxsd/framework/xsMain.jsp,里面含有名字可以取出,查看源码容易知道用正则
<span class="glyphicon-class">(.*?)</span>可以返回的第一个数据就是姓名。
[可选]获得当前周
我们发现主页是多个iframe框架拼凑的,第几周的信息在/jsxsd/framework/xsMain_new.jsp路径下,查看源码容易知道用正则>(.*?)</span>/(.*?)$可以返回第几周和总周数。
获得课表
分析包容易发现/jsxsd/framework/main_index_loadkb.jsp就是课表的网页,传入的rq参数是当天的日期,传入日期不同课表显示不同。但是课表名字过长的话会显示..导致显示不全,刚开始我还以为是前端CSS造成的,结果是后端就处理好的!汗!幸好我们将鼠标滑动的时候能显示出详细的信息,所以通过查看源码可以得到课程的完整名称和地点。课程的详细信息在td标签里的p标签的title属性里。我们把所有的数据打包成一个二维数组,供生成图片使用。
代码如下:
1 | r = s.post(url="http://xk.csust.edu.cn/jsxsd/framework/main_index_loadkb.jsp", data={"rq": time.strftime("%Y-%m-%d", timeStruct)}) |
生成的数据长这个样子
1 | [ |
然后参考https://www.cnblogs.com/xiamibk/p/10299609.html的文章,执行
1 | create_table_img(table_data, xh + '(' + rq + ')课表.png', font="font.ttf", |
将二维数组表转换成图片就是这样:

自动发送邮件
首先我们在163邮箱里创建一个授权码当做第三方客户端的密码,然后就可以将当天的课表和本周的课表图发出去了。
获得当天课表
1 | t = table_data.copy() # 复制一份刚刚生成的二维表 |
PNG图片转Base64
不想以附件的形式发邮件了,就直接用base64图片返回的是HTML的IMG标签:
1 | def img_to_base64_img(fileName): |
发送邮件
没啥好说的,贴代码吧
1 | def sent_email(sender, pwd, receiver, text, img_path): |
然后在Linux设个定时任务就行了啦!


