Greasy Fork

东营继续教育

from ai build

目前为 2024-11-18 提交的版本。查看 最新版本

// ==UserScript==
// @name         东营继续教育
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  from ai build
// @author       xuefeng
// @match        *://*.yxlearning.com/*
// @grant        none
// @license
// ==/UserScript==

(function () {
    'use strict';

    // 确保页面完全加载后再执行脚本
    window.onload = function () {
        setTimeout(function () {
            // 获取当前页所有章节的元素的ID
            function getAllUnitID() {
                // 声明一个存储当前课程的每章节id的数组
                var allUnitID = [];
                // 获取所有 class 为 "pt5" 的 ul 元素
                var ulElements = document.querySelectorAll('ul.pt5');

                // 遍历每个 ul 元素
                ulElements.forEach(function (ul) {
                    // 获取 ul 元素下的所有 li 元素
                    var liElements = ul.querySelectorAll('li');

                    // 遍历每个 li 元素并获取其 id
                    liElements.forEach(function (li) {
                        allUnitID.push(li.id);
                    });
                });
                console.log("已经获取所有的章节ID", allUnitID);
                return allUnitID;
            }

            // 找到当前章节的管视频播放的那个video标签,也即当前页面真实的视频标签
            function nowUnitTrueVideo() {

                var nowUnitTrueVideoElement = document.querySelectorAll("video");
                for (var i = 0; i < nowUnitTrueVideoElement.length; i++) {
                    if (nowUnitTrueVideoElement[i].duration) {
                        return nowUnitTrueVideoElement[i];
                    }
                }
            }

            // 点击这个视频所在的章节(即点击nowUnitID,即点击这个对应标题进入视频播放页),并确保完全进入该章节后改变promise状态
            const inNowUnitID = (nowUnitID) => {
                return new Promise((resolve) => { // promise 一旦建立就立即执行,但是状态的改变需要resolve()
                    document.querySelectorAll('li[id="' + nowUnitID + '"]')[0].click();
                    setTimeout(() => { resolve("等待时间到,应该已完全进入该章节") }, 10000)
                })
            }

            // 进入当前章节后找到真正的视频元素,并且保持持续播放,直到100%
            const nowUnitTrueVideoElement_AND_keepVideoPlay = (nowUnitID) => {
                return new Promise((resolve) => {
                    const nowUnitTrueVideoElement = () => {
                        var nowUnitTrueVideoElement = document.querySelectorAll("video");
                        for (var i = 0; i < nowUnitTrueVideoElement.length; i++) {
                            if (nowUnitTrueVideoElement[i].duration) {
                                return nowUnitTrueVideoElement[i];
                            }
                        }
                    }

                    if (nowUnitTrueVideoElement().paused) { // 如果视频暂停
                        nowUnitTrueVideoElement().muted = true;  // 静音
                        nowUnitTrueVideoElement().play();   // 就点击播放
                        console.log("自动点击本页视频播放");
                    }
                    const chekVideo_IS_Done = setInterval(() => {
                        console.log("当前章节视频完成了" + document.querySelector('[id="' + nowUnitID + '-badge"]').textContent);
                        if (document.querySelector('[id="' + nowUnitID + '-badge"]').textContent == '100%') {
                            clearInterval(chekVideo_IS_Done);
                            resolve("本节播放完成")
                        }
                    }, 1000)
                })

            }



            // 视频播放特殊处理,检测弹出的答题框
            function autoClickSkipButton() {
                // 选择需要观察变动的节点
                var targetNode = document.body;
                // 配置观察选项
                var config = { childList: true, subtree: true };

                const changecallback = function (mutations) {
                    mutations.forEach(function (mutation) {
                        if (document.querySelector('div.ccQuestion')) {
                            // 找到并点击 "跳过" 按钮
                            var skipButton = document.querySelector('input[value="跳过"]');
                            if (skipButton) {
                                skipButton.click();
                                // 重新启动观察者,以便处理后续的变化
                                observer.disconnect();
                                observer.observe(document.body, config);
                            }
                        }
                    });
                };

                // 创建一个观察者实例
                var observer = new MutationObserver(changecallback);

                // 开始观察
                observer.observe(targetNode, config);
                console.log("已开启自动跳过答题框");
            }
            //-------------------------事件顺序-------------------------------



            // 获取本课程所有的章节ID(也即allUnitID)
            const allUnitID = getAllUnitID();


            // 开始播放课程所有章节
            const start = async (allUnitID) => {
                console.log("Type of allUnitID:", typeof allUnitID);
                for (const nowUnitID of allUnitID) {
                    const res1 = await inNowUnitID(nowUnitID)
                    console.log(res1)
                    const res2 = await nowUnitTrueVideoElement_AND_keepVideoPlay(nowUnitID)
                    console.log(res2)
                }
            }
            // 开始
            start(allUnitID);
            // 调用观察者确保跳过答题框
            autoClickSkipButton();  // 不需要传入参数

        }, 20000); // 延迟10秒执行
    };
})();