跑在你自己的 Chrome 浏览器里的 Manifest V3 扩展:抓包学习真实的选课请求 → 模板化后重复发包 → 监控余量 → 命中就抢。原生 JS、零构建、零依赖。
适用系统:吉林大学研究生选课系统 —— https://yjsxk.jlu.edu.cn/yjsxkapp/sys/xsxkapp/index.html
(选课页 .../xsxkapp/course.html;插件只在这个域名下出现,其它网站完全不动)
顺序很重要:先挑课,等选课开放了再登录。挑课用的是本地课表快照,不需要登录、 也不要求现在是选课时间 —— 所以可以提前把准备全做完;开放那一刻你只需要登录一下, 剩下的(匹配班级、取 token、监控余量、发包)全自动。这才是"开放瞬间就能抢到新课"的关键。
到 Releases 下载 ZIP → 解压 → 打开 chrome://extensions →
右上角打开「开发者模式」→ 点「加载已解压的扩展程序」→ 选解压出来的文件夹。
(manifest.json 就在 ZIP 根目录。不需要 Node、不需要构建、不需要导入任何配置:项目配置会自动应用。)
打开 https://yjsxk.jlu.edu.cn/yjsxkapp/sys/xsxkapp/index.html(不用登录)——
面板会立刻出现;如果是全新环境,它会自动展开并切到「档案」页,
里面是去年保存的完整课表(不需要登录、不在选课期间也能看,这就是"历史档案"):
- 用搜索框找到你要抢的课(例如「羽毛球」「研究生心理成长」)
- 点该行的 「加监控」;要加很多门就勾选多行再点 「把勾选的加入监控」
同名教学班会全部加进来(羽毛球 12 个班 → 12 个目标),哪个先有名额就抢哪个。
挑好的课会一直留在监控列表里:今年有名额就直接抢;明年教学班 ID 变了也不用重挑 —— 插件会按课程名(+教师/校区)模糊匹配回今年的班级,够像的全部一起抢(相似度不够也采用最像的那个)。 换电脑想带走清单:面板「设置 → 导出 JSON」,新机器上导入即可。
像平时一样登录(含图形验证码)。登录无法自动化 —— 这是刻意的设计边界, 本插件不含任何绕过验证码的功能。
第一次在这个站点使用时,插件会自动应用内置预设(配好生效站点、提交/查询接口、判定规则), 你不需要手动配白名单、也不需要点「载入内置预设」。
点进选课页(course.html)后,插件自动:取得一次性参数 csrfToken(必要时用页面内点击取,约 70ms)
→ 拉课程列表 → 匹配你的目标 → 余量监控 → 命中就提交 → 用「已选课程」列表核对是否真的选上。
抢课期间让选课页保持可见(Chrome 会把后台标签页的定时器压到每分钟 1 次)。
没选上(名额已满)不会让插件停下 —— 它会继续按当前频率轮询/提交:
- 命中「名额已满」的目标置为「等名额」,下一轮继续试;一旦有人退课、名额一空出来,立刻提交
- 启用「先查余量再抢」时,它每轮盯余量表,看到
余量 > 0立即发包 - 抢到后由服务器的「已选课程」列表确认(那是权威判据),并弹通知告诉你
你要做的一件事:保持登录。会话是短命的(实测约 9~14 分钟),掉线时面板会响铃并自动 打开登录页,你输一次验证码 —— 登录后插件自动继续抢,不用重新点启动。 如果你打算长时间挂着等别人退课,就按这个节奏:掉线 → 输验证码 → 继续挂着,直到通知"已选上"。
| 场景 | 行为 |
|---|---|
| 首次装好扩展 | 默认就是「运行中」,一进选课页就自动开抢,不用点「启动」 |
| 刷新页面 / 重开浏览器 | 自动恢复继续抢 |
| 掉线后你重新登录 | 自动继续,不用手点 |
| 你手动点过「停」(或撞上验证码自动停机) | 不会自己恢复 —— 主动停机是粘性的:你收手时插件不该背着你继续发请求 |
停在首页 index.html |
只有面板,引擎不跑(引擎必须在选课页);点进选课页就接着跑 |
同一份监控列表明年继续用:教学班 ID 变了,插件会按课程名(+教师/校区)模糊匹配回今年的班级, 够像的全部一起抢。想先验证一遍能不能匹配上,点「档案」页的「模拟明年(测试模糊匹配能不能生效)」。
| 能力 | 说明 |
|---|---|
| 抓包学习 | 从你浏览器自己的请求里学出提交模板,不用手抄参数 |
| 两种模式 | ① 先查余量、命中才提交 ② 不等名额直接高频轮询(盲发) |
| 取令牌 | 优先复用页面自己取到的 csrfToken;取不到时用 UI 点击取(约 70ms) |
| 权威核对 | 以服务器「已选课程」列表确认是否真的选上(响应文案认不出来也能确认) |
| 掉线自愈 | 401 / 页面文字双路检测;掉线自动继续;只在你真掉线时打开登录页,且已开着就切过去 |
| 课程档案 | 离线课表快照,选课未开先挑课;跨年按课程名模糊找回目标 |
| 同名班 | 同名教学班可以一起抢(多一个班多一次机会),默认不因"判定抢到"就收手 |
| 自我保护 | 每分钟请求上限、最小发包间隔、遇 429/验证码自动停机并通知 |
| 存档与风控 | 档案可导出/导入文件;日志自动合并(不刷屏);限速参数面板可调 |
- 插件跑在你自己的浏览器里,复用你本来就会发出的请求;不包含任何绕过登录验证(如验证码识别)的功能
- 这类行为很可能与学校的选课系统使用条款、教务规定相冲突,也可能触发风控 —— 风险与合规责任由使用者自负
- 抓包与日志只存在本地(
logs/已在.gitignore里,不会随仓库分发);推送/导出时自动脱敏(密码/验证码/学号/Cookie →***) - 本仓库不含任何个人信息;附带的
archives/是学校公开课表快照
- 会话是短命的(实测约 9~14 分钟):掉线后需要你手动输验证码重新登录,之后自动继续
- Chrome 限制后台标签页定时器 —— 抢课期间请让选课页保持可见
- 提交判定的文案来自抓包,各校/各系统版本可能不同:设置页可改
submit.rules(见 配置说明) - 课程列表若很大,建议把
query.body的pageSize调大,否则目标可能落在分页之外
| 现象 | 处理 |
|---|---|
| 面板不出现 | 确认地址是 yjsxk.jlu.edu.cn;插件只在该域名生效 |
| 不发包 | 依次查:目标是否为空 → 是否在选课页 → 登录态是否「已掉线」 |
| 发得很慢 | 面板看「实测速率」;多半是标签页被降频(让页面可见),或撞了每分钟上限 |
| 一直「等名额」 | 该教学班确实满了;可勾选同名其它班一起抢 |
| 不知道选上没 | 看目标页「已选课程」区块(服务器权威数据) |
| 想验证模板对不对 | 设置页有「对第一个目标试提交一次」(会二次确认) |
npm test # 120 项自测(含反向验证过的关键接线)
npm run mock # 本地假教务系统,不动真系统先演练(见 docs/DEV.md)
npm run collector # 本地抓包收集器(127.0.0.1:8790,日志落 logs/)
npm run scan -- --name 你的名字 # 发布前敏感信息扫描(学号/姓名/令牌/Cookie…)| 文档 | 内容 |
|---|---|
| docs/CONFIG.md | 配置项速查表、判定规则、engine 参数含义 |
| docs/HOW-IT-WORKS.md | 实现原理:两种模式、会话与硬超时、浏览器降频、界面速查 |
| docs/CAPTURE.md | 怎么抓包、自动落盘、用 HAR 生成配置 |
| docs/DEV.md | 本地演练、目录结构、调试技巧 |
| docs/PUBLISH.md | 开源前的检查清单(含"误推了敏感信息怎么办") |
本项目用于学习和研究浏览器扩展与 HTTP 抓包的基本原理,以及在本人账号上减少重复操作。 使用者应自行确认所在学校关于选课系统的使用规定并自行承担全部后果; 请勿用于代抢、牟利或干扰他人选课。许可证 MIT。