### 前言: 为避免以后发生 忘记/抢不到课 的情况,于是在愤怒中写下了这个脚本! 使用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(不影响脚本),见下图: ![][1] 2.API出错就返回404状态码,不报原因。 3.API返回不符合规范,以及各种奇葩命名 4.未知原因的 选课未开放(别人都选完了)。 **未完待续...** [1]: https://www.guwolf.com/files/ZSC-robber/1.png Loading... ### 前言: 为避免以后发生 忘记/抢不到课 的情况,于是在愤怒中写下了这个脚本! 使用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(不影响脚本),见下图: ![][1] 2.API出错就返回404状态码,不报原因。 3.API返回不符合规范,以及各种奇葩命名 4.未知原因的 选课未开放(别人都选完了)。 **未完待续...** [1]: https://www.guwolf.com/files/ZSC-robber/1.png 最后修改:2024 年 01 月 12 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果觉得我的文章对你有用,请随意赞赏