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

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

As of 10/01/2023. See the latest version.

// ==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")[0]
      .getElementsByClassName("fish-btn");
    if (!confirmBtns.length) {
      confirmBtns[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();
})();