// ==UserScript== // @name 芯位教育自动刷课 // @namespace https://gitee.com/CreativeNew/ // @version 1.0.0 // @description 芯位教育网课自动跳转到下一节课 // @author XuTao. // @match https://teaching.51xinwei.com/* // @icon https://teaching.51xinwei.com/* // @grant none // @run-at document-end // @license AGPL-3.0 license // @downloadURL none // ==/UserScript== (function() { 'use strict'; })(); const body = document.querySelector('body'); let obServer = new MutationObserver(handler); const options = { childList: true } obServer.observe(body, options) function handler(mutationRecordList) { for (let i = 0; i < mutationRecordList.length; i++) { let addedNodes = mutationRecordList[i].addedNodes for (let i = 0; i < addedNodes.length; i++) { if (addedNodes[i].innerText.indexOf('学习下一课节') > 0) { //单击下一节课按钮 obsClick('.layui-layer.layui-layer-dialog .layui-layer-btn0'); break; } } } //检测是否为预览文档页 obsText('#page_learn_courseware_document .transcode-file-area.text-center', '该文档类型不支持预览,请点击 这里 下载文档') .then((res) => { let courseChapterItem = document.querySelectorAll('.course_chapter_item.user-no-select.ng-scope') let activeItem = document.querySelector('.course_chapter_item.user-no-select.ng-scope.active') let activeItemText = activeItem.innerText for (let i = 0; i < courseChapterItem.length; i++) { if (activeItemText == courseChapterItem[i].innerText) { courseChapterItem[i + 1].children[1].click() break; } } }) } let obsClickTimer = null /** * 监测到节点后点击 * @param selector CSS选择器 * @returns {Promise} */ function obsClick(selector) { return new Promise((resolve, reject) => { let startExecutionTime = new Date().getTime() if (obsClickTimer) { clearInterval(obsClickTimer) } obsClickTimer = setInterval(() => { let target = document.querySelector(selector) if (target) { clearInterval(obsClickTimer) target.click() resolve({ element: selector, operation: 'click' }) } else { return } let executionTime = new Date().getTime() if (startExecutionTime - executionTime > 1000 * 10) { clearInterval(obsClickTimer) reject('超时') } }, 500) }) } let obsTextTimer = null /** * 监测节点内容 * @param selector CSS选择器 * @param text 节点内容 * @returns {Promise} */ function obsText(selector, text) { return new Promise((resolve, reject) => { let startExecutionTime = new Date().getTime() if (obsTextTimer) { clearInterval(obsTextTimer) } obsTextTimer = setInterval(() => { let target = document.querySelector(selector) if (target && target.textContent.trim() == text) { clearInterval(obsTextTimer) resolve(selector) } else { return } let executionTime = new Date().getTime() if (startExecutionTime - executionTime > 1000 * 10) { clearInterval(obsTextTimer) reject('超时') } }, 500) }) }