自动化选课工具,用于DGUT教务系统(jwx.dgut.edu.cn)。
重要: 本项目需要有效的教务系统 Cookie 才能运行。
在项目根目录创建 cookie.json、cookie.jsonc 或 cookie.jsonl 文件,格式如下:
说明:cookie.jsonc 支持 // / /* */ 注释与尾随逗号。
-
使用浏览器开发者工具:
- 登录教务系统 https://jwx.dgut.edu.cn
- 按 F12 打开开发者工具
- 切换到 "应用程序/Application" 或 "存储/Storage" 标签
- 找到 Cookies → jwx.dgut.edu.cn
- 复制
bzb_jsxsd的值
-
使用浏览器扩展 (推荐):
- Firefox: Cookie Quick Manager
- Chrome: EditThisCookie
- 导出为 JSON 格式
-
简化格式 (仅需 session ID):
{ "bzb_jsxsd": "YOUR_SESSION_ID_HERE" }
- 不要分享你的 Cookie,它等同于你的登录凭证
- Cookie 会过期,需要定期更新
本项目使用 uv 进行包管理:
# 安装 uv (如果还没有)
pip install uv
# 安装依赖
uv sync
# 运行脚本
uv run python script/xxx.pyjwx/
├── cookie.jsonc # Cookie 配置 (需自行创建,不提交到 Git)
├── README.md # 本文件
├── pyproject.toml # 项目配置
├── .gitignore # Git 忽略规则
│
├── script/ # 脚本目录
│ └── network/ # 网络分析脚本
│ └── analyze_har.py # HAR 文件分析工具
│
├── docs/ # 文档目录
│ └── developer/
│ └── network/ # 网络分析文档
│ ├── API分析报告.md
│ ├── 技术实现文档.md
│ └── har_analysis.json
│
├── developer/ # 开发资源
│ └── network/ # 网络抓包文件
│ ├── README.txt
│ └── *.har # HAR 抓包文件
│
└── reference/ # 参考代码
└── repo/ # 参考仓库
src/jwx/ 为主代码(模块化 CLI),后续油猴脚本放在 userscript/。
uv run python script/network/analyze_har.py先准备好 cookie.jsonc(或设置环境变量 JWX_COOKIE),然后使用:
# 可选:设置默认批次(jx0502zbid),避免每次都传 --batch-id
# PowerShell:
$env:JWX_BATCH_ID="2F261F6F7B3D47549344FC34A0A4A749"
# bash:
export JWX_BATCH_ID="2F261F6F7B3D47549344FC34A0A4A749"
# 列出课程(默认 TSV:课程名/老师/学分/剩余/课程ID(kcid)/jx0404id)
uv run jwx courses list --length 10
# 按关键词筛选(服务端筛选)
uv run jwx courses list --kcxx 英语 --length 50
# 选择指定课程(需要 kcid + jx0404id)
uv run jwx select --kcid <KCID> --jx0404id <JX0404ID>
# 查看已选课程(HTML 或 JSON)
uv run jwx courses selected > selected.html
uv run jwx courses selected --json
# 退选(需要 jx0404id,可从 “已选课程 JSON” 或页面中找到)
uv run jwx drop --jx0404id <JX0404ID>
# 定时选课:到点后开始重试(间隔 0.5s,最多 120 次)
uv run jwx schedule select --at "2026-03-13 08:00:00" --attempts 120 --interval 0.1 --kcid <KCID> --jx0404id <JX0404ID>
# 自动选课:从列表里挑第一个满足条件的课程并选(默认 max-xf=1.0, min-seats=1)
uv run jwx auto --kcxx 通识 --length 50
# 模糊选课:用自然语言关键词匹配(多个匹配默认选第一个;不并发)
uv run jwx pick 科学技术史
uv run jwx pick 混合公选 数学
# 定时模糊抢课:到点后循环“拉列表→匹配关键词→尝试选课”(默认 interval=0.1s)
uv run jwx schedule pick --at "2026-03-13 08:00:00" --interval 0.1 --attempts 120 混合公选 数学
# 定时自动选课:到点后循环“拉列表→挑候选→尝试选课”(默认 interval=0.1s)
uv run jwx schedule auto --at "2026-03-13 08:00:00" --kcxx 通识 --attempts 120 --interval 0.1- 单会话踢出:如果浏览器访问
https://jwx.dgut.edu.cn/xsxkjg/comeXkjglb也提示“当前账号已在别处登录,请重新登录进入选课!”,说明后端判定会话失效/被踢,不是 CLI 的问题。常见原因是同账号多端同时在线(浏览器 + 脚本、另一台设备等)。 - 建议做法:只保留一个登录端;在选课页面点击 “安全退出选课” 后再重新登录并更新
bzb_jsxsd。 - 选课批次:课程列表/选课接口需要先进入选课批次(
jx0502zbid)。未进入批次时会出现 404 或返回 HTML。用--batch-id <jx0502zbid>或设置JWX_BATCH_ID。 - 参数别填错:
kcid/课程ID 通常是 32 位十六进制;jx0404id通常是数字串(教学任务 ID)。--jx0404id不能用kcid代替。
- ✅ 课程列表查询(支持分页)
- ✅ 课程筛选(按学分、剩余人数、时间冲突)
- ✅ 自动选课
- ✅ 学分限制检查
- 总学分限制: 3 学分
- ✅ 退选课程 - 已支持(
jwx drop,高风险,务必确认jx0404id) - ✅ 批量/轮询操作 - 已支持(
jwx auto/jwx schedule ...,请控制频率) - ✅ 绕过冲突检查 - 已支持(
--allow-conflict,可能导致课表冲突,后果自负)
- 在
script/目录下创建脚本 - 使用
uv run python script/your_script.py运行 - 更新文档
- 使用浏览器开发者工具(F12)
- 切换到 "网络/Network" 标签
- 执行操作(如选课)
- 右键 → "保存所有为 HAR"
- 将 HAR 文件放到
developer/network/目录 - 运行分析脚本
A: 重新登录教务系统,按照上述步骤重新获取 Cookie。
A: 服务端把请求重定向到 CAS 登录页了。更新 cookie.jsonc 里的 bzb_jsxsd(或设置 JWX_COOKIE)后重试。
A: 通常是还没进入选课批次。需要带上 --batch-id <jx0502zbid>(从选课页面 URL .../xsxk/newXsxkzx?jx0502zbid=... 获取),或设置 JWX_BATCH_ID。
A: 检查:
- Cookie 是否有效
- 课程是否还有名额
- 学分是否超限
- 是否有时间冲突
A: 访问 https://jwx.dgut.edu.cn/xsxkjg/comeXkjglb
本工具仅供学习和研究使用。使用本工具时:
- 请遵守学校选课规定
- 不要进行恶意操作
- 不要频繁请求导致服务器压力
- 使用者需自行承担使用风险
[ { "name": "bzb_jsxsd", "value": "YOUR_SESSION_ID_HERE", "domain": "jwx.dgut.edu.cn", "hostOnly": true, "path": "/", "secure": false, "httpOnly": true, "sameSite": null, "session": true } ]