// ==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 // @downloadURL none // ==/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 = '(已达到累计上限,不再累计)'; // 要检测的内容 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() { // 获取页面中所有 元素 const spans = document.getElementsByTagName('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; // 如果已经触发过,则退出脚本 } // 查找包含 学习中
  • 元素 const targetElement = document.querySelector('li i.icon_2'); if (targetElement && targetElement.textContent === '学习中') { // 找到目标元素后,查找其父元素中的 标签 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; // 如果已经触发过,则退出脚本 } // 查找包含 未学习
  • 元素 const targetElement2 = document.querySelector('li i.icon_0'); if (targetElement2 && targetElement2.textContent === '未学习') { // 找到目标元素后,查找其父元素中的 标签 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; // 如果已经触发过,则退出脚本 } // 查找包含 未学习
  • 元素 const targetElement2 = document.querySelector('li i.icon_0'); if (targetElement2 && targetElement2.textContent === '未学习') { // 找到目标元素后,查找其父元素中的 标签 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; // 主函数:查找并点击符合条件的
  • 元素 function autoClickVideoItem() { // 查找所有
  • 元素 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); })(); })();