一个用于中国科学院大学(UCAS)的自动选课脚本,支持自动登录、课程监控、验证码识别和邮件通知功能。
无须手动输入验证码,可以自动识别验证码 基于 ddddocr
- 🔐 自动登录:支持自动登录 UCAS 选课系统,带重试机制(最多 10 次)
- 🔄 智能监控:实时监控课程是否有空位,每 1.5 秒自动刷新
- 🤖 验证码识别:使用 ddddocr 自动识别纯数字验证码,支持前导零,识别准确率高
- 🔁 自动重试:验证码识别失败或提交失败自动重试(最多 10 次提交尝试,每次最多 5 次识别尝试)
- 📧 邮件通知:选课成功或失败后自动发送邮件通知(支持 163 邮箱)
- 📝 详细日志:完整的执行日志,方便调试和查看进度
- 🛡️ 错误处理:完善的异常处理机制,自动保存 HTML 页面用于调试
- Python 3.7+
- Chrome 浏览器
- ChromeDriver(脚本会自动安装)
pip install -r requirements.txt -i https://pypi.douban.com/simple主要依赖包:
selenium- 浏览器自动化python-dotenv- 环境变量管理ddddocr- 验证码识别chromedriver-autoinstaller- 自动安装 ChromeDriver
在项目根目录创建 .env 文件,配置您的邮箱信息:
# Email configuration information
SMTP_SERVER=smtp.163.com
SMTP_PORT=465
SENDER_EMAIL=your_email@163.com
SENDER_PASSWORD=your_authorization_code
RECIPIENT_EMAIL=target_email@qq.com重要提示:
SENDER_PASSWORD是 163 邮箱的授权码,不是邮箱登录密码- 需要在 163 邮箱设置中开启 SMTP 服务并获取授权码
- 授权码获取方法:登录 163 邮箱 → 设置 → POP3/SMTP/IMAP → 开启服务 → 获取授权码
验证码识别使用 ddddocr 的默认模式,无需额外配置。如果需要使用自定义模型,请将模型文件放在 models/ 目录下。
python main.py --username your_email@mails.ucas.ac.cn --password your_password --courseID 180088071200MX037H| 参数 | 说明 | 是否必需 | 示例 |
|---|---|---|---|
--username |
UCAS 用户名(邮箱) | ✅ 必需 | zhangsan@mails.ucas.ac.cn |
--password |
UCAS 密码 | ✅ 必需 | your_password |
--courseID |
课程编码 | ✅ 必需 | 180088071200MX037H |
--noCaptcha |
无验证码模式(暂未使用) | ❌ 可选 | - |
python main.py \
--username aaa@mails.ucas.ac.cn \
--password "aaa" \
--courseID 180088071200MX037H注意:
- 不再需要
subjectID参数,脚本会直接通过课程编码查询 - 参数顺序可以任意调整
- 如果密码包含特殊字符,建议用引号括起来
1. 自动登录 UCAS 系统
├─ 最多尝试 10 次登录
└─ 自动检测登录状态
2. 点击"选课"链接进入选课系统
└─ 自动切换到新标签页
3. 点击"新增加本学期研究生课程"按钮
└─ 多种定位方式确保成功
4. 输入课程编码并查询
└─ 只查询一次,不重复输入
5. 循环监控课程是否有空位
├─ 每 1.5 秒刷新一次
└─ 发现空位立即选择
6. 自动识别验证码
├─ 使用 ddddocr 识别纯数字
├─ 支持前导零(如 07076)
└─ 识别失败自动刷新验证码
7. 提交选课申请
├─ 验证码错误自动重试
└─ 最多尝试 10 次提交
8. 发送邮件通知选课结果
└─ HTML 格式精美邮件
✅ 选课成功!
课程编码:180088071200MX037H
选课时间:2026-01-21 21:30:00
恭喜您成功抢到课程!
❌ 选课失败
课程编码:180088071200MX037H
时间:2026-01-21 21:30:00
选课未能成功,请手动检查。
如果脚本运行出错,会自动保存以下调试文件:
| 文件名 | 说明 |
|---|---|
debug_page.html |
点击"新增加本学期研究生课程"按钮失败时保存 |
debug_course_query.html |
查询课程失败时保存 |
debug_submit_error.html |
提交选课失败时保存 |
debug_ocr_failed.html |
验证码识别失败时保存 |
ocrCal.png |
最后一次识别的验证码图片 |
- 密码安全:不要将密码硬编码在脚本中,建议使用环境变量
- 授权码:邮箱配置中的
SENDER_PASSWORD必须是授权码,不是登录密码 - 刷新频率:当前设置为 1.5 秒刷新一次(
main.py第 288 行),可根据实际情况调整# 实际选课的时候这里要加强!!!缩短点 不然抢不过他们 sleep(1.5) # 可以调整为 0.5-1 秒
- 浏览器窗口:脚本执行完成后浏览器窗口会保持打开,方便查看结果
- 验证码识别:默认使用 ddddocr 识别纯数字验证码,识别准确率较高
- 网络环境:建议在校园网环境下运行,确保网络稳定
| 重试类型 | 最大次数 | 说明 |
|---|---|---|
| 登录重试 | 10 次 | 登录失败自动重试 |
| OCR 识别重试 | 5 次/提交 | 每次提交最多识别 5 次验证码 |
| 提交重试 | 10 次 | 验证码错误自动刷新页面重新提交 |
UCAS-Course-selection-script/
├── main.py # 主程序
├── utils.py # 工具函数
├── .env # 邮箱配置(需自行创建)
├── requirements.txt # 依赖列表
├── README.md # 项目说明
└── models/ # OCR 模型文件(可选)
├── charsets.json
└── ocr_1.0_299_3000_2023-06-07-12-34-41.onnx
编辑 main.py 第 288 行,缩短刷新间隔:
# 课程已满时的刷新间隔
sleep(1.5) # 可以改为 0.5-1 秒注意:间隔太短可能触发服务器限制,建议根据实际情况调整。
- 如果默认 OCR 识别效果不好,可以训练自定义模型
- 使用 dddd_trainer 训练
- 保存识别失败的验证码图片用于分析
- 确保网络环境稳定
- 建议在校园网环境下运行
- 避免使用 VPN 或代理
欢迎提交 Issue 和 Pull Request!
A:
- 检查用户名和密码是否正确
- 确保账号未被锁定
- 查看日志中的错误信息
A:
- ddddocr 对纯数字验证码识别率很高
- 查看保存的
ocrCal.png图片,确认是否是纯数字 - 检查验证码图片是否清晰
A:
- 检查
.env文件中的邮箱配置 - 确认使用的是授权码而不是登录密码
- 确保开启了 SMTP 服务
A:
- 可能是课程确实没有空位
- 脚本会持续监控直到有空位
- 可以缩短刷新间隔提高成功率
A:
- 检查 Chrome 浏览器是否正常启动
- 查看控制台日志输出
- 检查 ChromeDriver 是否安装成功
MIT License
免责声明: 本脚本仅供学习和研究使用,请遵守学校选课系统的使用规定。 禁止恶意抢课,使用本脚本造成的任何后果由使用者自行承担。
注意: 目前脚本已在非高峰时期测试通过,帮助大家捡漏有人退课的课程。 在高峰期间使用可能需要调整 sleep 时间等参数。 如有 bug,欢迎发起 issue。

