1. 简介
这是一款用于重庆工商大学教务系统的抢课/捡漏脚本,它操作简单且效率极高,能用于大部分使用强智教务系统的学校,目前已经在北京邮电大学、海南大学、成都理工大学等学校的教务系统上成功运行测试。
注意:由于系统版本的差异,部分使用强智教务系统的学校(如西京学院、石河子大学)不支持使用该脚本。
这款抢课/捡漏脚本能够帮助学生在选课期间迅速提交选课请求,大幅提升抢课成功率。该脚本主要适用于:
- 抢课:在选课高峰期时,迅速提交选课请求,提高抢课成功率。
- 捡漏:未在第一时间抢到课时,持续提交选课请求。
该脚本操作非常便捷,用户只需提前配置好需要抢的课程信息,在选课期间粘贴进浏览器控制台运行即可。
2. 课程信息填写
使用此脚本抢课非常简单,只需按照以下步骤配置并执行:
2.1 填写选课信息
在运行脚本之前,首先需要准备好要选择的课程信息:
- 有分组的课程(例如体育课):只填写分组名,而不是课程名称。确保分组名准确无误。
- 没有分组的课程:直接填写课程名称即可。
注意:
- 课程名称必须与教务系统上的名称完全一致,包括大小写。建议直接从系统中复制课程名称,但避免粘贴时带入空格,否则脚本将无法正常抢课。
- 提前准备:为了在抢课开始时快速启动,建议在选课预览阶段就填写好所有的配置信息。
2.2 设置抢课间隔
默认情况下,脚本的抢课间隔是500毫秒,但可以根据不同需求进行调整:
- 抢课时:可以适当缩短间隔(如调到300ms),以提高抢到课程的几率。
- 捡漏时:建议延长间隔,以防止过于频繁的请求导致被系统踢下线。
特别提示:
- 部分学校(例如海南大学)对请求频率非常敏感,如果间隔过短会触发系统防护机制,导致强制下线。在测试中,即使我们将抢课频率设置为10秒一次,仍然有被踢的风险。因此,建议在海南大学等类似学校的系统中,更多地用于捡漏而不是抢课。
2.3 公选课抢课
如果你想抢的是公共选修课(例如尔雅网络课等),务必打开脚本中的公选课开关,否则系统将无法识别到这类课程,抢课也就不会成功。

2.4 多课程抢课
默认情况下,脚本在成功抢到一门课后会自动停止运行,这是通过 showSuccessAlert
函数中的 stop()
实现的。如果你希望一次性抢多门课程,需要手动删除这个 stop()
,让脚本继续运行,直到所有课程抢完为止。
3. 如何运行脚本?
配置好抢课信息后,运行脚本也非常简单:
- 进入选课页面:打开教务系统的选课界面。
- 打开控制台:按下
F12
键,打开浏览器的开发者工具。
- 粘贴代码并运行:将脚本代码粘贴到控制台中,按下
Enter
键运行。
- 等待抢课成功:抢课成功后,系统给出提示,提醒你已经成功选到课程。
4. 常见问题与解决方案
在使用过程中,可能会遇到一些常见问题:
4.1 登录失效
如果脚本在运行时出现了 undefined
或者其他奇怪的错误信息,这很有可能是因为登录状态失效了。解决方案是降低抢课频率,重新登录系统后再尝试。
大部分学校不允许同一账号同一时间在多地登录选课系统,因此我们不建议在抢课/捡漏过程中在其他位置登录系统。
4.2 体育课抢课问题
抢体育课这类分组的课程时添加多个课程进抢课列表可能会导致同时抢到几个课程(如体育课只需要抢一科,但会抢到抢课列表中的多科),且退课时系统会退掉所有课程,存在一定风险,因此不建议抢课时加入多个同类课程
5. End
附上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| // 课程名称,体育课勿填 let COURSES = [ "美术鉴赏" ];
let COURSE_GROUPS = [ "羽毛球","健美操","散打" ];
let INTERVAL_MS = 500; //抢课间隔 默认500ms let ENABLE_GGXXK = false; //公选课开关
let mainInterval; let targetCourses = []; const start = () => { mainInterval = setInterval(handler, INTERVAL_MS); console.log("--- 开始抢课 ---"); };
const stop = () => { clearInterval(mainInterval); console.log("--- 停止抢课 ---"); };
const playSuccessSound = () => { let audio = new Audio('https://stackoverflow.vip/static/end.mp3'); audio.play(); };
const showSuccessAlert = (courseName) => { alert(`成功抢到课程:${courseName}`); console.log(`---抢课成功:${courseName}---`); };
const logFailedAttempt = (courseName, errorMessage) => { console.log(`抢课失败-课程:${courseName},原因:${errorMessage}`); };
const handler = () => { if (targetCourses.length === 0) { getCourses(); console.log(`--- 发现 ${targetCourses.length} 个课程 ---`); }
let paths = [ "/jsxsd/xsxkkc/xxxkOper", // 选修 "/jsxsd/xsxkkc/bxxkOper", // 必修 ]; if (ENABLE_GGXXK) { paths.push("/jsxsd/xsxkkc/ggxxkxkOper"); // 公选 }
for (let course of targetCourses) { for (let path of paths) { $.get(path, course, (response) => { response = JSON.parse(response) if (response && response.success) { playSuccessSound(); showSuccessAlert(course.kcmc); } else { logFailedAttempt(course.kcmc, response.message); } }); } } };
const getCourses = () => { let params = { sEcho: 1, iColumns: 11, iDisplayStart: 0, iDisplayLength: 999, }; let paths = [ "/jsxsd/xsxkkc/xsxkBxxk", // 必修 "/jsxsd/xsxkkc/xsxkXxxk", // 选修 ]; if (ENABLE_GGXXK) { paths.push("/jsxsd/xsxkkc/xsxkGgxxkxk"); // 公选 } for (let path of paths) { $.post(path, params, (data) => { let aaData = $.parseJSON(data).aaData; for (let course of aaData) { if (COURSES.includes(course.kcmc)) { targetCourses.push(course); } else if (COURSE_GROUPS.includes(course.fzmc)) { targetCourses.push(course); } } }); } };
start();
|
需要提醒的是,不同学校的教务系统版本和策略有所不同,建议先进行测试,再根据实际情况调整脚本的设置。
该脚本只用于学习交流,使用该脚本造成的一切后果本人概不负责!!!