Greasy Fork

Greasy Fork is available in English.

国家中小学智慧教育平台刷课脚本(16倍速,自动答题,自动切换列表中的视频,后台播放,学时不更新的解决方法看下面)

16倍速,自动答题,自动切换列表中的视频,后台播放,学时不更新的解决方法看下面

当前为 2023-01-10 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         国家中小学智慧教育平台刷课脚本(16倍速,自动答题,自动切换列表中的视频,后台播放,学时不更新的解决方法看下面)
// @namespace    http://tampermonkey.net/
// @version      1.4
// @license      CC BY-NC-SA
// @description  16倍速,自动答题,自动切换列表中的视频,后台播放,学时不更新的解决方法看下面
// @author       HGGshiwo
// @match        https://*.zxx.edu.cn/teacherTraining/courseDetail*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// ==/UserScript==

(function () {
  "use strict";
  // function
  const sleep = async (time) => {
    var p = new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve();
      }, time);
    });
    return p;
  };

  const getActiveVideoAndPlay = async () => {
    if (first) {
      //如果第一次进入,请求用户的等待时间。
      await sleep(2000);
      first = false;
      var input = prompt("设定等待时间,脚本运行正常的请直接点确定", waitTime);
      try {
        waitTime = parseInt(input);
        localStorage.setItem("waitTime", input);
      } catch (e) {
        console.log(666, e);
        waitTime = 1000;
      }
    } else {
      await sleep(1000);
    }
    //点掉确认框
    var confirmBtns = document.getElementsByClassName("fish-modal-confirm-btns")
    if(confirmBtns.length) {
      confirmBtns[0].getElementsByClassName("fish-btn")[0].click();
    }
    //获取当前视频位置
    try {
      var groups = document.getElementsByClassName("fish-collapse-item");
      var groupNo = [...groups].findIndex((item) => {
        return item.className.includes("active");
      });
      var resItems = groups[groupNo].getElementsByClassName("resource-item");
      var resNo = [...resItems].findIndex((item) => {
        return item.className.includes("active");
      });
    } catch (e) {
      console.log(666, e);
      getActiveVideoAndPlay();
      return;
    }

    console.log(666, `开始观看: 第${resNo + 1}个视频,第${groupNo + 1}组`);
    try {
      var vid = document.getElementsByTagName("video")[0];
      vid.muted = true;
      vid.play();
      document.querySelector("video").playbackRate = 16;

      vid.addEventListener(
        "ended",
        async () => {
          //计算下一个视频的位置
          if (resNo + 1 == resItems.length) {
            //看完了当前组
            if (groupNo + 1 == groups.length) {
              console.log(666, "看完了所有组, 退出");
            } else {
              //观看下一组
              console.log(666, `点击下一组的第一个视频`);
              document
                .getElementsByClassName("fish-collapse-header")
                [groupNo + 1].click();
              await sleep(1000);
              resItems =
                groups[groupNo + 1].getElementsByClassName("resource-item");
              resItems[0].click();
              getActiveVideoAndPlay();
            }
          } else {
            //观看当前组的下一个视频
            resItems[resNo + 1].click();
            console.log(666, `点击当前组的下一个视频`);
            getActiveVideoAndPlay();
          }
        },
        false
      );

      vid.addEventListener("pause", async () => {
        if (document.hidden) {
          vid.play(); //因为页面隐藏而暂停,则直接播放
          return;
        }
        await sleep(waitTime);
        var options = document.getElementsByClassName("nqti-option");
        var i = 0;
        while (options.length) {
          i += 1;
          options[0].click();
          await sleep(waitTime);
          var btns = document.getElementsByClassName("fish-btn");
          if (btns.length === 1) {
            btns[0].click();
          } else {
            btns[1].click();
          }
          await sleep(waitTime);
          options = document.getElementsByClassName("nqti-option");
        }
      });
    } catch (e) {
      console.log(666, e);
      getActiveVideoAndPlay(); //获取不到视频,再次调用
    }
  };
  var first = true;
  var waitTime = localStorage.getItem("waitTime");
  waitTime = waitTime ? parseInt(waitTime) : "1000";
  console.log(666, "刷课脚本开始运行");
  getActiveVideoAndPlay();
})();