Greasy Fork

山东省教师教育网2025中小学远程研修(全自动学习)

山东省教师教育网2025中小学远程研修,有问题可以联系我 微信:founderqiang

当前为 2025-06-28 提交的版本,查看 最新版本

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