// ==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 = `
山东大众云学 - 免费版
等待检测视频...
🔥 一次付费,永久使用,免费维护
如需使用全功能版本,请通过地址安装付费版本购买授权后可使用
付费版:自动下一集、自动换课程、考试答题、全自动无人值守
👉 点击查看付费版本
接各类脚本开发、代挂、网站小程序开发工作,微信:zhanyc_cn
`; $("body").append(panelHtml); $("#mqr_closeBtn").on("click", function () { $("#mqr_panel").remove(); }); }, updatePanelStatus(text, color) { $("#mqr_status").text(text).css("background", color ? (color + "33") : "rgba(241,163,37,0.3)"); }, updatePanelProgress(curTime, totalTime, pct) { $("#mqr_progressBox").show(); $("#mqr_progressFill").css("width", pct + "%"); let curFmt = mqr.formatTime(curTime); let totalFmt = mqr.formatTime(totalTime); $("#mqr_progressText").text(curFmt + " / " + totalFmt + " (" + pct + "%)"); }, formatTime(seconds) { seconds = Math.floor(seconds); let h = Math.floor(seconds / 3600); let m = Math.floor((seconds % 3600) / 60); let s = seconds % 60; return (h < 10 ? "0" + h : h) + ":" + (m < 10 ? "0" + m : m) + ":" + (s < 10 ? "0" + s : s); }, waitPageLoad() { return new Promise((resolve) => { let check = setInterval(() => { if ($("body").length > 0) { clearInterval(check); resolve(); } }, 500); }); }, }; setTimeout(() => { if (typeof (zfk) == 'undefined') { mqr.init(); } else { console.log('skip init'); } }, 3000); })();