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

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

Versión del día 06/01/2023. Echa un vistazo a la versión más reciente.

// ==UserScript==
// @name         国家中小学智慧教育平台刷课脚本(16倍速,自动答题,自动切换列表中的视频,后台播放,学时不更新的解决方法看下面)
// @namespace    http://tampermonkey.net/
// @version      0.9
// @license      CC BY-NC-SA
// @description  16倍速,自动答题,自动切换列表中的视频,后台播放,学时不更新的解决方法看下面
// @author       HGGshiwo
// @match        https://*.zxx.edu.cn/*
// @match        https://*.smartedu.cn/*
// @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 () => {
    await sleep(4000);
    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");
    });
    log(`开始观看: 第${resNo + 1}个视频,第${groupNo + 1}组`);

    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) {
            log("看完了所有组, 退出");
          } else {
            //观看下一组
            log(`点击下一组的第一个视频`);
            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();
          log(`点击当前组的下一个视频`);
          getActiveVideoAndPlay();
        }
      },
      false
    );

    vid.addEventListener("pause", async () => {
      if (document.hidden) {
        vid.play(); //因为页面隐藏而暂停,则直接播放
        return;
      }
      await sleep(1000);
      var options = document.getElementsByClassName("nqti-option");
      var i = 0;
      while (options.length) {
        i += 1;
        options[0].click();
        await sleep(1000);
        var btns = document.getElementsByClassName("fish-btn");
        if (btns.length === 1) {
          btns[0].click();
        } else {
          btns[1].click();
        }
        await sleep(1000);
        options = document.getElementsByClassName("nqti-option");
      }
    });
  };

  const htmlstr =
    '<div style="border: 2px dashed rgb(149, 252, 251); width: 400px; height: 80px; position: fixed; bottom: 0; right: 0; z-index: 99999; background-color: rgba(184, 247, 255); overflow-x: auto; padding: 10px;">' +
    "<div>" +
    '<div id="log" style="margin-top: 1em;"/>' +
    "</div>" +
    "</div>";

  const log = (out) => {
    var e = document.getElementById("log");
    if (e) {
      e.innerText = `现在正在进行的操作:${out}`;
    } else {
      console.log(666, document.getElementById("log"));
    }
  };

  document
    .getElementById("root")
    .insertAdjacentHTML("beforeend", htmlstr.trim());
  log("刷课脚本开始运行");

  getActiveVideoAndPlay();
})();