实用工具

CourseGo





基于Python对教务系统信息的获取

摘要

教务系统是高校中必要使用的管理系统之一。对于学生来说,它的功能主要包含成绩查询、课表查询、课程选择等,在学生的学习中占据重要的作用,而如何方便高效的使用,特别是能够在选(抢)课抢占先机,是一项有意义的研究项目。

针对这样的构想,本人设计了一项名为CourseGo的教务系统辅助程序。该程序主要利用Python爬虫实现对教务系统信息的爬取,目前开发的研究重点是利用机器学习对登录验证码自动识别。

关键词:教务系统 Python爬虫 选(抢)课 验证码识别

CourseGo程序流程

用户在CourseGo成功登录教务系统后,即可使用对教务系统的相关操作。首次登录时,需要用户输入用户名和密码,在登录成功后,程序会自动保存用户登录信息,下一次运行程序时则会自动登录。程序流程图大致如下:

图1 程序流程图

Course功能简介

在登录成功后,程序显示用户信息以及主菜单功能列表,如下图所示:

图2 登录成功界面

  1. 成绩查询

获取所有成绩保存为Excel表格至程序目录下。

  1. 课表查询

根据查询的学期课表保存为pdf格式文件至程序目录下。

  1. 考试查询

获取所有考试信息(考点、时间等)保存为Excel表格至程序目录下。

  1. 公选课

进行选课操作,可实现快速选课、挂机刷课,例如下图所示:

图3 “公选课”操作

CourseGo功能实现原理

所有功能的实现都是建立在登录教务系统的基础上,因此如何能够使用Python成功登录教务系统是最关键的问题。由于程序是面向用户的,所以不能使用cookie登录,需要让用户在程序中以模拟登录的方式进行登录。

学校使用的教务系统是由“正方”开发的,开始通过抓包发现登录密码传输是被加密过的,查阅资料后了解到,新版正方教务系统使用的是RSA加密密码。这样,向服务器提交正确的数据后就可以登录成功了,具体的实现过程这里不再详述。

对于成绩查询、课表查询、考试查询这三个功能,实际上就是调用了教务系统的接口来缓存相应文件,比较容易实现。“报个Bug/提个建议”是利用SMTP发送邮件,由于不知道他人的邮箱授权码,所以这里将作者本人的邮箱授权码写入了程序,本质上是用户使用作者的邮箱授权码实现了作者邮箱向作者邮箱发送邮件的功能。“公选课”功能的设计和实现是最复杂的,因为要考虑到用户的操作情况,所以加大了程序设计的难度,以下详细叙述该功能的实现过程。

学校一般只在选课期间开放选课系统,因此对于选课系统的分析和程序的测试而言,时间都是非常紧迫的。对选课提交数据的抓包分析是最难的一步,只有知道了哪些数据是用户指定的,哪些数据又是系统默认好的,才能获取到正确的课程信息和提交正确的选课请求。下图以“综合英语”选课为例给出了提交的数据:

图4 “综合英语”选课提交的请求数据

可见提交的数据很多,有些根据拼音首字母缩写可以猜测出大致意思,而有些则难以猜测,需要通过对比其他选课请求来推测,包括不同任课教师和不同课程的对比分析,这是一个复杂繁琐的过程,需要拥有足够的耐心和细心。课程信息获取与选课信息提交过程类似,实际上就是模拟出查询课程的功能,通过抓包可知课程信息查询是有两个POST请求,而显示在浏览器中的信息是这两个请求信息的组合。

在得知必要数据的含义后,即可设计出用户使用程序的操作流程,用户操作的大致流程如下:根据程序提示输入要选择模块相应的编号和字符串(教务系统设定的,具体含义未知)输入要查询的课程代码根据返回信息选择具体的课程开始刷课。下图是刷课成功的提示:

图5 刷课成功

登录验证码自动识别

登录验证码是今年才添加的,在以前登录是没有的。如果能够做到自动识别可以使程序更加智能。由于验证码是由数字加字母共6位组成的,不易识别,而且对于程序的提高并不大,因此本人并没有对此进行详细研究,目前只是获取了用于训练的验证码图片数据集,今后有时间可以尝试对此深入研究。

图6 验证码示例

图7 验证码图片数据集

一般来说,对于验证码图片的识别需要经过以下几步:

图8 验证码识别一般步骤

识别过程需要用到机器学习等知识,要想提高识别准确率还需要对图片进行降噪等处理,并且优化训练模型。

参考文献

[1]Koevas.用Python登陆新版正方教务系统获取课程表(及RSA加密密码实现)[EB/OL].https://blog.csdn.net/Koevas/article/details/88384604, 2019-03-10.

[2]dairoot.python 正方教务系统
验证码识别[EB/OL].https://blog.dairoot.cn/2019/02/20/zfxf-check-code/, 2019-02-20.

[3]Pusnow.pyjsbn-rsa[CP/OL].https://github.com/Pusnow/pyjsbn-rsa.

 


5条评论

dizi进行回复 取消回复

邮箱地址不会被公开。 必填项已用*标注