前言:

为避免以后发生 忘记/抢不到课 的情况,于是在愤怒中写下了这个脚本!
使用python开发,运行环境基于Python 3.12,其他请自测。
经过一个下午的努力(基本在找规律),已经实现了基本抢课功能,待开发完后在github开源。

Require Modules:

  • base64
  • request
  • json
  • urlib
  • lxml
  • fake_useragent

开发状态:

核心流程功能状态
课程列表获取
选课信息抓取
提交选课
使用try减少fatal错误发生的可能
二次验证成功选课

附加功能

功能开发状态
模拟登录(不用自己抓cookie了)
延迟抢课
cookie状态检测
cookie失效重登录
抢课信息推送
课程时间段筛选
多线程(感觉没必要)

教务系统的登录流程:

1.访问首页,服务器下发cookie。(set cookie)
2.用户输入完账号密码后,把用户名和密码进行base64编码后拼接,拼接格式为

[username(base64)] + %%%(分割) + [password(base64)]

3.携带下发的cookie将数据POST至 https://jwgln.zsc.edu.cn/jsxsd/xk/LoginToXk

POST表单

  • encoded=xxx(编码拼接后数据)。

选课流程(均需携带经过认证的cookie):

1.先向 https://jwgln.zsc.edu.cn/jsxsd/xsxk/xsxk_index?jx0502zbid=[选课列表ID] 发起GET请求,代表你进行该列表的选课。(否则下面会返回404)
2.向/jsxsd/xsxkkc/xsxkGgxxkxk?kcxx=&skls=&skxq=&skjc=&sfym=false&sfct=true&szjylb=&sfxx=true发送POST请求获取课程列表,重点是返回的jx02idjx0404id,下面进行选课提交的时候会用到。

相关参数作用
kcxx搜索关键词,缺省则返回全部课表
sfxx是否屏蔽冲突课程

表单数据:
sEcho: 1
iColumns: 12 (盲猜下面mDataProp个数)
sColumns:
iDisplayStart: 0
iDisplayLength: 15 (猜测一次返回多少个结果)
mDataProp_0: kch
mDataProp_1: kcmc
mDataProp_2: xf
mDataProp_3: skls
mDataProp_4: sksj
mDataProp_5: skdd
mDataProp_6: xqmc
mDataProp_7: xkrs
mDataProp_8: syrs
mDataProp_9: ctsm
mDataProp_10: szkcflmc
mDataProp_11: czOper
3.提交选课:
请求方式: GET
路径: /jsxsd/xsxkkc/ggxxkxkOper
需要用到jx0404id和kcid,其他参数未知...
示例: https://[domain]/jsxsd/xsxkkc/ggxxkxkOper?kcid=02114320&cfbs=null&jx0404id=202320242005563&xkzy=&trjf=

吐糟篇:

1.每访问一个页面就set cookie,还是和上面相同的cookie,导致出现大量重复cookie(不影响脚本),见下图:

2.API出错就返回404状态码,不报原因。
3.API返回不符合规范,以及各种奇葩命名
4.未知原因的 选课未开放(别人都选完了)。
未完待续...

最后修改:2024 年 03 月 15 日
如果觉得我的文章对你有用,请随意赞赏