一个用户友好型的油猴(Tampermonkey)抢课脚本。
-
本仓库(Repository)及所有相关内容(包括但不限于代码、文档、示例等) 仅用于技术交流与学习目的 ,严禁将其用于任何商业、非法或其他未经授权的用途。 任何因使用本项目内容而产生的直接或间接后果,均由使用者自行承担全部责任 。
-
使用者在下载、复制、修改、传播或使用本项目的任何内容时, 必须确保其行为完全符合其所在地(包括国家、地区)的法律、法规及监管政策 。使用者应对其自身行为及其产生的一切后果独立承担全部法律责任。
-
如果您是权利人,认为本仓库内容侵犯了您的合法权益(包括但不限于著作权、专利权),请立即联系项目所有者处理。
-
依据相关法律法规的要求,任何个人或组织通过任何渠道获取本项目内容后, 应在24小时内彻底删除所有相关文件、副本及衍生内容 。若因未能及时履行删除义务而引发的任何法律风险与责任,本项目所有者概不承担。
-
在法律允许的最大范围内, 本项目所有者(包括贡献者)不对因使用或无法使用本项目内容而导致的任何索赔、损害或任何其他责任(包括间接的、附带的、特殊的、后果性的损害)承担责任 。
-
使用者是自身行为的唯一责任主体。任何通过使用本项目内容(无论直接或间接)所产生的一切法律、纪律及道德后果,均由使用者独立承担。
-
项目所有者保留随时修改、暂停或终止更新本项目的权利,且无需另行通知。
| 模型ID | 名称 |
|---|---|
| CQUPT | |
| cqupt:tyfxnewstuxk | 新生体育分项选课 |
| TODO... |
-
在浏览器安装油猴(Tampermonkey,中文官方译名:篡改猴),具体方法自行百度
-
从Release下载,或构建产物中的
dist目录找到snatcher.user.js -
在油猴中新建用户脚本,然后把
snatcher.user.js的内容粘贴进去。 -
登录你的选课系统,刷新选课页面,在右下角看见一个弩的按钮时,就安装成功了。
-
在选课系统的界面上选好你要的课,然后直接开抢!
注意:在抢课运行过程中不可以更换选课,请暂停选课后重新选择并开始抢课。
你只需要一个js runtime就可以了。本项目开发时是使用bun,理论上node.js也可以使用,但如果你发现无法编译,请使用bun。
bun i # 安装依赖
bun run build # 构建构建产物在./dist
所有模型存储在 ./src/model/models/,模型结构体定义在 ./src/model/model.ts,定义如下:
interface Model {
id: string, // 模型ID(使用命名空间命名法,例如cqupt:model1)
name: string, // 模型名称
match: RegExp[], // 匹配的URL(只要其一匹配就可以,关系是||)
oncheck: () => boolean, // 检查环境方法,返回环境检查结果
onload: () => void, // 加载时方法,不返回数据
onpin: () => any, // 固定数据,返回固定好的数据,会将数据传给oncall用于抢课
/* 抢课方法
* data是固定好的数据,因此无需在方法内调用DOM来获得数据
* 注意只负责一次抢课,重复抢课由外部控制,返回[bool,string],bool为true时则视为抢课成功,
* 会结束抢课进程,因此在不成功时只应当返回false。string是本次抢课服务器返回的数据或信息。
*/
oncall: (data: any) => Promise<[boolean, string]> // 抢课方法
}可参考./src/model/models/cqupt/tyfxnewstuxk.ts的实现,这是我们的第一个模型。
当贡献模型时,请完成以下三个步骤:
- 编写好
./src/model/models/{school}/{id}.ts模型。 - 在
./src/model/models/model.ts的_models_list中添加你的模型,例如
import cqupt_model1 from "./models/cqupt/model1"; // 请在命名时使用model id(仅把:换为_)以避免命名冲突
// 模型列表
export const _models_list: Model[] = [
// ...其他模型
// CQUPT
// 在你学校ID的注释下添加模型
cqupt_model1,
// ...其他模型
]- 在
./vite.config.ts的plugin.monkey.userscript.match添加你的模型识别的URL(使用Tampermonkey匹配语法,而不是正则表达式),例如
export default defineConfig({
plugins: [
// ...其他配置
monkey({
userscript: {
match: [
// CQUPT
// 在学校ID下添加你的匹配,并在后面注释模型名称
'*://jwzx.cqupt.edu.cn/xk/tyfxnewstuxk.php' // 新生体育分项选课
],
},
}),
],
});使用Tampermonkey把脚本注入到特定页面,在该页面的JS上下文中直接发起抢课请求,可以避免Cookie、加密、登录等问题,因为脚本执行的环境就是用户操作的环境。
你看看你邮的新版jwzx加密都加成什么样子了
仅仅是为了学习一下如何编写油猴脚本
- 支持更多模型
- 整个调试模式(查看模型运行情况等)
- 支持自定义传入数据抢课
- 支持远程RPC调用
- 让弹窗提示更人性化(
或许能整个有梗体中文的i18n?) -
多写点注释(再说吧,有点懒) - 整个Playwright版本和浏览器插件版本?(用来在命令行环境下使用,并解决登录过期问题)
直接提,欢迎提