如何为新版的「四川大学综合教务系统」增加「一键评教」功能

【2020 年 4 月 8 日更新】这是一篇我在 2018 年 8 月写的博文,讲述了如何快速评教的技术细节。但我发现很多人从百度而来,只是为了找一个快速评教的方法的,不太想看实现的技术细节……如果您有这样的需求,我已经制作了一个脚本叫做 四川大学综合教务系统助手,一直在稳定更新,从旧版教务系统一路适配到新版教务系统的最新版本,其中有一个功能就是快速评教。您可以点这里使用:https://zhaoji.wang/sichuan-university-urp-assistant/


8 月 27 日无疑是个伟大的日子,在 110 年前的这一天,晚清政府颁布钦定宪法大纲,标志着中国第一部真正意义上的宪法诞生。如果把时间继续向前推移,我们会发现,凯撒在这一天登陆英格兰;而如果把时间继续向后推移,我们会发现,摩尔多瓦在这一天脱离苏联独立,甚至在 2004 年的这一天的雅典奥林匹克体育场上,刘翔跑出了 12 秒 91 平世界纪录的佳绩勇夺金牌……

但是,这些事情对我而言,都不如 2018 年 8 月 27 日发生的事情令人振奋——「四川大学综合教务系统」终于更新了。

我是在江安寝室里的一号坑上得知这个消息的,随后我便意识到了一个严重的问题,我先前写的四川大学综合教务助手失效了!老系统都没了,皮之不存,毛将焉附?一个现实的问题摆在了我面前,是补作业还是重构这个程序?在收到下面这封邮件后,我决定补完重要的作业后就把这个程序重构一下。

现在程序已经重构完成,有需要的同学可以点击这里安装使用。

下面我将记述一下重构过程中的一些要点,基本原理和之前旧系统一键评教那篇文章中所讲的类似,所以一些旧文中提过的内容将不再详述。

新系统为 JQuery + Bootstrap + Ace 模板构建,比起旧系统的上古风格自然是先进得多了,也算是追上了五年前的时代潮流。前几天还在一个群里看到有同学说「学校又为了省钱,做的教务系统还是套模板的,在网页头部一找就能看到 bootstrap 和 ace,百度一下就发现是模板」,这要么是为黑而黑,要么是对前端开发的认识还处于社会主义初级阶段,我相信是后者。总的来说,学校这个新系统比起旧系统确实好了很多,不仅兼容现代化浏览器,还做了多屏自适应处理,是一个很大的进步。

如上图,新系统中传参的方式和旧系统类似,都是将评教问卷所需的内容直接写到了元素 html 结构中,只不过旧系统是保存在 name 属性中,新系统直接写到了 onClick 的参数里,所以接下来处理的方式也大同小异。

首先,我们还是将网页上的 dom 结构转化为我们易于处理的数据结构,将其拍平成一个只有 onClick 内容的数组:

然后将每一项 onClick 中的六个参数提取出来:

之后进入问卷界面,发现新系统传入的参数多了一个 tokenValue ,这是何方神圣?经过研究,这个 tokenValue 并不在列表页出现,是只在评价页才出现的,还是用的 hidden input 标签的方式传递的。所以为了得到 tokenValue,还需要加载一下问卷页面,再用正则表达式提取出 hidden input 标签的 value。

但这里直接发 XMLHTTPRequest 是不行的,会报错,说明后台做了检测,只让用浏览器的方式访问问卷页,而不让通过 AJAX 的方式发 XMLHTTPRequest  访问,这个也好解决,只需要把请求头中的 X-Requested-With 设置为空就可以伪装成浏览器正常访问了。由于教务系统里集成了 JQuery,我没有再用 fetch,而是直接用了 JQuery 的 AJAX 功能。

之后就是拼参数作为 body 发 post 请求了,由于教务系统的列表页打开问卷页用的是表单提交跳转的方式,因此需要把 body 按照 x-www-form-urlencoded 的格式拼好,再 encodeURI 一下,防止中文字符出乱子。

在加载完成后,就能从 html 原始文本数据中读出 tokenValue 了:

之后需要处理好问卷题目对应的编号,新教务系统在这一块的数据格式和旧系统完全一致,不再详述。

然后是主观评价部分。在旧系统里,主观评价必须传 gb2312 格式编码的汉字,这就比较麻烦,因为 JavaScript 是没有一个原生方法可以把文字以任意格式编码的,encodeURI 只能编码为 UTF-8。还好,新教务系统改掉了这个反人类的设定,我们直接预置好几条评论,然后 encodeURI 一下就行啦。

然后拼好请求的 body,发送就可以了。旧系统中那个坑爹的隐式强制「先访问一下问卷面才能评价」在新系统里被换成了 tokenValue 验证的方式,容易避开多了。这里把 tokenValue 和问卷信息的几个参数、问卷结果、主观评价都拼在一起后,发送到 /student/teachingEvaluation/teachingEvaluation/evaluation,提示评价成功!

之后我加了 500 毫秒的延时循环发送请求就可以批量快速评价了,没有直接并发一堆请求出去是为了给教务处系统减轻一些压力。测试后程序可以正常运行,perfect!大功告成!

如何为新版的「四川大学综合教务系统」增加「一键评教」功能》有20个想法

回复 hh 取消回复

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