一个功能强大的教务系统自动抢课脚本,支持多课程并发抢课、时间教师过滤、定时开抢等高级功能,配备美观的图形化操作界面。
- 多课程并发抢课 - 同时监控和抢多门课程
- 优先级控制 - 为不同课程设置优先级(数字越小优先级越高)
- 智能教学班识别 - 自动识别同一课程的多个教学班
- 时间冲突处理 - 时间冲突时自动尝试其他教学班
- 独立状态跟踪 - 每门课程独立跟踪选课状态
-
时间过滤器 —— 仅选择符合时间条件的教学班
- 支持星期过滤:
星期一、星期三 - 支持节次过滤:
第1-2节、第11-12节 - 支持周数过滤:
1-8周、单周
- 支持星期过滤:
-
教师过滤器 —— 仅选择符合教师条件的课程
- 支持教师姓名过滤:
张三 - 支持职称过滤:
讲师、教授
- 支持教师姓名过滤:
-
全局 / 课程级过滤器 ——
支持设置全局过滤规则,或为单门课程单独配置过滤条件,满足不同选课策略需求。
在选课过程中,页面需要完整展示课程的时间、教师等详细信息,因此过滤逻辑仅在课程信息卡片处于展开状态时才会生效。
但由于正方选课系统在使用 jQuery 刷新列表时会重建 DOM 树,已展开的课程卡片会被自动折叠。为此,本脚本在页面刷新后主动触发点击事件,自动展开目标课程卡片。
需要注意的是,展开课程信息会带来一定的性能开销,可能对抢课请求的响应时延产生影响。因此,在以下场景下,脚本会自动将 CLICK2EXPEND_ENABLED 设置为 false,以避免不必要的展开操作:
-
页面中仅存在一门课程,且该课程为目标课程
(正方选课系统在刷新后会自动展开列表中的第一门课程,无需额外处理) -
未启用时间过滤或教师过滤
(在无过滤目标的情况下,即使调用展开逻辑也会立即结束,但该过程仍可能引入微小延迟,从而影响抢课请求的发送频率)
- 情境:如果你 pre 课A 但是又想有 课B 保底就想着能不能骑驴找马,在 课A 有空的时候把 课B 退了之后再去抢
- 实现:这就是换课功能存在的意义,当你输入目标课程的时候下方有一个可选字段 “替换课程” ,那么就会帮你自动监听并实现上面的功能
⚠️ 注意:由于抢 课A 前需要先把 课B 退了,所以有 课B 退了之后 课A 没空位的风险,一般是对方和你一样用了本脚本
- 定时开抢 - 设置精确的开抢时间
- 倒计时显示 - 实时显示距离开抢时间的倒计时
- 自动启动 - 到达设定时间自动开始抢课
- 现代化UI设计 - 渐变色主题,美观大方
- 可拖拽面板 - 可移动到屏幕任意位置
- 实时日志 - 彩色日志实时显示运行状态
- 一键操作 - 所有功能都可通过界面操作
- 最小化功能 - 不占用屏幕空间
-
登录教务系统
- 打开浏览器,登录到学校教务系统
- 进入选课页面
-
打开浏览器控制台
- Windows/Linux: 按
F12或Ctrl + Shift + I - macOS: 按
Command + Option + I
- Windows/Linux: 按
-
加载脚本
- 复制
courseGrabber.js的全部内容 - 粘贴到控制台,按回车运行
- 复制
-
使用界面
- 脚本运行后会在页面右上角显示操作面板
- 如果界面被关闭,在控制台输入
showGrabberUI()重新显示
- 创建新书签,将以下代码作为书签地址:
javascript:(function(){var script=document.createElement('script');script.src='你的脚本URL';document.body.appendChild(script);})();- 在选课页面点击书签即可加载脚本
方式一:使用UI界面(推荐)
- 在"📚 添加课程"区域输入课程号
- 设置优先级(数字越小优先级越高)
- 可选:设置时间过滤器(如:
星期一,第1-2节) - 可选:设置教师过滤器(如:
叶利群,讲师) - 点击"➕ 添加课程"按钮
方式二:修改代码配置
在脚本顶部修改 TARGET_COURSES 数组:
const TARGET_COURSES = [
{
code: '23286514',
priority: 1
},
{
code: '23306047',
priority: 2,
timeFilter: ['星期一', '第1-2节'],
teacherFilter: ['叶利群', '讲师']
},
];时间过滤器示例:
timeFilter: ['星期一', '星期三'] // 只选星期一或星期三的课
timeFilter: ['第1-2节', '第3-4节'] // 只选1-2节或3-4节的课
timeFilter: ['1-8周'] // 只选1-8周的课教师过滤器示例:
teacherFilter: ['叶利群'] // 只选叶利群老师的课
teacherFilter: ['讲师', '教授'] // 只选讲师或教授的课
teacherFilter: ['张三', '李四'] // 只选张三或李四老师的课编辑已添加课程的过滤器:
- 点击课程列表中的 ✏️ 按钮
- 在弹出框中输入新的过滤条件
立即开始:
- 点击"🚀 开始抢课"按钮
定时开抢:
- 在"⏰ 定时开抢"区域选择开抢时间
- 点击"⏰ 设置"按钮
- 等待倒计时结束,自动开始抢课
- 可点击"❌ 取消"按钮取消定时
命令行方式:
// 立即开始
grab.start()
// 定时开抢
grab.schedule('2025-12-19 14:00:00')
// 取消定时
grab.cancelSchedule()
// 停止抢课
grab.stop()
// 查看状态
grab.status()
// 调试信息
grab.debug()实时监控:
- 界面顶部显示运行状态、尝试次数、成功课程数
- 日志区域实时显示详细运行信息
状态说明:
- 🎯 发现有余量 - 找到有空位的教学班
- ⏭️ 跳过教学班 - 不满足过滤条件
- 🛑 时间冲突 - 与已选课程时间冲突
- 🎊 选课成功 - 成功选上课程
⚠️ 选课失败 - 选课请求失败
在脚本顶部可修改以下参数:
const CHECK_INTERVAL = 2000; // 检查间隔(毫秒),默认2秒
const MAX_ATTEMPTS = 1000; // 最大尝试次数
const MAX_FAILED_ATTEMPTS = 10; // 最大连续失败次数
const CONCURRENT_ENABLED = true; // 是否启用并发抢课
const GLOBAL_TIME_FILTER = []; // 全局时间过滤器
const GLOBAL_TEACHER_FILTER = []; // 全局教师过滤器启用并发模式 (CONCURRENT_ENABLED = true):
- 同时尝试所有课程
- 效率更高,适合多门课程
- 按优先级排序,高优先级优先处理
禁用并发模式 (CONCURRENT_ENABLED = false):
- 按优先级依次尝试
- 更加稳定,适合网络不稳定情况
// 课程管理
grab.addCourse('23286514', 1) // 添加课程
grab.removeCourse('23286514') // 移除课程
// 状态查询
grab.status() // 查看详细状态
grab.debug() // 调试所有课程
grab.debug('23286514') // 调试指定课程
// 定时功能
grab.schedule('2025-12-19 14:00:00') // 定时开抢
grab.cancelSchedule() // 取消定时
// 配置管理
grab.config.getCourses() // 获取课程列表
grab.config.showFilters() // 查看过滤器配置
grab.config.getInterval() // 获取检查间隔
grab.config.getConcurrentMode() // 获取并发模式状态- 必须点击"点此查看更多" - DOM树必须完全展开,否则无法找到教学班
- 保持页面打开 - 脚本运行期间不要关闭或刷新页面
- 网络稳定 - 确保网络连接稳定
- 提前测试 - 建议在正式选课前测试脚本功能
- 遵守规则 - 合理使用,不要设置过短的检查间隔
- 优先级设置 - 为最想选的课程设置最小的优先级数字
- 过滤器组合 - 可以同时使用时间和教师过滤器
- 多个关键词 - 过滤器支持多个关键词,满足任意一个即可
- 定时抢课 - 精确选课时间可使用定时功能
- 实时调整 - 运行中可以添加或删除课程
Q: 脚本运行后找不到教学班? A: 请确保点击了"点此查看更多"按钮,将所有教学班展开。
Q: 提示时间冲突怎么办? A: 脚本会自动尝试其他教学班,如果所有教学班都冲突会自动停止。
Q: 如何调整检查速度?
A: 修改 CHECK_INTERVAL 参数,但不建议设置太小以免给服务器造成压力。
Q: 界面不见了怎么办?
A: 在控制台输入 showGrabberUI() 即可重新显示。
Q: 如何同时抢多个时间段的课? A: 不设置时间过滤器,或在时间过滤器中添加多个时间段。
Auto_courseGrabber/
├── courseGrabber.js # 主脚本文件
├── README.md # 说明文档
└── web结构/ # 网页结构参考
├── 自主选课.html
├── DOM.html
└── 自主选课_files/
├── zzxkYzb.js
├── index.js
└── ...
- 原生 JavaScript (ES6+)
- DOM API
- 异步编程 (Promise, async/await)
- CSS3 动画效果
欢迎提交 Issue 和 Pull Request!
- Fork 本项目
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
- ✨ 添加图形化UI界面
- 🎯 支持多课程并发抢课
- 🔍 添加时间和教师过滤器
- ⏰ 添加定时开抢功能
- 📊 实时状态监控和日志显示
- ✏️ 支持编辑课程过滤器
- 🚀 基础抢课功能
- 📚 单课程支持
- 🔄 自动重试机制
ceilf
- 学校: 中欧 信息工程
- GitHub: @ceilf6
- CSDN: 2301_78856868
- Email: 3506456886@qq.com
本项目采用 MIT 许可证 - 详见 LICENSE 文件
- 感谢所有使用和反馈的同学
- 感谢开源社区的支持
本脚本仅供学习交流使用,使用者需遵守学校相关规定。因使用本脚本产生的任何问题,作者不承担任何责任。请合理使用,不要给服务器造成过大压力。
如果这个项目对你有帮助,欢迎 ⭐ Star 支持!
祝你抢课成功!🎉