// ==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);
})();
})();