// ==UserScript== // @name 学起Plus挂课自动连续播放 // @namespace http://tampermonkey.net/ // @version 0.122 // @description 一个网课挂机自动连续播放工具,仅适用于学起Plus sccchina.net chinaedu.net,反馈与交流QQ群:715307684 // @author 哆哆啦啦梦 // @match *://*.sccchina.net/* // @match *://rspcourse.chinaedu.net/* // @icon https://www.google.com/s2/favicons?sz=64&domain=chinaedu.net // @grant none // @license GPLv3 // @downloadURL none // ==/UserScript== const timeInterval = 5 * 1000; let lessionInfo = {}; let videoModuleInfo = {}; let lessionResAll = []; let currRes = undefined; let courseEnd = false; let nextRes = null; function getLessionRes(arr) { arr.forEach((e) => { if (e.res) { for (let item of e.res) { item.name = e.name + ' - ' + item.name; // 添加到数组 lessionResAll.push(item); } } if (e.child) { getLessionRes(e.child); } }); } function checkCoursePage() { if (lessionResAll && lessionResAll.length) { // 取出第一个 const firstRes = lessionResAll[0]; // 查询是否元素存在 if (document.querySelector(`li[nid='${firstRes.id}']`) === null) { // 不存在,代表非视频页 // 获取当前选中的模块 const active = document.querySelector("li.fl.cur"); if (!active || active.getAttribute("nid") !== videoModuleInfo.id) { console.log( `当前课程模块不是视频模块!即将转到视频模块,ID:${videoModuleInfo.id}` ); // 查找视频模块标签并点击 document.querySelector(`li[nid='${videoModuleInfo.id}']`).click(); } } } } function getNext() { // 获取当前res在全部res中的索引并加1指向下一个 const index = lessionResAll.findIndex((e) => e.id === currRes.id) + 1; if (index < lessionResAll.length) { // 下一个res const nextRes = lessionResAll[index]; console.log("即将播放下一个RES:", nextRes); // 生成新的src let nextSrc = undefined; if (nextRes.type === "video") { nextSrc = `com/video.html?url=${nextRes.url}&pos=0&cid=${nextRes.id}`; } else if (nextRes.type === "sfp") { nextSrc = `com/video.html?url=${nextRes.url}&pos=null&msg=null`; } else { console.log("未知RES类型:", nextRes); } return nextSrc; } return undefined; } function updateCurrRes() { // 获取课程内容容器 const courseCon = document.querySelector(".courseCon iframe"); if (courseCon === null) { // 检查是否课程页面 return checkCoursePage(); } // 获取加载的地址 const iframeSrc = courseCon.getAttribute("src"); // 根据src获取对应课程res信息 // lessionResAll -> 元素 -> url 中的空格会被编码,所以需要 decodeURI const getRes = lessionResAll.find( (e) => decodeURI(iframeSrc).indexOf(decodeURI(e.url)) >= 0 ); // 检查是否匹配到视频res if (getRes === undefined) { // 检查是否课程页面 return checkCoursePage(); } if (currRes === undefined || currRes.id !== getRes.id) { // 设置currRes currRes = getRes; console.log("当前加载的课程URL:", iframeSrc); console.log("当前课程的RES:", currRes); // 查找导航条 const breadcrumb = document.querySelector(".page-breadcrumb"); // 设置标题 breadcrumb && (breadcrumb.innerHTML = `当前正在播放:${currRes.name}`); // 设置内容类型 sessionStorage.setItem("contentType", currRes.type); } } function gotoNext() { // 获取视频状态 const status = sessionStorage.getItem("play"); if (status !== null && !courseEnd) { // 判断是否为end if (sessionStorage.getItem("play") === "end") { // 获取下一个地址 const nextUrl = getNext(); if (nextUrl) { // 获取课程内容容器 const courseCon = document.querySelector(".courseCon iframe"); // 设置新的src courseCon.setAttribute("src", nextUrl); } else { if (!courseEnd) { courseEnd = true; alert("播放结束,不存在下一个播放视频"); console.log("播放结束,不存在下一个播放视频"); } } } // 移除掉,避免再次错误判断 sessionStorage.removeItem("play"); } } function findLession() { // 延迟执行 setTimeout(() => { // 处理弹窗 const pop = document.querySelector("#pop"); // 存在就点击关闭按钮 pop && pop.querySelector(".pop_close").click(); // 处理课程信息 if (!courseInfo) { return alert("获取当前课程信息失败!"); } // 提取课程信息 lessionInfo = { id: courseInfo.id, name: courseInfo.name, }; console.log(`当前课程:${lessionInfo.name},ID:${lessionInfo.id}`); // 提取课程模块 const module = courseInfo.child.$model; console.log("模块信息:", module); // 查找视频模块索引 const index = module.findIndex( (e) => e.name === "视频学习" || (e.code && e.code === "course") ); // 提取视频模块信息 videoModuleInfo = { id: module[index].id, name: module[index].name, }; console.log("视频模块信息:", videoModuleInfo); // 提取课程Res getLessionRes(module[index].child); console.log("课程Res信息:", lessionResAll); }, timeInterval); // 定时执行 setInterval(() => { // 更新currRes updateCurrRes(); // 符合条件跳到下一个 gotoNext(); }, timeInterval); } function checkWorkTime() { // 不检查时间 return true; const hour = new Date().getHours(); if (hour < 9 || hour > 22) { return false; } else { return true; } } function courseLearn() { const getVideoProgress = () => { // 获取视频元素 const video = document.querySelector("video"); if (!checkWorkTime()) { const hour = new Date().getHours(); const mins = new Date().getMinutes(); // 非工作时间 console.log("非工作时间:", hour, mins); // 暂停 情况下 播放视频 !video.paused && video.pause(); return; } // 设置静音 video.muted = true; // 获取当前播放进度和视频长度 保留一位小数 const currentTime = video.currentTime.toFixed(1); const totalTime = video.duration.toFixed(1); console.log(`当前进度:${currentTime}/${totalTime}`); if (currentTime < totalTime - 5) { // 视频没有播放完 if (video.paused) { console.log("视频被暂停,继续播放!"); video.play(); } else { // 设置视频状态 播放 sessionStorage.setItem("play", "start"); } } else { // 视频播放完毕 console.log("视频播放完毕!"); // 设置标记 播放完毕 sessionStorage.setItem("play", "end"); } }; // 定时执行 setInterval(() => { // 获取内容类型 const type = sessionStorage.getItem("contentType"); if (type !== null) { if (type === "video") { getVideoProgress(); } else if (type === "sfp") { // 设置标记 播放完毕 sessionStorage.setItem("play", "end"); } else { console.log("未知内容类型:", type); } } }, timeInterval); } (function () { "use strict"; const url = document.URL; if (url.indexOf("//rspcourse.chinaedu.net/") !== -1 || url.indexOf(".sccchina.net/") !== -1) { if (url.indexOf("/play.html") >= 0) { // 课件页面,查找课程 findLession(); } else { // 课程学习 courseLearn(); } } else { console.log("未知页面"); } })();