Skip to content

Repository files navigation

Snatcher

一个用户友好型的油猴(Tampermonkey)抢课脚本。

声明

  • 本仓库(Repository)及所有相关内容(包括但不限于代码、文档、示例等) 仅用于技术交流与学习目的 ,严禁将其用于任何商业、非法或其他未经授权的用途。 任何因使用本项目内容而产生的直接或间接后果,均由使用者自行承担全部责任

  • 使用者在下载、复制、修改、传播或使用本项目的任何内容时, 必须确保其行为完全符合其所在地(包括国家、地区)的法律、法规及监管政策 。使用者应对其自身行为及其产生的一切后果独立承担全部法律责任。

  • 如果您是权利人,认为本仓库内容侵犯了您的合法权益(包括但不限于著作权、专利权),请立即联系项目所有者处理。

  • 依据相关法律法规的要求,任何个人或组织通过任何渠道获取本项目内容后, 应在24小时内彻底删除所有相关文件、副本及衍生内容 。若因未能及时履行删除义务而引发的任何法律风险与责任,本项目所有者概不承担。

  • 在法律允许的最大范围内, 本项目所有者(包括贡献者)不对因使用或无法使用本项目内容而导致的任何索赔、损害或任何其他责任(包括间接的、附带的、特殊的、后果性的损害)承担责任

  • 使用者是自身行为的唯一责任主体。任何通过使用本项目内容(无论直接或间接)所产生的一切法律、纪律及道德后果,均由使用者独立承担

  • 项目所有者保留随时修改、暂停或终止更新本项目的权利,且无需另行通知。

支持模型

模型ID 名称
CQUPT
cqupt:tyfxnewstuxk 新生体育分项选课
TODO...

使用

  1. 在浏览器安装油猴Tampermonkey,中文官方译名:篡改猴),具体方法自行百度

  2. 从Release下载,或构建产物中的dist目录找到snatcher.user.js

  3. 油猴新建用户脚本,然后把snatcher.user.js的内容粘贴进去。

  4. 登录你的选课系统,刷新选课页面,在右下角看见一个的按钮时,就安装成功了。

  5. 在选课系统的界面上选好你要的课,然后直接开抢!

注意:在抢课运行过程中不可以更换选课,请暂停选课后重新选择并开始抢课。

构建

你只需要一个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的实现,这是我们的第一个模型。

当贡献模型时,请完成以下三个步骤:

  1. 编写好 ./src/model/models/{school}/{id}.ts 模型。
  2. ./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,

    // ...其他模型
]
  1. ./vite.config.tsplugin.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加密都加成什么样子了

仅仅是为了学习一下如何编写油猴脚本

TODO

  • 支持更多模型
  • 整个调试模式(查看模型运行情况等)
  • 支持自定义传入数据抢课
  • 支持远程RPC调用
  • 让弹窗提示更人性化(或许能整个有梗体中文的i18n?
  • 多写点注释(再说吧,有点懒)
  • 整个Playwright版本和浏览器插件版本?(用来在命令行环境下使用,并解决登录过期问题)

PR & Issue

直接提,欢迎提

About

一个用户友好型的油猴(Tampermonkey)抢课脚本

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages