基于Tk的多线程选课程序

21-34-36.jpg

很久以前写的破程序,拿出来献丑来的

起因

大一的时候因为学校的教务系统一到选课的时候就Server is busyService is unavaliable,每次又要在三个备选网址“碰运气”登录,然后再“碰运气”刷出课,然后再“碰运气”选上老师,最后“碰运气”提交。
对,感觉学校的服务器是这样子的

14-51-37.jpg
然后就写了一些多线程脚本测试哪个服务器比较好登录,然后在这个基础上加了一些爬出通识课人数的功能,毕竟通识难抢,说不定还能捡漏23333
最后发现可以写个GUI程序给大家用用,于是乎大一下的时候就开始写了

搁浅

其实在写脚本之时思考了许多问题,能不能跳过一些获取课程信息的步骤,然后直接按照你事先想要的课名直接提交(因为这样能省去两次Server is busy的关照, 节约了时间,成功率也会提高很多),后来发现这玩意需要每个人的对应课表和对应开课的安排还有所有课程对应的课程号和开课班级老师的代号,这个就有点难办了

方法一

先做课程抓取然后提交的路线,然后把对应班级和对应课程写回数据库,用的人多了,表也就全了。然而这样做量太大不说,这种静态表的方法经不起学校教学计划一点变动,俗话说得好,吃力不讨好,作罢。

方法二

归根结底是因为没有数据库里面课程安排和课程代号嘛,不如找到学校的课程中心,弱密码管理员进去,看看有没有对应的玩意。
后来是进去了,也找到了所有学生的开课表和课程开课时间等,然而发现这玩意是有延迟的,就是这些信息都是上个学期的。。。对于选课来说用处并不大,唯一的作用就是看看哪个学生本学期开了啥课或者某个课有啥学生,也是略鸡肋,作罢

最终方法

一步到位是不可能一步到位了,老老实实写了多线程,加上循环请求以及错误、超时处理等

可能因为懒吧,每次学校开放选课的时间也是有限的,所以写了挺久,后面又遇到一些歪点子的家伙抢课卖钱或者退了别人的课卖钱,被学校重视严查,随后通识课的选课就加了验证码,而我这软件也就此搁浅了

续写

最近因为面试需要写些项目,故拿出来翻新一下,发现还是能绕过验证码提交的,就补完了GUI这个坑(其实脚本也挺好用的)

Feature

  1. 三个备用选课网址多线程登录
    2.支持三种类型的课程(专业课、英语课、通识课)
  2. 登录后获取课程粗略信息(名称、id等)
  3. 多线程循环请求课程详细信息(老师,校区,时间,选择人数等)
  4. 选、退课功能(这里多说一句,教务系统的源码中选课和退课都是一个网页请求,参数也都是一样处理的,故同一课程提交两次是没效果的,同一个课程同时提交两个不同的老师也是没用的,当然除了其中有个提交线程炸了的情况)
  5. 手动刷新课程信息功能(不太建议用,除非很久没动静了)

Usage

登录

输入教务系统的学号和密码,并在左下角选择需要选的课程类型
15-21-51.jpg

选择课程

以通识课为例,双击左边任意的课程选项,若多线程爬虫返回了结果就会显示在右边
15-24-30.jpg
若还没返回结果,你将得到一个卖萌

15-26-48.jpg

注意
每个课程的爬虫都是独立的线程爬虫,并非阻塞式地等到所有课程详细信息都得到后才返回结果,所以你可以多看看其他课程的情况

当然,如果你点击非课程项,右边的信息框将会出现一些建议
15-29-30.jpg

提交课程

若爬虫已经返回结果,你就可以双击右边的选项将对应老师的课程添加到下方的已选待提交列表(列表上限为三个课程)
15-30-51.jpg
当你选择完之后就可以点击右下角的提交按钮了

15-32-22.jpg若不出意外,你的选课将会被服务器处理然后选课成功
当然,在你点击了提交选课之后,左边的信息框会强制刷新一次,或者说是再一次向服务器发送请求,所以当提交了之后左边的信息框并未更新的时候,请不要着急然后猛点击手动刷新,这可能会造成服务器更加严重的负担,对谁都没好处对吧
这个按钮是用来当信息很久没有更新的情况下给用户手动刷新一下的


当你提交之后,你唯一能做的就是等它刷新 :)
(并不保证所有提交请求都会被处理)

Tips

Python版的需要Python环境并自行安装requests库,exe双击打开就成
Github上有源码,欢迎交流
Python 版下载链接 - Github
EXE 版下载链接 - Github



----- 感谢阅读 -----