Greasy Fork

河北教师继续教育2024

自动过验证码、自动展开未学的内容无人值守学习。

目前为 2025-01-19 提交的版本。查看 最新版本

// ==UserScript==
// @name         河北教师继续教育2024
// @namespace    http://tampermonkey.net/
// @version      2.0.4
// @description  自动过验证码、自动展开未学的内容无人值守学习。
// @author       yanguichao
// @match        *://*.stu.teacher.com.cn/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=bing.com
// @grant        none
// @license      MIT
// @require      https://code.jquery.com/jquery-3.6.0.min.js
// ==/UserScript==

/* global $ */ // 告诉 ESLint,$ 是全局变量

(function () {
    'use strict';

    // 第一个脚本
    (function () {
        // 每 10 秒检查一次验证信息并提交
        setInterval(function () {
            if ($("div:contains('验证信息')").length > 1) {
                console.log("检测到学习验证");
                $("#code").attr("value", $("#codespan").text());
                $("a:contains('提交')")[0].click();
            }

            // 检查并点击“Ok,我知道了!”按钮
            var elements = document.querySelectorAll('a');
            elements.forEach(function (el) {
                if (el.innerText == 'Ok,我知道了!') {
                    el.click();
                    document.getElementsByClassName("ccH5TogglePlay")[0].click();
                    console.log("rePlay success!!!");
                }
            });
        }, 6000);

        // 根据 URL 执行不同逻辑
        var href = location.href;
        if (href.indexOf("/course/showCourse/") !== -1) {
            // 进入课程学习
            if (document.getElementsByClassName("button-hui").length > 0 &&
                document.getElementsByClassName("button-hui")[0].innerText === "进入课程学习") {
                document.getElementsByClassName("button-hui")[0].click();
            }
        } else if (href.indexOf("/course/learn/") !== -1) {
            // 检查 TimeNum
            if (window.TimeNum >= 1200) {
                alert("可以提交了");
            }
        }

        // 重写暂停计时器函数
        window.stopScaler = function () {
            return true;
        };

        // 新增功能:每隔6秒检测页面内容,点击“学习计划”链接并在5秒后刷新页面
        const checkInterval = 6000; // 检测间隔时间(6秒)
        const targetContent = '<span id="bestMinutesTips" style="" class="noteRrror">(已达到累计上限,不再累计)</span>'; // 要检测的内容
        const linkText = '学习计划'; // 要点击的链接文本

        function checkAndClick() {
            // 获取当前页面的源代码
            const pageSource = document.documentElement.innerHTML;

            // 检查是否包含目标内容
            if (pageSource.includes(targetContent)) {
                // 查找所有超链接
                const links = document.getElementsByTagName('a');

                // 遍历所有超链接
                for (let i = 0; i < links.length; i++) {
                    // 检查链接文本是否匹配
                    if (links[i].textContent === linkText) {
                        // 点击匹配的链接
                        links[i].click();
                        console.log('已点击“学习计划”链接');

                        // 在点击后5秒刷新页面
                        setTimeout(() => {
                            location.reload();
                            console.log('页面已刷新');
                        }, 5000);

                        break;
                    }
                }
            }
        }

        // 每隔6秒执行一次检测
        setInterval(checkAndClick, checkInterval);

        // 新增功能:每隔5秒检查页面中的“展开”按钮并点击
        const expandCheckInterval = 5000; // 检查间隔时间(30秒)

        function checkAndClickExpand() {
            // 获取页面中所有 <span> 元素
            const spans = document.getElementsByTagName('span');

            // 遍历所有 <span> 元素
            for (let i = 0; i < spans.length; i++) {
                // 检查元素是否包含类名 "step" 且文本内容为 "展开"
                if (spans[i].classList.contains('step') && spans[i].textContent.trim() === '展开') {
                    // 点击匹配的元素
                    spans[i].click();
                    console.log('已点击“展开”按钮');
                    break;
                }
            }
        }

        // 每隔30秒执行一次检查
        setInterval(checkAndClickExpand, expandCheckInterval);
    })();

    // 第二个脚本
    (function () {
        // 检查是否已经触发过点击事件
        const hasTriggered = sessionStorage.getItem('countLearnTriggered');
        if (hasTriggered === 'true') {
            console.log('点击事件已经触发过,本次会话不再重复触发。');
            return; // 如果已经触发过,则退出脚本
        }

        // 查找包含 <i class="icon_2">学习中</i> 的 <li> 元素
        const targetElement = document.querySelector('li i.icon_2');

        if (targetElement && targetElement.textContent === '学习中') {
            // 找到目标元素后,查找其父元素中的 <a> 标签
            const parentLi = targetElement.closest('li');
            const targetButton = parentLi.querySelector('a[onclick*="countLearn"]');

            if (targetButton) {
                console.log('找到目标按钮,将在5-10秒后触发点击事件。');

                // 设置5-10秒后触发点击事件
                const delay = Math.floor(Math.random() * 5000) + 5000; // 5-10秒随机延迟
                setTimeout(() => {
                    console.log('触发点击事件:', targetButton);
                    targetButton.click(); // 触发点击事件

                    // 标记点击事件已经触发
                    sessionStorage.setItem('countLearnTriggered', 'true');
                    console.log('已标记点击事件为已触发(本次会话)。');

                    // 跳转到学习页面
                    const courseLink = parentLi.querySelector('a.list-title');
                    if (courseLink && courseLink.href) {
                        console.log('跳转到学习页面:', courseLink.href);
                        window.location.href = courseLink.href; // 跳转到学习页面
                    } else {
                        console.log('未找到学习页面链接。');
                    }
                }, delay);
            } else {
                console.log('未找到带有 onclick="countLearn" 的按钮。');
                // 如果第二个脚本没有找到目标元素,则触发第三个脚本
                setTimeout(() => {
                    (function () {
                        // 检查是否已经触发过点击事件
                        const hasTriggered2 = sessionStorage.getItem('countLearnTriggered2');
                        if (hasTriggered2 === 'true') {
                            console.log('点击事件已经触发过,本次会话不再重复触发。');
                            return; // 如果已经触发过,则退出脚本
                        }

                        // 查找包含 <i class="icon_0">未学习</i> 的 <li> 元素
                        const targetElement2 = document.querySelector('li i.icon_0');

                        if (targetElement2 && targetElement2.textContent === '未学习') {
                            // 找到目标元素后,查找其父元素中的 <a> 标签
                            const parentLi2 = targetElement2.closest('li');
                            const targetButton2 = parentLi2.querySelector('a[onclick*="countLearn"]');

                            if (targetButton2) {
                                console.log('找到目标按钮,将在5-10秒后触发点击事件。');

                                // 设置5-10秒后触发点击事件
                                const delay2 = Math.floor(Math.random() * 5000) + 5000; // 5-10秒随机延迟
                                setTimeout(() => {
                                    console.log('触发点击事件:', targetButton2);
                                    targetButton2.click(); // 触发点击事件

                                    // 标记点击事件已经触发
                                    sessionStorage.setItem('countLearnTriggered2', 'true');
                                    console.log('已标记点击事件为已触发(本次会话)。');

                                    // 跳转到学习页面
                                    const courseLink2 = parentLi2.querySelector('a.list-title');
                                    if (courseLink2 && courseLink2.href) {
                                        console.log('跳转到学习页面:', courseLink2.href);
                                        window.location.href = courseLink2.href; // 跳转到学习页面
                                    } else {
                                        console.log('未找到学习页面链接。');
                                    }
                                }, delay2);
                            } else {
                                console.log('未找到带有 onclick="countLearn" 的按钮。');
                            }
                        } else {
                            console.log('未找到符合条件的“未学习”按钮。');
                        }
                    })();
                }, 1000); // 延迟1秒执行第三个脚本
            }
        } else {
            console.log('未找到符合条件的“学习中”按钮。');
            // 如果第二个脚本没有找到目标元素,则触发第三个脚本
            setTimeout(() => {
                (function () {
                    // 检查是否已经触发过点击事件
                    const hasTriggered2 = sessionStorage.getItem('countLearnTriggered2');
                    if (hasTriggered2 === 'true') {
                        console.log('点击事件已经触发过,本次会话不再重复触发。');
                        return; // 如果已经触发过,则退出脚本
                    }

                    // 查找包含 <i class="icon_0">未学习</i> 的 <li> 元素
                    const targetElement2 = document.querySelector('li i.icon_0');

                    if (targetElement2 && targetElement2.textContent === '未学习') {
                        // 找到目标元素后,查找其父元素中的 <a> 标签
                        const parentLi2 = targetElement2.closest('li');
                        const targetButton2 = parentLi2.querySelector('a[onclick*="countLearn"]');

                        if (targetButton2) {
                            console.log('找到目标按钮,将在5-10秒后触发点击事件。');

                            // 设置5-10秒后触发点击事件
                            const delay2 = Math.floor(Math.random() * 5000) + 5000; // 5-10秒随机延迟
                            setTimeout(() => {
                                console.log('触发点击事件:', targetButton2);
                                targetButton2.click(); // 触发点击事件

                                // 标记点击事件已经触发
                                sessionStorage.setItem('countLearnTriggered2', 'true');
                                console.log('已标记点击事件为已触发(本次会话)。');

                                // 跳转到学习页面
                                const courseLink2 = parentLi2.querySelector('a.list-title');
                                if (courseLink2 && courseLink2.href) {
                                    console.log('跳转到学习页面:', courseLink2.href);
                                    window.location.href = courseLink2.href; // 跳转到学习页面
                                } else {
                                    console.log('未找到学习页面链接。');
                                }
                            }, delay2);
                        } else {
                            console.log('未找到带有 onclick="countLearn" 的按钮。');
                        }
                    } else {
                        console.log('未找到符合条件的“未学习”按钮。');
                    }
                })();
            }, 1000); // 延迟1秒执行第三个脚本
        }
    })();

// 第四个脚本
(function () {
    // 定义第一次运行的间隔时间(20秒)
    const initialInterval = 20000;
    // 定义后续运行的间隔时间(1200秒)
    const regularInterval = 1200000;

    // 主函数:查找并点击符合条件的 <li> 元素
    function autoClickVideoItem() {
        // 查找所有 <li> 元素
        const listItems = document.querySelectorAll('li[data-type="视频"]');

        if (listItems.length > 0) {
            listItems.forEach(item => {
                // 检查是否存在 onclick 属性
                if (item.onclick) {
                    console.log('找到视频项,正在触发点击事件:', item);
                    item.onclick(); // 触发 onclick 事件
                } else if (item.getAttribute('onclick')) {
                    // 如果 onclick 是通过 HTML 属性设置的
                    const onclickFunction = new Function(item.getAttribute('onclick'));
                    onclickFunction.call(item); // 调用 onclick 函数
                }
            });
        } else {
            console.log('未找到符合条件的视频项');
            // 如果没有找到 data-type="视频" 的元素,则查找 data-type="1" 的元素
            const dataType1Items = document.querySelectorAll('li[data-type="1"]');
            if (dataType1Items.length > 0) {
                dataType1Items.forEach(item => {
                    // 检查是否存在 onclick 属性,并且包含 findCourseContent
                    if (item.onclick && item.onclick.toString().includes('findCourseContent')) {
                        console.log('找到 data-type="1" 的元素,正在触发点击事件:', item);
                        item.onclick(); // 触发 onclick 事件
                    } else if (item.getAttribute('onclick') && item.getAttribute('onclick').includes('findCourseContent')) {
                        // 如果 onclick 是通过 HTML 属性设置的
                        const onclickFunction = new Function(item.getAttribute('onclick'));
                        onclickFunction.call(item); // 调用 onclick 函数
                    }
                });
            } else {
                console.log('未找到 data-type="1" 的元素');
            }
        }
    }

    // 第一次运行
    setTimeout(() => {
        autoClickVideoItem(); // 第一次执行
        console.log('第一次运行完成,后续将每隔1200秒运行一次。');

        // 后续运行
        setInterval(autoClickVideoItem, regularInterval);
    }, initialInterval);

    console.log('脚本已启动,将在20秒后第一次运行。');
})();

   // 第五个脚本
(function () {
    // 定义检查并点击按钮的函数
    function checkAndClickButton() {
        // 查找id为replaybtn的按钮
        const replayBtn = document.getElementById('replaybtn');
        if (replayBtn) {
            console.log('找到replaybtn按钮,正在点击...');
            replayBtn.click(); // 触发按钮的点击事件

            // 如果是第一次点击,设置下一次点击的间隔为30~60秒
            if (!window.hasClickedReplayBtn) {
                window.hasClickedReplayBtn = true; // 标记已经点击过
                const nextDelay = Math.floor(Math.random() * 30000) + 30000; // 30~60秒随机时间
                console.log(`第一次点击完成,下一次点击将在 ${nextDelay / 1000} 秒后执行。`);
                setTimeout(checkAndClickButton, nextDelay); // 设置下一次点击
            } else {
                // 后续点击间隔为30~60秒
                const nextDelay = Math.floor(Math.random() * 30000) + 30000; // 30~60秒随机时间
                console.log(`下一次点击将在 ${nextDelay / 1000} 秒后执行。`);
                setTimeout(checkAndClickButton, nextDelay); // 设置下一次点击
            }
        } else {
            console.log('未找到replaybtn按钮');
            // 如果没有找到按钮,继续在5~10秒后检查
            const nextDelay = Math.floor(Math.random() * 5000) + 5000; // 5~10秒随机时间
            console.log(`未找到按钮,将在 ${nextDelay / 1000} 秒后重新检查。`);
            setTimeout(checkAndClickButton, nextDelay); // 设置下一次检查
        }
    }

    // 初始化脚本
    function initScript() {
        // 清空标记
        window.hasClickedReplayBtn = false;

        // 第一次检查在5~10秒内随机执行
        const initialDelay = Math.floor(Math.random() * 5000) + 5000; // 5~10秒随机时间
        console.log(`脚本已启动,将在 ${initialDelay / 1000} 秒后执行第一次检查。`);
        setTimeout(checkAndClickButton, initialDelay);
    }

    // 页面加载或刷新时初始化脚本
    initScript();

    // 监听页面刷新或重新加载事件
    window.addEventListener('load', initScript);
})();

    // 第六个脚本:自动刷新学习时间
    (function () {
        // 查找目标按钮
        const button = document.querySelector('div.fr button.btn.studyCourseTimeRefresh');

        if (button) {
            console.log('找到“刷新学习时间”按钮,开始定时点击。');

            // 定义点击按钮的函数
            const clickButton = () => {
                // 检查页面中是否包含“最长可累计时间:”
                if (!document.body.innerText.includes('最长可累计时间:')) {
                    button.click();
                    console.log('已触发“刷新学习时间”按钮点击。');
                } else {
                    console.log('页面包含“最长可累计时间:”,跳过刷新操作。');
                }
            };

            // 初始点击一次
            clickButton();

            // 每隔5分钟(600000毫秒)点击一次
            setInterval(clickButton, 600000);
        } else {
            console.log('未找到“刷新学习时间”按钮。');
        }
    })();

    // 第七个脚本:检测学习状态并刷新页面
    (function () {
        // 标志是否已经执行过点击操作
        let hasClicked = false;

        // 刷新计数器,最多刷新1次
        let refreshCount = 0;
        const maxRefreshCount = 1;

        // 检查页面中是否存在“未学习”或“学习中”的标志
        function checkLearningStatus() {
            const unlearned = document.querySelector('.icon_0'); // 未学习的标志
            const learning = document.querySelector('.icon_2'); // 学习中的标志

            // 如果存在“未学习”或“学习中”的标志,则停止脚本执行
            if (unlearned || learning) {
                console.log('检测到“未学习”或“学习中”状态,脚本停止执行。');
                return true;
            }
            return false;
        }

        // 点击第三阶段的按钮
        function clickThirdPhaseButton() {
            const thirdPhaseButton = document.querySelector('li[data-value="4032"]');
            if (thirdPhaseButton && !hasClicked) {
                thirdPhaseButton.click();
                console.log('已点击第三阶段按钮。');
                hasClicked = true; // 标记已点击
            }
        }

        // 主逻辑函数
        function main() {
            // 检查页面中是否包含“最长可累计时间:”
            if (document.body.innerText.includes('最长可累计时间:')) {
                console.log('页面包含“最长可累计时间:”,跳过刷新操作。');
                return;
            }

            if (checkLearningStatus()) {
                return; // 如果检测到“未学习”或“学习中”,则停止执行
            }

            // 如果没有检测到“未学习”或“学习中”,则刷新页面
            if (!hasClicked && refreshCount < maxRefreshCount) {
                console.log('未检测到“未学习”或“学习中”状态,刷新页面。');
                refreshCount++;
                setTimeout(() => {
                    window.location.reload();
                }, 600000); // 60秒后刷新页面
            } else if (refreshCount >= maxRefreshCount) {
                console.log('已达到最大刷新次数,停止刷新。');
            }

            // 点击第三阶段的按钮
            clickThirdPhaseButton();
        }

        // 每隔2分钟执行一次主逻辑
        setInterval(main, 120000);
    })();
})();