自动化预约东南大学「人文与科学素养系列讲座」的工具,支持 GUI 图形界面、命令行 和 浏览器油猴脚本 三种使用方式。
许可证:MIT License
校外网络(非 SEU 校园网)推荐使用油猴脚本。
GUI 和命令行方案通过 Python requests 模拟登录,在校外使用时需要先连接 SEU VPN(WebVPN 或 EasyConnect)才能访问内网接口。
油猴脚本运行在浏览器中,借助浏览器已登录的 Session 和 Cookie 直接发请求,不依赖 VPN,校外直接可用。
如需 OCR 自动识别验证码,还需在本地启动ddddocr_api服务(无网络要求,纯本地运行)。
| 环境 | GUI | 命令行 | 油猴脚本 |
|---|---|---|---|
| 校内网 / VPN | ✅ | ✅ | ✅ |
| 校外直接使用 | ❌(需 VPN) | ❌(需 VPN) | ✅ |
| 功能 | GUI | 命令行 | 油猴脚本 |
|---|---|---|---|
| 多账号管理 | ✅ | ❌ | ❌ |
| 自动识别验证码(OCR) | ✅ | ✅ | ✅(需本地服务) |
| 定时倒计时抢课 | ✅ | ✅ | ✅ |
| 预约确认(已预约列表验证) | ✅ | ✅ | ✅ |
| 实时日志 | ✅ | ✅ | ✅ |
| 已预约讲座查看 | ✅ | ❌ | ❌ |
| 非可信设备手机验证码 | ✅ | ✅ | ❌ |
| 校外免 VPN 使用 | ❌ | ❌ | ✅ |
参考「环境安装」章节完成依赖安装,然后额外安装 GUI 依赖:
uv pip install PyQt6python gui/app.py- 已保存账号:从下拉框选择历史账号,点击「🔑 使用此账号登录」
- 新账号登录:填写学号和密码,勾选「记住此账号」后点击「💾 登录并保存」
- 账号信息保存在
accounts/目录下,每个账号独立文件,密码明文存储,请勿将该目录共享给他人
若当前设备为「非可信设备」,系统会自动弹出手机验证码输入框,填入收到的短信验证码即可继续。
登录成功后,左侧自动加载讲座列表:
- 列表展示讲座名称、预约时间段、活动时间
- 灰色行表示名额已满
- 单击行首复选框选中目标讲座
- 双击行或右键 → 「📋 查看详情」可查看完整讲座信息
点击「🔄 刷新列表」可手动刷新。
在「🎮 抢课控制」区域:
| 参数 | 含义 | 建议值 |
|---|---|---|
| 提前登录(秒) | 在预约开放前 N 秒重新登录以刷新 Session | 10 |
| 延迟开始(秒) | 到达开放时间后额外等待 N 秒再发请求(负数表示提前) | 0.5 |
配置完成后点击「🚀 开始抢课」,日志区域实时显示进度。
- 抢课成功后自动弹窗通知,右侧「✅ 已预约讲座」列表同步刷新
- 点击「⏹ 停止」可随时中断
界面右侧显示已预约讲座卡片列表,可配置自动刷新间隔(默认 30 秒)。
卡片左侧色条指示打卡状态:绿色 = 已打卡,黄色 = 未打卡。
python main.py- 首次运行:提示输入学号和密码,自动生成
config.txt保存凭据(后续运行直接读取) - 选择讲座:显示讲座列表表格,输入序号选择目标讲座
- 配置参数:按提示输入「提前重新登录时间」和「倒计时延迟」
- 等待并抢课:进度条倒计时,到时自动开始循环抢课
- 确认成功:每 5 次尝试或服务器返回成功时,通过已预约列表二次确认
无需 Python 环境,在浏览器中直接运行。校外无 VPN 也可直接使用,是校外同学的首选方案。
需要配合本地 OCR API 服务(ddddocr_api)识别验证码;若不需要自动识别,也可手动输入。
# 安装依赖(仅首次)
pip install flask flask-cors ddddocr pillow
# 启动服务
python ddddocr_api.py服务默认监听 http://127.0.0.1:5000,启动成功后保持运行。
验证服务是否正常:
curl http://127.0.0.1:5000/health
# 返回:{"model_loaded": true, "status": "healthy"}| 浏览器 | 安装地址 |
|---|---|
| Chrome / Edge | Chrome Web Store |
| Firefox | Firefox Add-ons |
| Safari | App Store |
- 点击浏览器右上角油猴图标 → 「添加新脚本」
- 将
greasemonkey.js的全部内容复制粘贴进编辑器 Ctrl+S保存,脚本即激活
- 打开 研究生讲座预约系统 并登录
- 页面右上角出现脚本控制面板
- 在讲座列表中点击目标讲座旁的「立即抢课」按钮
- 实时日志显示抢课进度,成功后弹窗提示
控制面板说明:
| 功能 | 说明 |
|---|---|
| OCR API 地址 | 默认 http://127.0.0.1:5000/predict_base64,可修改为远程地址 |
| 会话保活 | 启用后每 60 秒自动发送请求,防止登录失效 |
| 停止全部 | 终止所有正在进行的抢课任务 |
- Python >= 3.11
- 推荐使用 uv 作为包管理工具
pip install uv# 克隆项目
git clone <仓库地址>
cd fetch_lecture
# 创建虚拟环境
uv venv
# 激活虚拟环境
# macOS / Linux
source .venv/bin/activate
# Windows
.venv\Scripts\activate
# 安装依赖(已配置清华镜像源,速度更快)
uv pip install -e .
# GUI 额外依赖
uv pip install PyQt6| 包 | 用途 |
|---|---|
requests |
HTTP 请求,与讲座系统通信 |
ddddocr |
验证码自动识别(OCR) |
pillow |
图像处理 |
pycryptodome |
登录密码加密 |
rich |
命令行彩色输出与进度条 |
PyQt6 |
GUI 图形界面(可选) |
flask + flask-cors |
OCR API 服务(油猴脚本使用) |
Q:登录提示「非可信设备」怎么办?
A:GUI 和命令行版本均支持手机验证码二次验证,按提示输入短信验证码即可。
Q:验证码识别失败率高?
A:项目内置了 captcha_hash_table.csv 哈希对照表可加速常见验证码识别。若识别率仍低,可尝试更换或微调 model.onnx 模型。
Q:抢课成功但系统没显示?
A:工具通过查询「已预约列表」进行二次确认,避免误判。服务器响应有时存在延迟,工具会自动持续确认。
Q:提示「请求过于频繁」?
A:工具检测到该提示后会自动等待 10 秒再重试。
Q:油猴脚本无法识别验证码?
A:确保 ddddocr_api.py 已在本地运行,且控制面板中的 OCR API 地址填写正确。
2026/04/17 — v2.8(油猴脚本 + CLI)
- 将 v3.1 GUI 版本的 brotli 修复同步到油猴脚本和 CLI:移除
Accept-Encoding: br,增加容错 JSON 解析(自动跳过响应前导乱码字节) - 油猴脚本 v2.8 新增
parseJSONSafe()函数,覆盖fetchLecture、getLectureList、appiontCheck、queryMyActivityList、keepAlive五个接口 - CLI
main.py新增_parse_json()工具函数,覆盖fetch_lecture、check_booking_success、get_lecture_list、get_code四个函数
2026/04/16 — v3.1(GUI 稳定性修复)
- 修复服务器高负载下 JSON 解析失败的根因:移除
Accept-Encoding: br(项目未安装 brotli 库,服务器返回 brotli 压缩数据导致解压失败,JSON 前出现压缩残留字节) - 新增
_parse_json()容错解析:自动跳过响应前导乱码字节,找到首个 JSON 结构并解析 - 新增独立 session 隔离:已预约讲座刷新与抢课循环使用独立 HTTP session,互不干扰
- 新增验证码缓存:5 秒内复用上次验证码识别结果,减少重复 OCR 请求
- 新增文件日志:
logs/bookings_refresh.log(512KB 自动轮转),记录请求详情与响应诊断信息 - 修复登录后 session 类型错误(tuple 未解包)导致
post()调用失败 - 修复服务器繁忙时已预约列表被意外清空的问题
- 修复验证码接口返回空响应时未做异常处理的问题
2026/04/07
- 完善文档:新增校外环境推荐说明(油猴脚本免 VPN)
- 新增三种方式的编译发布包,开箱即用
2026/04/06 — v2.7(油猴脚本)
- 油猴脚本升级至 v2.7:新增
queryMyActivityList()多页查询,预约成功判断与 Python 版本逻辑保持一致 - 验证码错误后增加随机延迟(0.1 ~ 0.5 秒)
- 暴露
seu_queryMyActivityList到全局,方便调试
2026/04/01(GUI 版本)
- 新增 PyQt6 GUI 版本(
gui/app.py),支持多账号管理、已预约讲座卡片展示 - 抢课成功判断改为通过「已预约列表」二次确认,不再依赖服务器返回值
- 支持每 5 次尝试或服务器返回成功时主动查询确认
2025/12/23
- 油猴脚本:增加验证码识别后的持续自动点击功能(
auto_click.js)
2025/12/11
- 即便服务器返回 HTML 页面,也强制继续尝试抢课
2025/11/04
- 新增
auto_click.js:纯模拟点击版本,适合绕过请求拦截
2025/10/27
- 修正因错误伪造 Header 导致的无法获取讲座列表问题
- 优化抢课脚本的稳定性和反检测机制
- 时间改为本地时间
2025/10/16
- 新增会话保活逻辑,每 60 秒自动维持登录态
- 添加 CORS 支持并重构油猴脚本请求流程
- 新增 TLS 适配器及独立的
ddddocr_api.pyOCR 服务
2025/10/15
- 禁用 SSL 证书验证,修复校园网证书问题
- 修复非可信设备登录流程
2025/10/09 ~ 10/13
- 支持自定义 ONNX 模型识别验证码(
model.onnx+charsets.json) - 添加 PyInstaller 打包配置(
.spec文件) - 添加 MIT License
2025/10/08 ~ 10/09
- 支持非可信设备手机验证码二次认证
- 添加浏览器指纹生成功能,提升登录稳定性
2025/05/21
- 修复自动获取服务器时间时时区未修正的 Bug
2025/04/25 ~ 04/29
- 使用
rich美化命令行输出,新增彩色进度条 - 解决 SSL 证书问题
- 优化验证码识别流程
2024/12/29(@Golevka2001 贡献)
- 引入训练好的 ONNX 模型与哈希对照表,大幅提升验证码识别准确率
2024/10/24(@Golevka2001 贡献)
- 修复
http→https请求问题 - 更新接口适配新版系统 API
2023/11/07(@Golevka2001 贡献)
- 修复讲座信息获取及登录样式问题
- 修正依赖版本,移除冗余脚本
- 修复 POST 请求
Content-Type错误(Issue #8) - 修复
ddddocr与pillow的版本冲突
2023/11/06(@DgntYang 贡献)
- 添加 Cookie 使用示意图
- 修改加密方式,添加捡漏功能
2022/10/18(@GeeeekExplorer 贡献)
- 修复验证码错误和人数已满的相关处理逻辑
2022/04/23
- 更新验证码识别支持,取消多线程改为单线程稳定版
2021/11/25
- 项目初始化:支持讲座列表查询、自动预约、配置文件保存
感谢以下项目与贡献者的帮助: