// ==UserScript== // @name 山东省教师教育网2025中小学远程研修(全自动学习) // @namespace http://tampermonkey.net/ // @version 3.2 // @author 桥风rewrite // @description 山东省教师教育网2025中小学远程研修,有问题可以联系我 微信:founderqiang // @match *://www.qlteacher.com/ // @match *://yxjc.qlteacher.com/project/yey2025/* // @match *://yxjc.qlteacher.com/project/xx2025/* // @match *://yxjc.qlteacher.com/project/cz2025/* // @match *://yxjc.qlteacher.com/project/gz2025/* // @match *://yxjc.qlteacher.com/project/cz2025/lesson/learn // @match *://player.qlteacher.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=qlteacher.com // @license 桥风rewrite // @grant none // @downloadURL none // ==/UserScript== (function () { 'use strict'; // 用于存储页面层级信息 function setPageLevel(level) { sessionStorage.setItem('currentPageLevel', level); } function getPageLevel() { return sessionStorage.getItem('currentPageLevel') || 'main'; } function setChapterListUrl(url) { sessionStorage.setItem('chapterListUrl', url); } function getChapterListUrl() { return sessionStorage.getItem('chapterListUrl'); } function open() { window.location.reload(); } // 监听,如果窗口变为活跃,那么强制刷新页面 function isFocus() { if (!document.hidden) { window.location.reload(); console.log("Refresh the course status!"); } } document.addEventListener("visibilitychange", isFocus); // 第一画面:课程列表页面 function coursesPage() { if (document.URL.search('yxjc.qlteacher.com/project/yey2025') > 1 || document.URL.search('yxjc.qlteacher.com/project/xx2025') > 1 || document.URL.search('yxjc.qlteacher.com/project/cz2025') > 1 || document.URL.search('yxjc.qlteacher.com/project/gz2025') > 1) { // 标记当前为主页面 setPageLevel('main'); // 当且仅当窗口活跃 if (!document.hidden) { setTimeout(() => console.log("mainpage waiting..."), 500); var buttons = document.getElementsByTagName("button"); // 按顺序查找并点击第一个可用的"继续学习"或"开始学习"按钮 for (let i = 0; i < buttons.length; i++) { let spans = buttons[i].getElementsByTagName("span"); for (let j = 0; j < spans.length; j++) { if (spans[j].innerText) { // 优先点击"继续学习"按钮 if (spans[j].innerText.includes("继续学习")) { console.log("点击了索引为", i, "的'继续学习'按钮"); buttons[i].click(); return; } // 如果没有"继续学习",则点击"开始学习" if (spans[j].innerText.includes("开始学习")) { console.log("点击了索引为", i, "的'开始学习'按钮"); buttons[i].click(); return; } } } } console.log("没有找到可点击的按钮"); } } } setInterval(coursesPage, 3000); // 第二画面:章节列表页面 function chapterPage() { var patt = /^https:\/\/player.qlteacher.com\/learning\/.*$/; if (document.URL.match(patt) == document.URL) { // 通过检测页面元素来判断是否为章节列表页面 // 章节列表页面通常有多个课程项目,而视频页面有video标签 var hasVideo = document.getElementsByTagName('video').length > 0; var hasChapterList = document.querySelectorAll('[class*="课程"], [class*="chapter"], .course-item').length > 0 || document.querySelectorAll('div').length > 50; // 章节列表页面通常有更多的div元素 // 如果没有视频元素,且看起来像章节列表页面,则认为是第二页面 if (!hasVideo && document.getElementsByTagName("button").length > 0) { // 标记当前为章节页面,并保存URL setPageLevel('chapter'); setChapterListUrl(document.URL); if (!document.hidden) { var buttons = document.getElementsByTagName("button"); // 寻找第一个未完成的章节(寻找"继续学习"按钮) for (let i = 0; i < buttons.length; i++) { let spans = buttons[i].getElementsByTagName("span"); for (let j = 0; j < spans.length; j++) { if (spans[j].innerText) { // 优先点击"继续学习"按钮 if (spans[j].innerText.includes("继续学习")) { console.log("章节页面:点击了索引为", i, "的'继续学习'按钮"); buttons[i].click(); return; } // 如果没有"继续学习",则点击"开始学习" if (spans[j].innerText.includes("开始学习")) { console.log("章节页面:点击了索引为", i, "的'开始学习'按钮"); buttons[i].click(); return; } } } } console.log("章节页面:所有章节已完成,准备返回主页面"); // 所有章节都完成了,返回主页面 window.history.back(); } } } } setInterval(chapterPage, 2000); // 第三画面:视频学习页面(简化版,只检测完成状态) function coursePage() { var patt = /^https:\/\/player.qlteacher.com\/learning\/.*$/; if (document.URL.match(patt) == document.URL) { // 标记当前为视频页面 setPageLevel('video'); // 检查进度是否为100% const progressElement = document.querySelector('span.d-inline-block.mt-xs.ft-16.text-primary'); if (progressElement && progressElement.textContent.trim() === '100%') { console.log("视频学习完成,返回章节页面"); // 返回章节列表页面 var chapterUrl = getChapterListUrl(); if (chapterUrl) { window.location.href = chapterUrl; } else { window.history.back(); } return; } // 检查是否显示"已完成"状态 if (document.getElementsByClassName('count-down ng-star-inserted').length > 0 && document.getElementsByClassName('count-down ng-star-inserted')[0].innerText == "已完成") { console.log("检测到已完成状态,返回章节页面"); var chapterUrl = getChapterListUrl(); if (chapterUrl) { window.location.href = chapterUrl; } else { window.history.back(); } } } } window.onload = function () { setInterval(coursePage, 2000); } function play() { // 修改的正则表达式 var patt = /^https:\/\/player.qlteacher.com\/learning\/.*$/; if (document.URL.match(patt) == document.URL) { // 纯测试题的课程 if (document.getElementsByClassName("mt-32 ft-16").length > 0) { if (document.getElementsByClassName("mt-32 ft-16")[0].innerText == ' [标准化测试]') { // 拿到所有题目,并为每个题选择第一个选项(这里的题目不要求全部做对才算完成) var tests = document.getElementsByClassName("mb-16 ng-star-inserted"); for (var t = 0; t < tests.length; t++) { tests[t].querySelectorAll("label")[0].click(); } // 点击下方的提交按钮 var buttons = document.querySelectorAll("button"); for (var k = 0; k < buttons.length; k++) { if (buttons[k].getElementsByClassName("ng-star-inserted").length > 0 && buttons[k].getElementsByClassName("ng-star-inserted")[0].innerText == "提交") { buttons[k].click(); break; } } // 确定提交 buttons = document.querySelectorAll("button"); for (k = 0; k < buttons.length; k++) { if (buttons[k].getElementsByClassName("ng-star-inserted").length > 0 && buttons[k].getElementsByClassName("ng-star-inserted")[0].innerText == "确定") { buttons[k].click(); break; } } // 如果状态为已完成,则返回章节页面 if (document.getElementsByClassName('count-down ng-star-inserted')[0].innerText == "已完成") { console.log("测试题完成,返回章节页面"); var chapterUrl = getChapterListUrl(); if (chapterUrl) { window.location.href = chapterUrl; } else { window.history.back(); } } } } // 弹出的多选题窗口,每次随机选择 else if (document.getElementsByClassName("ant-checkbox").length > 0) { document.getElementsByTagName('video')[0].paused == true; var items1 = document.getElementsByClassName("ant-checkbox"); var cnt = 0; for (var i = 0; i < items1.length; i++) { var randomZeroOrOne = Math.floor(Math.random() * 2 + 0.5); if (randomZeroOrOne == 1) { cnt++; items1[i].click(); } } if (cnt > 0) { document.getElementsByClassName("ant-btn radius-4 px-lg py0 ant-btn-primary")[0].click(); } } // 弹出的单选题窗口,每次随机选择一个选项 else if (document.getElementsByClassName("ant-radio-input").length > 0) { document.getElementsByTagName('video')[0].paused == true; var options = document.getElementsByClassName("ant-radio-input"); var randomIndex = Math.floor(Math.random() * options.length); options[randomIndex].click(); document.getElementsByClassName("ant-btn radius-4 px-lg py0 ant-btn-primary")[0].click(); } // 播放视频 else if (document.getElementsByTagName('video').length > 0 && document.getElementsByTagName('video')[0].paused == true) { document.getElementsByTagName('video')[0].muted = true; document.getElementsByTagName('video')[0].play(); //document.querySelector('video').playbackRate = 16;//设置播放速度 } // 如果完成,则返回章节页面 if (document.getElementsByClassName('count-down ng-star-inserted').length > 0 && document.getElementsByClassName('count-down ng-star-inserted')[0].innerText == "已完成") { console.log("视频播放完成,返回章节页面"); var chapterUrl = getChapterListUrl(); if (chapterUrl) { window.location.href = chapterUrl; } else { window.history.back(); } } } } setInterval(play, 1000) })();