Skip to content

Instantly share code, notes, and snippets.

@PhotonQuantum
Last active July 11, 2023 16:11
Show Gist options
  • Save PhotonQuantum/88907a1b43a4fac60535547c9ab29600 to your computer and use it in GitHub Desktop.
Save PhotonQuantum/88907a1b43a4fac60535547c9ab29600 to your computer and use it in GitHub Desktop.
正方教务(交大)选课协议分析

标记说明:

A 课程类型:主修、民族课、版块课(体育,英语)等,影响 rwlx xkly xkkz_id bklx_id kklxdm
B 个人及客观信息:学期号、专业号、选课学年等
C 特定课程及教学班信息
E 请求相关:分页参数

静态网页及相应查询参数准备

A1. 请求所有课程类型

B. 请求个人及客观信息

GET https://i.sjtu.edu.cn/xsxk/zzxkyzb_cxZzxkYzbIndex.html?gnmkdm=N253512&layout=default&su=学号

返回(部分):

<input type="hidden" name="iskxk" id="iskxk" value="1"/>
<input type="hidden" name="jgh_id" id="jgh_id"/>
<input type="hidden" name="jzxkf" id="jzxkf" value="0"/>
<input type="hidden" name="xkzgmc" id="xkzgmc" value="30"/>
<input type="hidden" name="xkzgxf" id="xkzgxf" value="55"/>

得到:B xqh_id zyh_id njdm_id bh_id xkxnm xkxqm xszxzt

<li><a href="javascript:void(0)" onclick="queryCourse(this,'71','A**********45A7FE055F8163ED16360','2019','0*****')" role="tab" data-toggle="tab">民族生课程</a></li>
<li><a href="javascript:void(0)" onclick="queryCourse(this,'72','A**********33881E055F8163ED16360','2019','0*****')" role="tab" data-toggle="tab">留学生课程</a></li>
<li><a href="javascript:void(0)" onclick="queryCourse(this,'06','A**********45F12E055F8163ED16360','2019','0*****')" role="tab" data-toggle="tab">板块课(体育(3))</a></li>
<li><a href="javascript:void(0)" onclick="queryCourse(this,'10','A**********C3455E055F8163ED16360','2019','0*****')" role="tab" data-toggle="tab">通识课</a></li>
<li><a href="javascript:void(0)" onclick="queryCourse(this,'11','A**********00B28E055F8163ED16360','2019','0*****')" role="tab" data-toggle="tab">通选课</a></li>

得到:A相关 所有课程类型及 kklxdm xkkz_id (32位id)

A2. 请求特定课程类型参数

POST https://i.sjtu.edu.cn/xsxk/zzxkyzb_cxZzxkYzbDisplay.html?gnmkdm=N253512&su=学号
{'xkkz_id': 'A**********45F12E055F8163ED16360', 'xszxzt': '1', 'kspage': '0', 'jspage': '0'}

参数说明:

xkkz_id A 选课kz 32位id
xszxzt B 学生自选状态
kspage jspage E 分页参数

返回(部分):

<input type="hidden" name="rwlx" id="rwlx" value="1"/>
<input type="hidden" name="kklxpx" id="kklxpx" value="5"/>
<input type="hidden" name="xklc" id="xklc" value="3"/>
<input type="hidden" name="xklcmc" id="xklcmc" value="抢选"/>
<input type="hidden" name="bklx_id" id="bklx_id" value="0"/>
<input type="hidden" name="zckz" id="zckz" value="0"/>

得到:A rwlx xkly tykczgxdcs bklx_id bonus: xklc 选课轮次int xklcmc 选课轮次str

XHR 请求

1. 请求所有教学班的列表

POST https://i.sjtu.edu.cn/xsxk/zzxkyzb_cxZzxkYzbPartDisplay.html?gnmkdm=N253512&su=学号
{'rwlx': '1', 'xkly': '1', 'xqh_id': '02', 'zyh_id': '0*****', 'njdm_id': '2019', 'bh_id': 'F19*****', 'tykczgxdcs': '30', 'xkxnm': '2020', 'xkxqm': '3', 'kklxdm': '01', 'kspage': 1, 'jspage': 10}

参数说明:

rwlx A 任务类型
xkly A 选课ly
xqh_id B 学期号
zyh_id B 专业号
njdm_id B 年级代码
bh_id B 班号
tykczgxdcs A 体育课操作更新的参数
xkxnm B 选课学年名
xkxqm B 选课学期名
kklxdm A 开课类型代码
kspage jspage E 分页参数

更新:

经过进一步研究,至少还需要带上以下几个参数才能确保拉取到的课是正确的 ['xslbdm', 'ccdm', 'kklxdm', 'xbm', 'zyfx_id', 'xsbj', 'kkbk', 'sfkknj', 'sfkkzy', 'sfznkx', 'zdkxms']

附加说明:

这个 API 会返回所有版块内可选的教学班列表,然而缺少部分关键的信息,比如选课用的 do_jxb_ids,还有老师信息、上课时间地点等内容,需要从下面的 API 拉才能取到。

2.请求指定课的教学班的详细信息

POST https://i.sjtu.edu.cn/xsxk/zzxkyzb_cxJxbWithKchZzxkYzb.html?gnmkdm=N253512&su=学号
{'rwlx': '1', 'xkly': '1', 'bklx_id': '0', 'xqh_id': '02', 'njdm_id': '2019', 'bh_id': 'F19*****', 'xkxnm': '2020', 'xkxqm': '3', 'kklxdm': '01', 'kch_id': 'AA000', 'xkkz_id': 'A**********00B76E055F8163ED16360'}

参数说明:

rwlx A 任务类型
xkly A 选课ly
bklx_id A 版块类型
xqh_id B 学期号
njdm_id B 年级代码
bh_id B 班号
xkxnm B 选课学年名
xkxqm B 选课学期名
kklxdm A 开课类型代码
kch_id C 课程号
xkkz_id A 短32位id

附加说明:

这个 API 会返回特定课程下辖的所有教学班的信息。例如检索 EM-215 会得到 EM-215-{13-15} 等所有教学班的信息,其中包含上面 API 返回内容中缺少的部分。

3. 选课

POST https://i.sjtu.edu.cn/xsxk/zzxkyzb_xkBcZyZzxkYzb.html?gnmkdm=N253512&su=学号
{'jxb_ids': '3613************************************************************************************************************************************************************************************************************************************************************', 'kch_id': 'AA000', 'sxbj': '1', 'qz': '0', 'xkkz_id': 'A**********00B76E055F8163ED16360', 'njdm_id': '2019', 'zyh_id': '0*****'}

参数说明:

jxb_ids C 教学班长id 从请求指定课的教学班API里的do_jxb_ids得到,每次请求上述API均重新动态生成,但是一段时间内似乎可以复用
kch_id C 课程号
qz 权重 代码写死定值0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment