优客在线

自用优客在线刷客脚本

// ==UserScript==
// @name         优客在线
// @namespace    http://tampermonkey.net/
// @version      0.0.2
// @description  自用优客在线刷客脚本
// @author       Sheldon Lee
// @match        http://*/*
// @match        https://cce.org.uooconline.com/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// @license MIT
// ==/UserScript==

(function () {
  "use strict";
  var current = 0;
  var currentUncomplete = 0;
  var unfinishedVideoList;
  var bigUnfinishedList;

  async function myFunction() {
    // 打标
    markFuntion()
    // 当前播放
    current = 0;
    currentUncomplete = 0;
    unfinishedVideoList = await getUnfinishedVideo();
    bigUnfinishedList;
    var currentVideo;
    if (unfinishedVideoList.length === 0) {
      // 当前小章节没有课程的时候,获取当前页面的未完成的小章节
      var uncomplete = await getUnfinishedList();
      if (uncomplete.length > 0) {
        uncomplete[0].click();
        unfinishedVideoList = await getUnfinishedVideo();
      } else {
        bigUnfinishedList = getBigUnfinishedList();
        bigUnfinishedList[0].click();
        uncomplete = await getUnfinishedList();
        uncomplete[0].click();
        unfinishedVideoList = await getUnfinishedVideo();
      }
    }
    if (unfinishedVideoList[current]) {
      // 播放第一个视频
      unfinishedVideoList[current].click();
      currentVideo = document.querySelector("video");
      videoFn();
      removeMarkFuntion(unfinishedVideoList[current]);
    }

    addedned(currentVideo);
    var html = document.querySelector("html");
    // 添加鼠标移出事件
    html.addEventListener("mouseout", function () {
      // 视频相关
      videoFn()
    })
    html.addEventListener("visibilitychange", function () {
      // 视频相关
      videoFn()
    })
  }
  // 视频相关
  function videoFn () {
    var currentVideo = document.querySelector("video");
    currentVideo.setAttribute("muted", "muted");
    currentVideo.muted = true;
    currentVideo.autoplay = true;
    currentVideo.playsinline = true;
    currentVideo.playbackRate = 2;
    addedned(currentVideo);
    var playPromise = currentVideo.play();
    playPromise.then(() => {
    }).catch((error) => {
      currentVideo.play()
    });
  }

  // 添加onended事件
  function addedned(ele) {
    if (!ele) return;
    if (ele.onended) return;
    ele.onended = function () {
      current++;
      setTimeout(async () => {
        if (unfinishedVideoList[current]) {
          unfinishedVideoList[current].click();
          videoFn();
          return;
        }
        var uncomplete = await getUnfinishedList();
        if (uncomplete.length > 0) {
          currentUncomplete++;
          if (uncomplete[0]) {
            uncomplete[0].click();
            // 等得页面获取新的视频列表
            unfinishedVideoList = await getUnfinishedVideo();
            // 触发页面的点击事件
            unfinishedVideoList[0].click();
            videoFn();
          }
        } else {
          currentUncomplete = 0;
          bigUnfinishedList = getBigUnfinishedList();
          bigUnfinishedList[0].click();
          uncomplete = await getUnfinishedList();
          if (uncomplete[0]) {
            uncomplete[0].click();
            // 等得页面获取新的视频列表
            unfinishedVideoList = await getUnfinishedVideo();
            // 触发页面的点击事件
            unfinishedVideoList[0].click();
            videoFn();
          }

        }
      }, 300)
    };
  }

  // 获取未完成的列表
  function getUnfinishedList() {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        var uncomplete = document.querySelectorAll('.basic.uncomplete');
        // 将大章节过滤掉
        var filtered = Array.prototype.filter.call(uncomplete, function (el) {
          return el.classList.length === 2;
        });
        resolve(filtered);
      }, 500);
    })
  }

  // 打标函数
  function markFuntion() {
    var _bigUnfinishedList = document.querySelectorAll(".basic.chapter.uncomplete");
    Array.prototype.forEach.call(_bigUnfinishedList, function(el) {
      // 打上标记
      el.classList.add('targetviacustom')
    })
  }

  // 去掉标记
  function removeMarkFuntion(currtentEl) {
    // 父级
    var parent = currtentEl.parentNode.parentNode.parentNode.parentNode
    parent.querySelector('.targetviacustom.uncomplete').classList.remove('targetviacustom')
  }

  function getBigUnfinishedList() {
    var _bigUnfinishedList = document.querySelectorAll(".targetviacustom.uncomplete");
    return _bigUnfinishedList;
  }
  // 获取未播放的视频
  function getUnfinishedVideo() {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        var elements = document.querySelectorAll(".basic.ng-scope");
        var filtered = Array.prototype.filter.call(elements, function (el) {
          return el.classList.length === 2;
        });
        var currentVideoList = getCurrentVideoList();
        filtered = Array.from(filtered).concat(Array.from(currentVideoList));
        var elementsWithoutAfter = [];
        for (var i = 0; i < filtered.length; i++) {
          var style = window.getComputedStyle(filtered[i], "::after");
          var content = style.getPropertyValue("content");
          if (
            (!content || content === "none") &&
            filtered[i].innerText === " 视频"
          ) {
            elementsWithoutAfter.push(filtered[i]);
          }
        }
        resolve(elementsWithoutAfter);
      }, 2000);
    });
  }

  function getCurrentVideoList() {
    var _currentVideoList = document.querySelectorAll(".basic.ng-scope.active");
    return _currentVideoList;
  }
	setTimeout(myFunction, 3000);
})();