// ==UserScript== // @name [25-04-02] 青书学堂自动看课 // @namespace http://tampermonkey.net/ // @version 0.4 // @description 检测网页视频自动播放并设置0.5倍速,播放完毕后自动下一节课.有问题提Issue,时不时看到会修 // @author Hu5 // @run-at document-start // @no_frames true // @match *://*.qingshuxuetang.com/* // @downloadURL none // ==/UserScript== (function() { 'use strict'; async function main() { // 查找所有的课程ID const kcjsIds = findAllKcjsIds(); function findAllKcjsIds() { const allElements = document.querySelectorAll('*'); // 获取文档中的所有元素 const matchingIds = []; for (let i = 0; i < allElements.length; i++) { const element = allElements[i]; if (element.id && element.id.startsWith("courseware-kcjs_")) { matchingIds.push(element.id.replace("courseware-", "")); } } return matchingIds; } const observer = new MutationObserver(async (mutationsList, observer) => { for (const mutation of mutationsList) { if (mutation.type === 'childList') { const videoElement = document.querySelector('#vjs_video_3_html5_api'); if (videoElement) { observer.disconnect(); // 开始播放 videoElement.autoplay = true; // 慢倍速播放凑时长 videoElement.playbackRate = 0.5; // 静音 videoElement.muted = "muted"; // 等待视频播放完毕自动下一个视频 videoElement.onended = () => { // 解析当前的课程ID const nodeId = (new URL(document.URL)).searchParams.get("nodeId") // 下一节课的ID const nextNodeId = kcjsIds[kcjsIds.indexOf(nodeId) + 1] // 如果还有下一节课,继续看 if (nextNodeId) { // 下一节课 CoursewareNodesManager.onMenuClick(nextNodeId) } else { // 没有就是看完了,不再继续 console.log('看完啦!'); } } ; // 确保视频加载后播放(某些情况下可能需要) if (videoElement.readyState >= 2) { // HAVE_CURRENT_DATA videoElement.play().catch(error => { console.error("播放失败:", error); } ); } else { videoElement.addEventListener('loadeddata', () => { videoElement.play().catch(error => { console.error("播放失败:", error); } ); } ); } return; // 找到元素并处理后,退出观察器回调 } } } } ); // 开始观察 document.body 或更具体的父元素 observer.observe(document.body, { childList: true, subtree: true }); // 当前学习类型,如果不是video,自动跳到video let nodeInfo = document.querySelector("body").innerHTML.match(/var nodeInfo = ({.*?})/) // 不是相关网页搜不到 if (!nodeInfo) return let nodeType = JSON.parse(nodeInfo[1]).type if (nodeType != "video" && confirm("当前不是视频学习,是否跳转到视频第一课?")) { CoursewareNodesManager.onMenuClick(kcjsIds[0]) } } window.onload = main; } )();