// ==UserScript== // @name 广东二师在线|免费版本|如需自动下一集、自动换课程、秒过、考试答题等高级功能见收费版本:http://doc.zhanyc.cn/pages/gdeszx/ // @version 1.0 // @description 当前是免费版本,只包含了视频页面自动播放、解除播放暂停限制功能。如需自动下一集、自动换课程、秒过、考试答题、全自动无人值守高级功能可升级付费版本|接各类脚本开发、代挂工作,微信:zhanyc_cn 个人网站:http://doc.zhanyc.cn // @author zfk // @include *://*gdei.edu.cn* // @include *://*.gdei.edu.cn/* // @grant GM_getValue // @grant GM_setValue // @grant GM_addStyle // @grant GM_deleteValue // @run-at document-end // @require http://libs.baidu.com/jquery/2.0.0/jquery.min.js // ==/UserScript== (function () { "use strict"; let $jq = $; unsafeWindow.$jq = $; let docUrl = "http://doc.zhanyc.cn/pages/gdeszx/"; let isDev = false; let gdesFree = { pageData: { video: { index: null, checkIndex: null, isPlaying: false, progress: "0/0", }, waitTime: 0, }, async init() { gdesFree.addStyle(); gdesFree.begin("iamzhankuo"); }, begin(key) { if (key != "iamzhankuo") return; gdesFree.showFreePanel(); let lastUrl = location.href; setInterval(() => { if (lastUrl != location.href) { lastUrl = location.href; gdesFree.runByUrl(location.href); } }, 500); gdesFree.runByUrl(location.href); }, async runByUrl(url) { if (/\/study\/[0-9a-zA-Z]+\/activity/.test(url)) { gdesFree.page_video(); } else if (url.toLowerCase().includes("/study/course/".toLowerCase())) { gdesFree.page_video2(); } }, async page_video() { gdesFree.closeWaitConfrimWin(); console.log("%c page_video", "background:rgb(0,0,0);color:#fff"); let timeout = 2; let lastTime = null; let checkTimeTimesBak = 60; let checkTimeTimes = checkTimeTimesBak; gdesFree.closeWaitConfrimWin(); if (gdesFree.pageData.video.index != null) return; await gdesFree.waitOf((a) => $(".item4:visible").length > 0); await gdesFree.waitTimeout(1000); if (!$(".item4.active").length > 0) { $(".item4:visible").eq(0).find("a")[0].click(); } setTimeout(async () => { let time = gdesFree.getCurTime(); await gdesFree.waitTimeout(5000); if (gdesFree.getCurTime() == time) { console.log("视频可能卡住了,准备刷新"); setTimeout(() => location.reload(), 3000); } }, 60 * 1000); gdesFree.pageData.video.index = setInterval(async () => { try { if (gdesFree.pageData.waitTime > 0) { gdesFree.pageData.waitTime -= timeout; return; } // 弹窗点确认:检测多浏览器播放 if ( gdesFree.getElByText( $(".ant-modal-confirm-content"), "检测到在多个浏览器中同时播放视频!" ) != null ) { location.reload(); return; } // 弹窗点确认:请刷新后重试 if ( gdesFree.getElByText($(".ant-modal-body div"), "请刷新后重试") != null ) { location.reload(); return; } if (!gdesFree.getVideo()) { console.log("%c zfk no video", "background:rgb(0,0,0);color:#fff"); return; } // 检测当前视频是否已完成 if ( $(".item4.active").find(".icon-icon_finish_R:visible").length > 0 ) { gdesFree.pageData.waitTime = 30; console.log("当前视频完成,3秒后刷新"); setTimeout(() => location.reload(), 3000); return; } let curTime = gdesFree.getCurTime(); if (curTime == lastTime) { lastTime = gdesFree.getCurTime(); checkTimeTimes -= timeout; if (checkTimeTimes <= 0) { checkTimeTimes = checkTimeTimesBak; console.log("貌似卡死了,准备刷新页面"); setTimeout(() => location.reload(), 3000); gdesFree.pageData.waitTime = 10; return; } } else { lastTime = curTime; checkTimeTimes = checkTimeTimesBak; } // 静音 gdesFree.getVideo().volume = 0; // 更新进度 let cur = gdesFree.getCurTime().toFixed(0); let total = gdesFree.getTotalTime().toFixed(0); let title = "进度:" + cur + "/" + total; $("title").text(title); gdesFree.pageData.video.progress = cur + "/" + total; // 刷新悬浮面板进度 gdesFree.updatePanelProgress(); console.log("%c video run", "background:rgb(255,0,0);color:#fff"); // 弹窗点确认:平台实时在线学习弹窗 let $tips = gdesFree.getElByText( ".layui-layer-content p", "您好,本平台要求实时在线学习,点击按钮,继续学习课程。" ); if ($tips != null) { $tips.parents(".layui-layer").find(".layui-layer-btn0")[0].click(); console.log("已点击继续学习按钮"); } let isFinish = await gdesFree.isPlayFinish(); if (isFinish) { gdesFree.pageData.waitTime = 15; console.log("视频即将结束"); return; } // 解除播放暂停限制 let isPlay = await gdesFree.videoIsPlay(); if (!isPlay && !isFinish) { gdesFree.play(); } } catch (e) { console.error("视频页面定时器出错", e); } }, timeout * 1000); }, async page_video2() { console.log("%c page_video2", "background:rgb(0,0,0);color:#fff"); let timeout = 2; let lastTime = null; let checkTimeTimesBak = 60; let checkTimeTimes = checkTimeTimesBak; gdesFree.closeWaitConfrimWin(); await gdesFree.waitOf((a) => $(".lfNav-s>a").length > 0); await gdesFree.waitTimeout(1000); if (gdesFree.pageData.video.index != null) return; clearTimeout(gdesFree.pageData.video.checkIndex); gdesFree.pageData.video.checkIndex = setTimeout(async () => { let time = gdesFree.getCurTime(); await gdesFree.waitTimeout(5000); if (gdesFree.getCurTime() == time) { console.log("视频可能卡住了,准备刷新"); setTimeout(() => location.reload(), 3000); } }, 60 * 1000); gdesFree.pageData.video.index = setInterval(async () => { try { if (gdesFree.pageData.waitTime > 0) { gdesFree.pageData.waitTime -= timeout; return; } // 弹窗点确认:长时间停留弹窗 if ( gdesFree.getElByText( $(".mylayer-content"), "您在本页面的停留很长时间了,系统将在15分钟后自动退出登录,是否继续学习?" ) != null ) { gdesFree .getElByText( $(".mylayer-content"), "您在本页面的停留很长时间了,系统将在15分钟后自动退出登录,是否继续学习?" ) .parents(".mylayer-layer:first") .find("button") .click(); console.log("已点击继续学习按钮"); return; } if (!gdesFree.getVideo()) { console.log("%c zfk no video", "background:rgb(0,0,0);color:#fff"); return; } let curTime = gdesFree.getCurTime(); if (curTime == lastTime) { lastTime = gdesFree.getCurTime(); checkTimeTimes -= timeout; if (checkTimeTimes <= 0) { checkTimeTimes = checkTimeTimesBak; console.log("貌似卡死了,准备刷新页面"); setTimeout(() => location.reload(), 3000); gdesFree.pageData.waitTime = 10; return; } } else { lastTime = curTime; checkTimeTimes = checkTimeTimesBak; } // 静音 gdesFree.getVideo().volume = 0; // 更新进度 let cur = gdesFree.getCurTime().toFixed(0); let total = gdesFree.getTotalTime().toFixed(0); let title = "进度:" + cur + "/" + total; $("title").text(title); gdesFree.pageData.video.progress = cur + "/" + total; // 刷新悬浮面板进度 gdesFree.updatePanelProgress(); console.log("%c video run", "background:rgb(255,0,0);color:#fff"); let isFinish = await gdesFree.isPlayFinish(); if (isFinish) { gdesFree.pageData.waitTime = 15; console.log("视频即将结束,准备刷新"); setTimeout(() => location.reload(), 5000); return; } // 解除播放暂停限制 let isPlay = await gdesFree.videoIsPlay(); if (!isPlay && !isFinish) { gdesFree.play(); } } catch (e) { console.error("视频页面定时器出错", e); } }, timeout * 1000); }, play() { gdesFree.getVideo().volume = 0; setTimeout(() => { gdesFree.getVideo().play(); gdesFree.pageData.video.isPlaying = true; gdesFree.updatePanelStatus(); }, 200); }, getVideo() { return $("video")[0]; }, isPlayFinish() { try { return ( gdesFree.getTotalTime() > 0 && gdesFree.getCurTime() + 5 >= gdesFree.getTotalTime() ); } catch (e) { return false; } }, getCurTime() { let res = 0; try { res = gdesFree.getVideo().currentTime; } catch (e) { console.error(e); } return res; }, getTotalTime() { let res = 0; try { res = gdesFree.getVideo().duration; } catch (e) { console.error(e); } return res; }, async videoIsPlay() { return new Promise((resolve) => { try { let curTime = $("video")[0].currentTime; setTimeout(() => { let time1 = $("video")[0].currentTime; let res = time1 > curTime; if (res) { setTimeout(() => { let time2 = $("video")[0].currentTime; let res2 = time2 > time1; resolve(res2); }, 100); } else { return resolve(false); } }, 100); } catch (e) { resolve(false); } }); }, closeWaitConfrimWin() { gdesFree.setGMData("closeLJTS", gdesFree.now()); }, // 悬浮引流面板 showFreePanel() { setTimeout(() => { if ($("#zfkFreePanel").length > 0) return; let panelHtml = '
' + '
' + '广东二师在线脚本(免费版)' + '×' + "
" + '
等待视频加载...
' + '
进度:--/--
' + '
' + "[免费功能] 解除视频暂停限制、自动播放
" + "
" + '
' + "[付费功能] 自动下一集、自动换课程、秒过、考试答题、全自动无人值守
" + '查看付费版本' + "
" + '
' + "接各类脚本开发、代挂、网站小程序开发工作
微信:zhanyc_cn" + "
" + "
"; $("body").append(panelHtml); $("#zfkFreePanelClose").click(function () { $("#zfkFreePanel").remove(); }); }, 1000); // 定期检测视频并更新面板状态 setInterval(() => { gdesFree.updatePanelStatus(); gdesFree.updatePanelProgress(); }, 2000); }, updatePanelStatus() { let $status = $("#zfkFreePanelStatus"); if ($status.length == 0) return; let video = gdesFree.getVideo(); if (!video) { $status.text("[等待中] 等待视频加载...").css("color", "#aaa"); return; } if (gdesFree.pageData.video.isPlaying || !video.paused) { $status.text("[播放中] 视频播放中...").css("color", "#0f0"); gdesFree.pageData.video.isPlaying = true; } else { $status.text("[已暂停] 视频已暂停(脚本将自动恢复播放)").css("color", "#ff0"); } }, updatePanelProgress() { let $progress = $("#zfkFreePanelProgress"); if ($progress.length == 0) return; let cur = gdesFree.getCurTime().toFixed(0); let total = gdesFree.getTotalTime().toFixed(0); if (total > 0) { let pct = ((cur / total) * 100).toFixed(1); $progress.html( '进度:' + cur + "/" + total + ' (' + pct + "%)" ); } else { $progress.text("进度:--/--"); } }, waitOf(fun, interval, timeout) { if (interval === undefined) interval = 1000; if (timeout === undefined) timeout = 30; console.log("%c waitOf", "background:rgb(0,0,0);color:#fff", fun); return new Promise((resolve, reject) => { let _timeOut = timeout * 1000; try { if (fun()) return resolve(); } catch (e) { console.error(e); } let index = setInterval(() => { try { if (timeout != -1) { _timeOut -= interval; if (_timeOut < 0) { clearInterval(index); return reject(); } } if (fun()) { clearInterval(index); return resolve(); } } catch (e) { console.error(e); } }, interval); }); }, waitTimeout(timeout) { return new Promise((resolve) => { setTimeout(() => { resolve(); }, timeout); }); }, getElByText(query, text, mode, visible) { if (mode === undefined) mode = "eq"; if (visible === undefined) visible = true; let $el = null; text = text.trim(); $(query).each(function (i, el) { if (visible && !$(el).is(":visible")) return true; if (mode == "eq" && $(el).text().trim() == text) { $el = $(el); return false; } else if (mode == "startsWith" && $(el).text().trim().startsWith(text)) { $el = $(el); return false; } else if (mode == "endsWith" && $(el).text().trim().endsWith(text)) { $el = $(el); return false; } }); return $el; }, setGMData(item, val) { return GM_setValue(item, val); }, getGMData(item, def) { return GM_getValue(item, def); }, delGMData(item) { return GM_deleteValue(item); }, now() { return new Date().getTime(); }, addStyle() { GM_addStyle( '#zfkFreePanel *{box-sizing:border-box;line-height:1.5;}#zfkFreePanel a{color:#00ccff;}#zfkFreePanel a:hover{color:#66ddff;}' ); }, }; // 等待 DOM 就绪后初始化 if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", function () { gdesFree.init(); }); } else { gdesFree.init(); } if (!unsafeWindow.gdesFree) unsafeWindow.gdesFree = gdesFree; })();