适配 2026 年秋 TIS 平台升级(SESSION cookie / 查询限流)。原版脚本会登录成功即崩溃(原仓库 issue #36),本 Fork 已修复,实测可用(2026-09-07)。
前置:Python 3.6+,安装依赖:
pip install requests colorama第 1 步:写课表。编辑 class.txt,一行一门课,顺序即优先级(最想选的放最上面),第一行留空勿动;课程名须与 TIS 显示完全一致(含班号/语言):

第 2 步:首次运行。python main.py,全程会话如下(← 后是说明,不需要输入):
$ python main.py
[!] 读取规划课表...
[+] 规划课表读取完毕
请输入您的学号:12413422 ← 输入学号
请输入CAS密码(密码不显示,输入完按回车即可):
← 输入CAS密码,屏幕不显示,输完直接回车
[!] 测试CAS链接...
[+] 成功连接到CAS...
[!] 登录中...
[+] 登录成功
[!] 是否保存用户信息(y/N)? ← 直接回车=不保存(避免密码明文落盘)
[!] 从服务器获取当前喵课时间...
[+] 当前学期是2026-2027学年第1学期,为秋季学期
[!] 读取课程信息...
[!] 从服务器下载课程信息,请稍等...
[*] 获取 通识必修选课 列表...
[+] bxxk: 返回104门 (total=104)
[*] 获取 通识选修选课 列表...
[+] xxxk: 返回121门 (total=121)
... 六个类别依次拉取,约1~2分钟
中途出现"[!] xxx 被限流,N秒后重试"属正常,等它自动重试即可
[+] 课程信息读取完毕,共读取745门课程信息
[!] 是否保存读取的课程信息(y/N)?y ← 输 y 回车,缓存全量课表(抢课当天直接读它,秒进)
[=========================]
培养方案内课程 : 体系结构-01班-双语 ID为: 5A531BDD...
[=========================]
[+] 成功读入以上信息 ← 这里必须列出你 class.txt 里的课;一门都没有=课程名写错了,改完重跑
请输入喵课模式:[1] -- 优先按照输入课程顺序喵课,2 -- 所有课程循环喵课,0 -- 退出
1 ← 回车选默认模式1(只抢当前最优先一门)
[!] 当前模式: 优先按照输入课程顺序喵课
[*] 按一下回车喵三次,多按同时喵多次,任意字符跳过当前课程
← 进入待命。建议抢课当天提前10分钟开到这一步,
期间每隔几分钟轻按一次回车保活
第 3 步:到点开抢。选课开放时间一到,在待命提示处按回车:
[*] 按一下回车喵三次,多按同时喵多次,任意字符跳过当前课程
← 按一次回车 = 3连发(约4秒),跑完看清回执再按,连点无益
[-] 不在设置的时间范围内,课程:体系结构
← 没到点/时钟略偏,正常,继续按回车
[==================================================
[█] 选课成功
[==================================================
← 蓝色"==="框 = 抢到了!自动转向下一门
回执速查:
| 回执 | 含义 | 处理 |
|---|---|---|
| 蓝色框"成功" | 已选上 | 无 |
| 不在设置的时间范围内 | 选课尚未开放 | 继续等待 |
| 查询请求频率过高 | 被限流 | 程序自动退避重试,无需干预 |
| 陌生文案且一直不跳课 | 服务端提示语有变 | 输入任意字符回车手动跳过 |
| 大量 JSON/报错刷屏 | 会话过期 | 重启脚本重新登录(缓存仍在) |
多数 Agent 框架(ZCode / Claude Code / Cursor 等)无法在运行时替你输入学号密码(交互式终端输入)。正确姿势:让 Agent 完成克隆、装依赖、写课表等部署工作,运行命令由你本人在终端执行。把下面整段发给任意 Agent,替换尖括号内容即可:
请帮我部署南科大 TIS 选课脚本(仓库 https://github.com/wytyKen/SUSTech_Tools):
1. 克隆该仓库到当前目录;
2. 安装依赖:pip install requests colorama(已安装则跳过);
3. 将以下课程按优先级从高到低写入 class.txt,一行一门,第一行留空,课程名须与 TIS 显示完全一致:
<课程1,例:体系结构-01班-双语>
<课程2>
4. 不要运行 main.py —— 它需要交互式输入学号和 CAS 密码,你无法代输。
部署完成后,请输出:进入仓库目录的命令、运行命令,以及运行后的交互要点
(输入学号密码 → 两个"是否保存"提示均直接回车 → 选模式1 → 到选课开放时间按回车开抢,
一次回车=3连发约4秒,看清回执再按)。
- TIS 查询接口有用户级频控,"被限流,N秒后重试"属正常,脚本自动重试,勿中断;
- 某类别课程没拉全、或换了选课轮次:删除
course.txt重跑即可重新拉取; - 遇 CAS 500:提前多试几次登录;
- 每学期开学前建议先试跑一次验证(TIS 可能随时改接口);
- 学期服务器证书配置出错时,兼容修改请参照原仓库 issue。
2026-09(本 Fork,适配 TIS 升级,实测可用 2026-09-07)
cas_login改用requests.Session跟随 CAS 回跳后的全部重定向并提取SESSIONcookie,替代已废弃的route/JSESSIONID(修复登录成功即IndexError闪退,即原仓库 issue #36);queryKxrw/queryXkdqXnxq遇"查询请求频率过高"自动退避重试(5→15 秒,最多 15 次),选课类别间固定间隔 2 秒;addGouwuche遇限流额外等待 3 秒,且不将限流回执误判为"已满/冲突"而跳课;- 修复叠加抢课时"已选"回执误删队列中下一门课的并发竞态(自动跳课仅认"冲突/已满";课程实际已选时手动输入任意字符跳过);
- 每个选课类别打印实际返回门数,便于核对是否拉全;
- 新增
.gitignore(__pycache__/、user.txt、course.txt)。
2024-09(原版):TIS 后台在用户级别加了流量限制,每个有效请求触发新的限制,因此改为同时只选一门课(最重要的);未对流量特征做任何混淆,追求隐蔽性请自行修改(UA、请求参数等)。原版最后检测可用 2024-09-05;无 Python 环境可用 Windows 打包版 v5.1.0。
该脚本诞生的目的是研究节省流量,减轻选课系统负担的方法,经过测试确实能达到该效果,因人为修改脚本产生的超过手工频率的流量,由修改者承担责任
虽然Tis经过若干更新,网页端选课产生的流量已经大大减少,但该脚本仍产生更少的流量
