// ==UserScript== // @name 山东大众云学|如需自动下一集、自动换课程、考试答题等高级功能见收费版本:http://doc.zhanyc.cn/pages/dzyx/ // @namespace free // @version 1.0 // @description 当前是免费版本,只包含了视频进度检测和解除视频暂停限制功能。如需自动下一集、自动换课程、考试答题等高级功能可升级付费版本|接各类脚本开发、代挂任务,微信:zhanyc_cn 个人网站:http://doc.zhanyc.cn // @include *://*.yxlearning.com/* // @grant GM_addStyle // @run-at document-end // @require http://libs.baidu.com/jquery/2.0.0/jquery.min.js // ==/UserScript== (function () { let docUrl = "http://doc.zhanyc.cn/pages/dzyx/"; let mqr = { pageData: { videoTimer: null, stuckCount: 0, lastTime: -1, }, async init() { console.log("%c mqr init", "background:rgb(0,0,0);color:#fff"); await mqr.waitPageLoad(); mqr.createPanel(); if (location.href.toLowerCase().includes("/learning/index?myclassid=")) { mqr.startVideoMonitor(); } }, startVideoMonitor() { if (mqr.pageData.videoTimer != null) return; mqr.updatePanelStatus("正在检测视频...", "#f1a325"); mqr.pageData.videoTimer = setInterval(async () => { try { let video = mqr.getVideoEl(); if (!video) return; let curTime = video.currentTime; let totalTime = video.duration; if (curTime > 0 && totalTime > 0) { let pct = Math.min((curTime / totalTime * 100), 100).toFixed(1); mqr.updatePanelProgress(curTime, totalTime, pct); mqr.updatePanelStatus("视频播放中", "#38b03f"); video.volume = 0; if (video.paused) { try { video.play(); } catch (e) { } mqr.updatePanelStatus("已自动恢复播放", "#38b03f"); } if (totalTime > 0 && curTime + 3 >= totalTime) { mqr.updatePanelStatus("视频即将播放完毕", "#ea644a"); } if (curTime == mqr.pageData.lastTime) { mqr.pageData.stuckCount++; if (mqr.pageData.stuckCount > 60) { mqr.updatePanelStatus("视频疑似卡住,请检查", "#ea644a"); mqr.pageData.stuckCount = 0; } } else { mqr.pageData.stuckCount = 0; } mqr.pageData.lastTime = curTime; } } catch (e) { console.error("视频检测出错", e); } }, 1000); }, getVideoEl() { try { return $("video")[0]; } catch (e) { return null; } }, createPanel() { GM_addStyle(` #mqr_panel{position:fixed;left:10px;top:10px;z-index:2147483647;background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);border-radius:8px;padding:12px 16px;min-width:280px;max-width:360px;color:#fff;font-family:microsoft yahei,sans-serif;box-shadow:0 4px 15px rgba(0,0,0,0.3);font-size:14px;line-height:1.6} #mqr_panel .mqr_title{font-size:16px;font-weight:bold;margin-bottom:8px;border-bottom:1px solid rgba(255,255,255,0.3);padding-bottom:6px} #mqr_panel .mqr_status{padding:4px 8px;border-radius:4px;margin:4px 0;font-weight:bold} #mqr_panel .mqr_progress{background:rgba(0,0,0,0.2);border-radius:4px;padding:8px;margin:6px 0} #mqr_panel .mqr_progress_bar{background:rgba(255,255,255,0.2);border-radius:3px;height:16px;overflow:hidden;margin:4px 0} #mqr_panel .mqr_progress_fill{background:linear-gradient(90deg,#00f260,#0575e6);height:100%;border-radius:3px;transition:width 0.5s ease;min-width:0} #mqr_panel .mqr_promo{margin-top:8px;padding-top:8px;border-top:1px solid rgba(255,255,255,0.3);font-size:12px} #mqr_panel .mqr_promo a{color:#ffd700;text-decoration:underline} #mqr_panel .mqr_close{position:absolute;top:4px;right:8px;background:none;border:none;color:#fff;font-size:18px;cursor:pointer;padding:0;line-height:1} #mqr_panel .mqr_close:hover{opacity:0.7} `); let panelHtml = `