QFNU 抢课脚本 | 曲阜师范大学抢课脚本 | 强智教务抢课脚本 | 强智教务 2017 | 大学抢课脚本 | 学院抢课脚本 | 光速抢课 | 毫秒级抢课
- 🚀 通过发送请求包的方式选课,不依赖浏览器页面渲染,速度快的起飞
- 🎯 支持多种选课功能(选修选课、专业内跨年级选课、本学期计划选课、公选课选课、计划外选课)
- 📱 支持多种通知方式(钉钉、飞书)
- 🔄 支持多种选课模式(高速模式、普通模式、截胡模式)
- 👥 支持多账号执行(批量启动)
- 📚 支持多课程执行(courses 数组)
- 💻 支持多系统执行(Windows、Linux、MacOS)
- ⏰ 支持多种节次配置
- 📅 支持多种周次配置
- ✅ 支持选课成功自动退出
- 🔄 支持选课失败自动重试
- 🛠️ 支持环境部署脚本化,就算是傻瓜也可以一键部署~
- ⚡ 已实现抢课 0 耗时
⚠️ 使用本脚本前请仔细阅读以下声明
-
本脚本仅供学习和研究目的,用于了解网络编程和自动化技术的实现原理。
-
使用本脚本可能违反学校相关规定。使用者应自行承担因使用本脚本而产生的一切后果,包括但不限于:
- 账号被封禁
- 选课资格被取消
- 受到学校纪律处分
- 其他可能产生的不良影响
-
严禁将本脚本用于:
- 商业用途
- 干扰教务系统正常运行
- 影响其他同学正常选课
- 其他任何非法或不当用途
-
下载本脚本即视为您已完全理解并同意本免责声明。请在下载后 24 小时内删除。
-
开发者对使用本脚本造成的任何直接或间接损失和后果不承担任何责任。
- Python 3.12.3(其他版本未测试,最高版本支持 3.12)
- pip 包管理器
- 支持 Windows/Linux/MacOS
git clone [email protected]:W1ndys/QFNUCourseSelector.git
直接下载 zip 包也可以,但是需要把 bat 文件的行位序列改成 CRLF,否则会报错
Windows 用户双击 create_venv_windows.bat
并等待安装完成
Linux 用户执行 bash create_venv_linux.sh
安装依赖
Windows 用户双击 run_app_in_venv_windows.bat
,系统将自动生成配置文件 config.json
Linux 用户执行 bash run_app_in_venv_linux.sh
,系统将自动生成配置文件 config.json
config.json
配置示例:
{
"user_account": "你的学号", // 必填
"user_password": "你的密码", // 必填
"select_semester": "你的选课学期,例如:2024-2025-2学期2021级选课", // 选填
"dingtalk_webhook": "你的钉钉机器人webhook", // 选填
"dingtalk_secret": "你的钉钉机器人secret", // 选填
"feishu_webhook": "你的飞书机器人webhook", // 选填
"feishu_secret": "你的飞书机器人secret", // 选填
"mode": "选课模式", // 选课模式,fast: 高速模式,normal: 普通模式,snipe: 截胡模式
"course": [
{
"course_id_or_name": "课程id", // 必填
"teacher_name": "教师名称", // 必填
"week_day": "上课星期", // 选填(1-7)
"weeks": "上课周次", // 选填,支持多种格式,例如:"1-12"、"1-12,13-14"、"1,3,5,7,9,11,13,15,17"
"class_period": "上课节次", // 选填
"jx02id": "jx02id", // 选填
"jx0404id": "jx0404id" // 选填
}
//...
// 可以添加多个课程,脚本执行的时候从第一个开始依次执行
]
}
模式 | 值 | 说明 |
---|---|---|
高速模式 | fast | 以最快速度持续尝试选课,适用于系统即将开放选课时抢课,抢课耗时几乎为 0 |
普通模式 | normal | 每 5 秒一次选课,适用于害怕高速抢课被 ban 的用户 |
截胡模式 | snipe | 每 2 秒一次持续选课,适用于截胡别人的退课或退课和选课的临界时间 |
如果不填填错,脚本会默认使用高速模式
字段 | 说明 | 是否必填 | 示例 |
---|---|---|---|
course_id_or_name | 课程编号或名称(推荐使用编号) | ✅ | g20062389 |
teacher_name | 教师姓名 | ✅ | 张三 |
week_day | 上课星期 | ⭕ | 1-7 之间的数字 |
weeks | 上课周次 | ⭕ | "1-12"、"1-12,13-14"、"1,3,5,7,9,11,13,15,17" |
class_period | 上课节次 | ⭕ | 1-2,1-3,1-4,9-10,9-11 |
jx02id | 公选课 jx02id | ⭕ | - |
jx0404id | 公选课 jx0404id | ⭕ | - |
Warning
你的配置一定是下面两种情况之一:
-
你已经手动获取了 jx02id 和 jx0404id,则只需要填写
course_id_or_name
、teacher_name
、jx02id
、jx0404id
这四个字段,脚本会根据这四个字段直接选课 -
你未手动获取 jx02id 和 jx0404id,则需要填写
course_id_or_name
、teacher_name
、class_period
、week_day
、weeks
这五个字段,脚本会根据这五个字段搜索课程,并获取课程的jx02id
和jx0404id
course_id_or_name
、 teacher_name
是必填项,将用于获取课程的 jx02id 和 jx0404id
class_period
和 week_day
是选填项,如果你未填写 jx02id
和 jx0404id
,则需要填写这两个字段,脚本会根据这两个字段搜索课程,并获取课程的 jx02id
和 jx0404id
class_period
是上课节次,可以与教务系统对应,例如:1-2,1-3,1-4,9-10,9-11
此处配置旧版脚本强制要求为 1-2- 等固定格式,由于 2025 年 2 月 18 日晚上发现非正常发包,即直接发课程节次也可以正常搜索,所以 新版脚本 已支持直接发课程节次,遵循配置节次的范围为搜索结果的子集,例如搜 1-2,也可以搜到 1-3,1-4 的符合条件的课程
weeks
支持多种格式的周次配置:
- 连续周次:如 "1-12"、"1-18" 等
- 多个周次范围:如 "1-12,13-14"、"1-9,11-18" 等
- 不连续周次:如 "1,3,5,7,9,11,13,15,17"(单周)、"2,4,6,8,10,12,14,16,18"(双周)等
如果填写了 jx02id 和 jx0404id,则不需要填写 class_period
和 week_day
,脚本会根据这两个字段直接选课
Note
关于 jx02id 和 jx0404id 的 手动 获取方法,请参考 详细说明文档
jx02id 和 jx0404id 是教务系统中课程的唯一标识,在配置文件中选填,如果不填,脚本会根据 API 搜索自动获取,但是获取的准确性可能不如手动获取,可能会遇到获取失败的情况,并且抢课速度会慢 10-50ms
脚本运行过程中不要异地登录,否则会把脚本踢下线
Windows 用户双击 run_app_in_venv_windows.bat
运行脚本
Linux 用户执行 bash run_app_in_venv_linux.sh
运行脚本
flowchart TB
Start([开始]) --> LoadEnv[加载环境变量和配置]
LoadEnv --> Login{登录尝试}
Login -->|失败| RetryLogin[等待1秒后重试]
RetryLogin --> Login
Login -->|成功| GetSemester[获取选课轮次ID]
GetSemester -->|失败| RetryLogin
GetSemester -->|成功| CheckMode{检查选课模式}
CheckMode -->|Fast模式| FastMode[快速选课]
CheckMode -->|Normal模式| NormalMode[普通选课]
CheckMode -->|Snipe模式| SnipeMode[截胡模式]
subgraph FastMode[快速模式]
F1[遍历课程列表] --> F2{尝试选课}
F2 -->|成功| F3[更新课程状态]
F2 -->|失败| F1
F3 --> F4{所有课程已选?}
F4 -->|是| Exit
F4 -->|否| F1
end
subgraph NormalMode[普通模式]
N1[遍历课程列表] --> N2{尝试选课}
N2 -->|成功| N3[更新课程状态]
N2 -->|失败| N4[等待5秒]
N3 --> N5{所有课程已选?}
N4 --> N1
N5 -->|是| Exit
N5 -->|否| N1
end
subgraph SnipeMode[截胡模式]
S1[刷新选课轮次] --> S2[遍历课程列表]
S2 --> S3{尝试选课}
S3 -->|成功| S4[更新课程状态]
S3 -->|失败| S5[继续下一个课程]
S4 --> S6{所有课程已选?}
S5 --> S6
S6 -->|是| Exit
S6 -->|否| S7[等待2秒]
S7 --> S1
end
FastMode & NormalMode & SnipeMode --> Exit([结束])
subgraph CourseSelection[选课流程]
CS1[获取课程信息] --> CS2{检查jx02id和jx0404id}
CS2 -->|已配置| CS3[直接选课]
CS2 -->|未配置| CS4[搜索课程信息]
CS4 --> CS5[尝试不同选课接口]
CS5 --> CS6{选课结果}
CS6 -->|成功| CS7[发送成功通知]
CS6 -->|失败| CS8[发送失败通知]
end
-
初始化阶段
- 加载环境变量和配置文件
- 初始化日志系统
- 建立会话连接
-
登录阶段
- 获取验证码并识别
- 尝试登录,失败后重试
- 成功后获取选课轮次 ID
-
选课模式
- Fast 模式:以最快速度持续尝试选课
- Normal 模式:每次选课后等待 5 秒
- Snipe 模式:持续刷新选课轮次并尝试选课
-
选课流程
- 获取课程信息
- 检查是否已配置课程 ID
- 尝试不同类型的选课接口
- 发送选课结果通知
-
通知系统
- 支持钉钉通知
- 支持飞书通知
- 实时反馈选课状态
Linux 系统可以使用 crontab
命令,Windows 系统可以使用 任务计划程序
来实现,但不建议使用 Windows
Windows 性能好的情况下可以考虑使用命令行 Linux 虚拟机实现定时执行
Windows 可以使用 bat 脚本调用执行每个配置文件,Linux 可以使用 shell 脚本调用执行每个配置文件
TypeError:DdddOcr.__init__()got an unexpected keyword argument 'show_ad'
解决办法:#8
直接点题:QFNU(这里指曲阜师范大学校园 WiFi 校园网),比其他网络更容易访问教务系统
cmd 命令行输入 ping zhjw.qfnu.edu.cn
可以很明显的看到,QFNU 的网络环境比其他网络环境更容易访问教务系统
以上环境是在网络通畅的情况下测试,所以几十毫秒的差距对正常使用来说几乎无感,在网络拥堵的情况下差距将进一步扩大
但是当选课服务器接近崩溃的时候,两者的差距几乎可以忽略不计,就变成大家都进不去
特别感谢以下贡献者:
-
注:该项目为本项目的衍生版本,功能更新可能不及时,请自行验证代码可用性和安全性
本项目开发者未参与其项目开发,请以本项目功能更新为准
-
注:该项目是另一位开发者的版本,借鉴了本项目部分代码,与本项目无从属关系,本项目开发者未参与该项目的开发
本项目采用 GNU General Public License v3 (GPLv3)。
特别说明:
- 本项目仅供学习和研究使用
- 严禁用于商业用途
- 任何衍生项目必须使用相同许可证开源