前言:
为避免以后发生 忘记/抢不到课 的情况,于是在愤怒中写下了这个脚本!
使用python开发,运行环境基于Python 3.12,其他请自测。
经过一个下午的努力(基本在找规律),已经实现了基本抢课功能,待开发完后在github开源。
每日Push代码量:
2024-1-10 | 187 |
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请求获取课程列表,重点是返回的jx02id
和jx0404id
,下面进行选课提交的时候会用到。
相关参数 | 作用 |
---|---|
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.未知原因的 选课未开放(别人都选完了)。
未完待续...