基于 Python FastAPI + Vue 3 的网页版正方教务系统自动抢课工具。
- 教务登录:RSA 加密 + ddddocr 验证码自动识别,失败自动降级手动输入
- 课程浏览:登录后自动拉取可选课程列表,支持分页和关键词搜索
- 一键添加:点击课程行末的"+ 抢"按钮,自动获取教学班详情并加入抢课队列
- 优先级排序:↑↓ 按钮调整抢课顺序,高优先级优先抢
- 并发抢课:可调节并发数(1-5),遍历教学班 + 指数退避重试
- 定时开抢:设置精确时间,到点自动触发
- 换课监控:抢到低优课自动监控高优课名额,发现空余名额自动换课
- 实时日志:WebSocket 推送,终端风格显示抢课过程和结果
- 数据持久化:SQLite 保存抢课目标和历史日志
双击 start.bat
# 后端
cd backend
pip install -r requirements.txt
python main.py
# 前端 (另开终端)
cd frontend
npm install
npm run dev # 开发模式
npm run build # 生产构建打开浏览器访问 http://localhost:8420
| 层 | 技术 |
|---|---|
| 后端 | Python 3.9+, FastAPI, httpx, APScheduler, aiosqlite, ddddocr |
| 前端 | Vue 3 (Composition API), Pinia, Tailwind CSS 4, Vite |
| 通信 | REST API + WebSocket |
| 存储 | SQLite (aiosqlite) |
GMU_AutoSelect/
├── start.bat # Windows 一键启动脚本
├── backend/
│ ├── main.py # FastAPI 入口 + WebSocket
│ ├── requirements.txt
│ └── app/
│ ├── api/
│ │ ├── auth.py # 登录/验证码/Session
│ │ ├── courses.py # 课程搜索/教学班查询
│ │ ├── engine.py # 抢课调度 REST API
│ │ └── tasks.py # 抢课目标 CRUD
│ ├── core/
│ │ ├── config.py # 配置文件
│ │ └── database.py # SQLite 初始化
│ ├── models/
│ │ └── schemas.py # Pydantic 数据模型
│ └── services/
│ ├── zf_client.py # 正方教务系统 API 异步封装
│ ├── grab_engine.py# 抢课引擎 + WebSocket 广播
│ └── scheduler.py # 定时任务调度
└── frontend/
├── index.html
└── src/
├── App.vue # 主布局
├── main.ts # 入口
├── assets/main.css # 全局样式
├── stores/main.ts # Pinia 状态管理
├── composables/
│ └── useWS.ts # WebSocket 封装
└── components/
├── Toolbar.vue # 顶部工具栏 (登录 + 操作)
├── CourseTable.vue # 可选课程表格
├── TargetTable.vue # 抢课目标表格
└── LogPanel.vue # 实时日志面板
- 双击
start.bat启动服务 - 浏览器打开
http://localhost:8420 - 在顶部工具栏输入学号和密码,点击登录
- 验证码自动识别,确认后完成登录
- 课程表格自动加载可选课程,支持搜索和翻页
- 点击课程行末的"+ 抢"添加抢课目标
- 在下方目标表格中用 ↑↓ 调整优先级
- 设置并发数(可选)和定时开抢时间(可选)
- 点击"开始抢课",实时日志显示抢课进度
- 抢到课后可开启"换课监控"自动换高优课
GMU 教学管理系统是正方教务系统(新版),登录流程如下:
- GET 登录页面 → 获取 csrf_token
- GET 公钥接口 → 获取 RSA modulus/exponent
- GET 验证码图片 → ddddocr 识别
- RSA 加密密码 → POST 登录请求
选课搜索需要额外的 xkkz_xh 参数(页面隐藏字段 firstXkkzXh),已自动处理。
- 仅支持广州航海学院教务系统 (jwx.gzmtu.edu.cn)
- 选课需在教务系统开放期间使用
- 建议并发数不超过 3,避免被封
- 密码仅在内存中使用,不会写入磁盘
- 本工具仅供学习交流使用
MIT