// ==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 = '