Skip to content

zhjcreator/fetch_lecture

Repository files navigation

东南大学研究生素质讲座 · 抢课工具

自动化预约东南大学「人文与科学素养系列讲座」的工具,支持 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 图形界面(推荐)

环境准备

参考「环境安装」章节完成依赖安装,然后额外安装 GUI 依赖:

uv pip install PyQt6

启动

python gui/app.py

使用流程

第一步:登录

  • 已保存账号:从下拉框选择历史账号,点击「🔑 使用此账号登录」
  • 新账号登录:填写学号和密码,勾选「记住此账号」后点击「💾 登录并保存」
  • 账号信息保存在 accounts/ 目录下,每个账号独立文件,密码明文存储,请勿将该目录共享给他人

若当前设备为「非可信设备」,系统会自动弹出手机验证码输入框,填入收到的短信验证码即可继续。

第二步:选择讲座

登录成功后,左侧自动加载讲座列表:

  • 列表展示讲座名称、预约时间段、活动时间
  • 灰色行表示名额已满
  • 单击行首复选框选中目标讲座
  • 双击行或右键 → 「📋 查看详情」可查看完整讲座信息

点击「🔄 刷新列表」可手动刷新。

第三步:配置并开始抢课

在「🎮 抢课控制」区域:

参数 含义 建议值
提前登录(秒) 在预约开放前 N 秒重新登录以刷新 Session 10
延迟开始(秒) 到达开放时间后额外等待 N 秒再发请求(负数表示提前) 0.5

配置完成后点击「🚀 开始抢课」,日志区域实时显示进度。

  • 抢课成功后自动弹窗通知,右侧「✅ 已预约讲座」列表同步刷新
  • 点击「⏹ 停止」可随时中断

第四步:查看已预约讲座

界面右侧显示已预约讲座卡片列表,可配置自动刷新间隔(默认 30 秒)。
卡片左侧色条指示打卡状态:绿色 = 已打卡黄色 = 未打卡


方式二:命令行

启动

python main.py

使用流程

  1. 首次运行:提示输入学号和密码,自动生成 config.txt 保存凭据(后续运行直接读取)
  2. 选择讲座:显示讲座列表表格,输入序号选择目标讲座
  3. 配置参数:按提示输入「提前重新登录时间」和「倒计时延迟」
  4. 等待并抢课:进度条倒计时,到时自动开始循环抢课
  5. 确认成功:每 5 次尝试或服务器返回成功时,通过已预约列表二次确认

方式三:油猴脚本(校外推荐)

适用场景

无需 Python 环境,在浏览器中直接运行。校外无 VPN 也可直接使用,是校外同学的首选方案。
需要配合本地 OCR API 服务ddddocr_api)识别验证码;若不需要自动识别,也可手动输入。

第一步:启动本地 OCR 服务

# 安装依赖(仅首次)
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

第三步:安装脚本

  1. 点击浏览器右上角油猴图标 → 「添加新脚本」
  2. greasemonkey.js全部内容复制粘贴进编辑器
  3. Ctrl+S 保存,脚本即激活

第四步:使用

  1. 打开 研究生讲座预约系统 并登录
  2. 页面右上角出现脚本控制面板
  3. 在讲座列表中点击目标讲座旁的「立即抢课」按钮
  4. 实时日志显示抢课进度,成功后弹窗提示

控制面板说明:

功能 说明
OCR API 地址 默认 http://127.0.0.1:5000/predict_base64,可修改为远程地址
会话保活 启用后每 60 秒自动发送请求,防止登录失效
停止全部 终止所有正在进行的抢课任务

环境安装

系统要求

  • Python >= 3.11
  • 推荐使用 uv 作为包管理工具

安装 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() 函数,覆盖 fetchLecturegetLectureListappiontCheckqueryMyActivityListkeepAlive 五个接口
  • CLI main.py 新增 _parse_json() 工具函数,覆盖 fetch_lecturecheck_booking_successget_lecture_listget_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.py OCR 服务

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 贡献)

  • 修复 httphttps 请求问题
  • 更新接口适配新版系统 API

2023/11/07@Golevka2001 贡献)

  • 修复讲座信息获取及登录样式问题
  • 修正依赖版本,移除冗余脚本
  • 修复 POST 请求 Content-Type 错误(Issue #8)
  • 修复 ddddocrpillow 的版本冲突

2023/11/06@DgntYang 贡献)

  • 添加 Cookie 使用示意图
  • 修改加密方式,添加捡漏功能

2022/10/18@GeeeekExplorer 贡献)

  • 修复验证码错误和人数已满的相关处理逻辑

2022/04/23

  • 更新验证码识别支持,取消多线程改为单线程稳定版

2021/11/25

  • 项目初始化:支持讲座列表查询、自动预约、配置文件保存

致谢

感谢以下项目与贡献者的帮助:

About

东南大学人文与科学素养系列讲座抢课

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors