曲阜师范大学 QFNU 抢课脚本 | 强智教务抢课脚本 | 强智教务 2017 | 大学抢课脚本 | 学院抢课脚本
本脚本以强智教务系统 2017 版本为基础,支持 2017 版本的所有功能,包括选修选课、专业内跨年级选课、本学期计划选课、公选课选课、计划外选课,其他版本未测试,但基本的请求 API 几乎类似,可以参考本脚本实现
- 🚀 通过发送请求包的方式选课,不依赖浏览器页面渲染,速度快的起飞
- 🎯 支持多种选课模块(选修选课、专业内跨年级选课、本学期计划选课、公选课选课、计划外选课)
- 📱 支持通知方式(飞书)
- 📚 支持多课程执行(courses 数组)
- ✅ 支持选课成功自动退出
- 🔄 支持选课失败智能重试或退出
- 📝 支持 loguru 日志记录
- ⚡ 提供快速启动脚本 quick_start.sh
- Python 3.12
- uv 虚拟环境
git clone git@github.com:W1ndys/QFNUCourseGrabberPy.gitcd QFNUCourseGrabberPy
uv v
uv sync在 Windows 系统中,可以通过以下一行命令安装 UV 虚拟环境管理器:
irm https://astral.sh/uv/install.ps1 | iex安装完成后,可以通过以下命令验证是否安装成功:
uv --version如果显示版本号(如“uv 0.7.12”),则说明安装成功。
uv run main.py💡 提示:建议使用 配置生成器 生成配置文件,简单快捷,不易出错!
- 浏览器打开项目目录下的
config_generator.html - 填写相关信息
- 点击“生成配置文件”并保存为
config.json
手动配置示例(config.json):
{
"user_account": "你的学号",
"user_password": "你的教务系统密码",
"feishu_webhook": "https://open.feishu.cn/open-apis/bot/v2/hook/xxx",
"target_round_keyword": "",
"courses": [
{
"course_name": "你的课程名称",
"course_id": "你的课程编号",
"teacher_name": "你的老师名称",
"jx02id": "",
"jx0404id": "",
"week_day": "3",
"class_period": "1-2",
"class_times": [
{
"week": "1",
"week_day": "3",
"class_period": "1"
},
{
"week": "1",
"week_day": "3",
"class_period": "2"
}
]
}
]
}本脚本支持两种选课模式,可根据实际情况选择:
- 直接填写
jx02id和jx0404id,脚本直接发送选课请求 - 速度最快,适合已知课程 ID 的情况
- 不填写
jx02id和jx0404id,改为填写搜索参数(week_day、class_period、class_times) - 脚本会先根据
week_day和class_period搜索课程,再通过class_times匹配具体课程 - 适合无法获取课程 ID 的情况
蹲课机制:
- 自动获取所有可用的选课轮次
- 支持选课轮次优先处理:如果配置了
target_round_keyword,则优先处理名称包含该关键词的轮次(例如配置为"2022级选课",则优先处理包含该文字的轮次),其他轮次排在后面处理。如果未配置,则按默认顺序处理所有轮次。 - 按照
config.json中配置的课程顺序,依次遍历每个选课轮次进行选课尝试 - 只有当前一个课程尝试完成后(无论成功还是失败),才会尝试下一个课程
- 一旦某课程在某轮次选课成功,则锁定该轮次,后续只在该轮次尝试
- 如果所有轮次全部失败,则从第一轮重新开始
- 每个课程之间随机间隔 0.3-0.7 秒
- 适用于补选中退选轮次的临界时间和正选中全天候蹲课
| 字段 | 说明 | 模式一(直接 ID) | 模式二(搜索) | 示例 |
|---|---|---|---|---|
| course_name | 课程名称(用于日志输出) | ✅ 必填 | ✅ 必填 | 高等数学 |
| course_id | 课程编号 | ✅ 必填 | ✅ 必填 | g20062389 |
| teacher_name | 教师姓名 | ✅ 必填 | ✅ 必填 | 张三 |
| target_round_keyword | 选课轮次关键词 | ❌ 选填 | ❌ 选填 | 2022级选课 |
| jx02id | 课程 jx02id | ✅ 必填 | ❌ 留空 | 详见下方 |
| jx0404id | 课程 jx0404id | ✅ 必填 | ❌ 留空 | 详见下方 |
| week_day | 星期几(1-7)(用于搜索) | ❌ 留空 | ✅ 必填 | 3 |
| class_period | 节次范围 (用于搜索) | ❌ 留空 | ✅ 必填 | 1-2, 3-4, 5-6 等 |
| class_times | 上课时间列表 (用于精确匹配) | ❌ 留空 | ✅ 必填 | [{"week": "1", "week_day": "3", "class_period": "1"}] |
class_times 结构说明: 是一个包含时间节点的列表,用于精确匹配课程。请注意,这里必须精确到具体的某一周、星期几和第几节课,而不是范围。 例如,如果一门课是 1-2 节,你需要分别填写第 1 节和第 2 节的配置。
每个节点包含:
week: 周次 (具体的某一周,如 "1")week_day: 星期几 (1-7,如 "3" 代表周三)class_period: 节次 (1-13,具体的某一节课,如 "1" 代表第1节)
节次范围(class_period)可选值: 1-2、3-4、5-6、7-8、9-11、12-13 (这是用于搜索的粗略范围)
Important
配置要求(二选一):
- 直接 ID 模式:填写
jx02id和jx0404id,其他搜索参数留空 - 搜索模式:
jx02id和jx0404id留空,填写week_day、class_period和class_times
两种模式不能混用,必须完整填写其中一种模式的所有必填字段。
Note
关于 jx02id 和 jx0404id 的获取方法:
jx02id 和 jx0404id 是教务系统中课程的唯一标识,必须借助高年级账号手动获取
请确保在配置文件中填写正确,不要填反了,否则无法正常选课。
如果无法获取这两个 ID,可以使用搜索模式,填写课程的上课时间信息让脚本自动查找。
脚本运行过程中不要异地登录,否则会把脚本踢下线
⚠️ 使用本脚本前请仔细阅读以下声明
-
本脚本初衷是为了告别卡顿页面,还学生一个流畅的选课体验,
-
本脚本仅供学习和研究目的,用于了解网络编程和自动化技术的实现原理,禁止用于真实的选课环境。
-
使用本脚本可能违反学校相关规定。使用者应自行承担因使用本脚本而产生的一切后果,包括但不限于:
- 账号被封禁
- 选课资格被取消
- 受到学校纪律处分
- 其他可能产生的不良影响
-
严禁将本脚本用于:
- 商业用途
- 干扰教务系统正常运行
- 影响其他同学正常选课
- 其他任何非法或不当用途
-
下载本脚本即视为您已完全理解并同意本免责声明。请在下载后 24 小时内删除。
-
开发者对使用本脚本造成的任何直接或间接损失和后果不承担任何责任。
TypeError:DdddOcr.__init__()got an unexpected keyword argument 'show_ad'解决办法:#8
特别感谢以下贡献者:
- nakaii - 技术指导
- 上杉九月 - 技术指导
- AuroBreeze - 登录算法优化
- 超级大猫猫头头 - 测试支持
-
注:该项目是另一位开发者的版本,借鉴了本项目部分代码,与本项目无从属关系,本项目开发者未参与该项目的开发
本项目采用 GNU General Public License v3 (GPLv3)。
特别说明:
- 本项目仅供学习和研究使用
- 严禁用于商业用途
- 任何衍生项目必须使用相同许可证开源

