UOOC_优课刷课_sztu软件工程

该刷课网站会自动跳转到未刷的课自动播放,章节测试会被跳过,请自行完成章节测试。

当前为 2024-11-23 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         UOOC_优课刷课_sztu软件工程
// @namespace    https://www.sztu.edu.cn/
// @version      2024-11-23
// @license      MPL
// @description  该刷课网站会自动跳转到未刷的课自动播放,章节测试会被跳过,请自行完成章节测试。
// @author       somebody in SZTU
// @include      http://www.uooc.net.cn/home/learn/index*
// @include      https://www.uooc.net.cn/home/learn/index*
// @match        http://www.uooc.net.cn/home/learn/*
// @match        https://www.uooc.net.cn/home/learn/*
// @grant        none
// ==/UserScript==

/*调试信息*/
//视频倍速
let speed = 2;
//视频静音
let mute = true;

(function () {
    "use strict";

    // 寻找未刷的课
    async function searchUncomplete(query){
        return new Promise(async (resolve) => {
            let catalog = query.children;
            for (let i = 0; i < catalog.length; i++) {
                // 寻找第一层列表的可点击元素
                await checkActive(catalog[i]);
            }
            resolve();
        })
    }

    // 检测是否未刷
    async function checkActive(catalog){
        return new Promise(async (resolve) => {
            let children = catalog.children
            // 检测是否未刷:是否未刷通过子元素第一个的class列表来获取
            let elem = catalog?.firstElementChild;
            if (elem && elem.classList.contains("uncomplete") && !elem.innerText.includes("测试")) {
                console.log("搜寻"+elem.innerText);
                // 检测是否已经打开:查找该元素中的 <i> 标签,检测class
                let iElement = elem.getElementsByTagName("i")[0];
                if(iElement.classList.contains("icon-xiangxia")){
                    elem.click();
                }
                console.log("found ");
                await sleep(1000); // 等待 1000 毫秒
                console.log("查找")
                // 未刷则检测所有子元素,重点查看<div>是否是任务点、<ul>则递归使用检测未刷
                for(let i = 1; i < children.length; i++){
                    // 如果是div,则有可能是未完成的任务节点,是则点入。
                    if(children[i].tagName==="DIV" && children[i]?.firstElementChild && !children[i].firstElementChild.classList.contains("complete")){
                        let spanElem = children[i].firstElementChild.children[1]

                        if(spanElem.classList.contains("taskpoint") && !spanElem.innerText.includes("测验")){
                            children[i].firstElementChild.click();
                            console.log("等待视频播放完毕...");
                            await waitForCondition();
                            console.log("视频播放完毕2");
                        }
                    }
                    // 如果不是div,则继续递归寻找未完成的课
                    else if(children[i].tagName==="UL"){
                        await searchUncomplete(children[i]);
                    }
                }
            }
            resolve();
        })
    }

    // 避免视频失去焦点 + 检测视频是否播放完毕
    function waitForCondition() {
        return new Promise(resolve => {
            const intervalId = setInterval(() => {
                let videoButton = document.getElementsByClassName(
                    "vjs-big-play-button animated fadeIn"
                )[0];
                if (videoButton !== undefined) {
                    let video = document.getElementById("player_html5_api");
                    video.onended = function() {
                        console.log("视频播放完毕1");
                        clearInterval(intervalId);
                        resolve();
                    };
                    video.muted = mute;
                    video.playbackRate = speed;
                    videoButton.click();
                }
            }, 1000);
        });
    }

    // 阻塞辅助
    function sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

    $(document).ready(function () {
        // 等待元素加载完成
        setTimeout(()=>{
            searchUncomplete(document.querySelectorAll("ul.rank-1")[0]);
        }, 1000); // 延迟2秒等待元素加载
    });
})();