// ==UserScript== // @name 汕头大学自动看课脚本|如需全功能版本见:http://doc.zhanyc.cn // @version 1.0-free // @description 当前是免费版本,只包含了视频页面自动播放、解除播放暂停限制功能。如需自动下一集、自动换课程、秒过、考试答题、全自动无人值守高级功能可升级付费版本|接各类脚本开发、代挂工作,微信:zhanyc_cn 备用微信:zhanfengkuo 个人网站:http://doc.zhanyc.cn // @author zfk // @include *://*.5zk.com.cn/* // @include *://*.gdcxxy.net/* // @include *://m.zhanyc.cn/* // @grant GM_getValue // @grant GM_setValue // @grant GM_addStyle // @grant GM_deleteValue // @grant GM_setClipboard // @grant GM_registerMenuCommand // @grant window.close // @run-at document-end // @require http://libs.baidu.com/jquery/2.0.0/jquery.min.js // ==/UserScript== (function () { let $jq = $; unsafeWindow.$jq = $; const docUrl = "http://doc.zhanyc.cn"; let FREEJS = { pageData: { userNameIndex: null, confirmRunIndex: null, waitTime: 0, video: { index: null, }, }, async init() { console.log("%c FREEJS init", "background:rgb(0,0,0);color:#fff"); FREEJS.addFloatingPanel(); FREEJS.addStyle(); if (location.href.indexOf("loginSuccess.html?yh=") != -1) { console.log("%c loginSuccess.html?yh", "background:rgb(255,0,0);color:#fff"); return; } FREEJS.begin(); }, begin() { if (window === top) { FREEJS.addMenu(); } FREEJS.runByUrl(location.href); }, runByUrl(url) { if (url.includes("/jp_wiki_study") || url.includes("/wiki_study.php")) { FREEJS.page_video(); } else if (url.includes("/wiki_study_iframe_kt.php")) { FREEJS.page_wiki_study_iframe_kt(); } else if (url.includes("/zb_wiki_study.php")) { FREEJS.zb_wiki_study(); } else if (url.includes("/live.php")) { FREEJS.wk_live(); } }, async zb_wiki_study() { FREEJS.closeWaitConfrimWin() console.log("%c zb_wiki_study", "background:rgb(0,0,0);color:#fff"); let timeout = 2; let lastTime = null; let checkTimeTimesBak = 60; let checkTimeTimes = checkTimeTimesBak; FREEJS.closeWaitConfrimWin(); if (FREEJS.pageData.video.index != null) { return; } setTimeout(async () => { let time = FREEJS.getCurTime() await FREEJS.waitTimeout(5000) if (FREEJS.getCurTime() == time) { alert("貌似卡主了,请刷新页面重试"); } }, 60 * 1000); FREEJS.pageData.video.index = setInterval(async () => { try { if (FREEJS.pageData.waitTime > 0) { FREEJS.pageData.waitTime -= timeout; return; } if (!FREEJS.getVideo()) { console.log("%c FREEJS no video", "background:rgb(0,0,0);color:#fff"); return; } let curTime = FREEJS.getCurTime(); if (curTime == lastTime) { lastTime = FREEJS.getCurTime(); checkTimeTimes -= timeout; if (checkTimeTimes <= 0) { checkTimeTimes = checkTimeTimesBak; alert("貌似卡死了,请刷新页面重试"); FREEJS.pageData.waitTime = 10; return; } } else { lastTime = curTime; checkTimeTimes = checkTimeTimesBak; } FREEJS.getVideo().volume = 0; let cur = FREEJS.getCurTime().toFixed(0); let total = FREEJS.getTotalTime().toFixed(0); let title = `进度:${cur}/${total}`; $("title").text(title); FREEJS.updateProgress(cur, total); console.log("%c video run", "background:rgb(255,0,0);color:#fff"); let $tips = FREEJS.getElByText( ".layui-layer-content p", "您好,本平台要求实时在线学习,点击按钮,继续学习课程。" ); if ($tips != null) { $tips.parents(".layui-layer").find(".layui-layer-btn0")[0].click(); } let isFinish = await FREEJS.isPlayFinish(); if (isFinish) { FREEJS.pageData.waitTime = 15; FREEJS.tipsMsg("视频即将结束"); setTimeout(() => { if (FREEJS.pageData.video.index) { clearInterval(FREEJS.pageData.video.index); FREEJS.pageData.video.index = null; } }, 10 * 1000); return; } let isPlay = await FREEJS.videoIsPlay(); if (!isPlay) { if (!isFinish) { FREEJS.play(); } } } catch (e) { console.error("视频页面定时器出错", e); } }, timeout * 1000); }, async wk_live() { console.log("%c wk_live", "background:rgb(0,0,0);color:#fff"); FREEJS.closeWaitConfrimWin() await FREEJS.waitOf((a) => $(".block-content table tr").length > 0); await FREEJS.waitTimeout(1000) let $el = null; $(".block-content table tr").each((i, el) => { let $btn = FREEJS.getElByText($(el).find('a'), "查看直播回放") if ($btn == null) return true; let jd = Number($btn.parents('td:first').next().text().trim().replace('%', '')) if (jd < 100) { $el = $btn; return false; } }); if ($el == null) { FREEJS.tipsMsg("学习完成"); return; } FREEJS.confirmRun("3秒后执行下一步", 3000).then((a) => { $el[0].click(); }); }, async page_wiki_study_iframe_kt() { FREEJS.closeWaitConfrimWin() await FREEJS.waitOf((a) => FREEJS.getElByText($("button"), "提交答案") != null); await FREEJS.waitTimeout(1000); let answer = $("#resolve").text().trim().replace("正确答案:", ""); $(`label input[value='${answer}']`).click(); await FREEJS.waitTimeout(500); FREEJS.getElByText($("button"), "提交答案").click(); await FREEJS.waitTimeout(2000); FREEJS.tipsMsg("答题完毕,请手动提交"); }, async page_video() { console.log("%c page_video", "background:rgb(0,0,0);color:#fff"); FREEJS.closeWaitConfrimWin() let timeout = 2; await FREEJS.waitOf((a) => $("ul.list>li").length > 0); let $item = null; $("ul.list>li").each((i, el) => { if (/[\d:]+\/[\d:]+/.test($(el).text().trim())) { let jdTxt = $(el).text().trim().replace(/\s/g, '').replace(/.*\(([\d:]+\/[\d:]+)\).*/g, '$1') let jdTxtArr = jdTxt.split('/') if (jdTxtArr[0] == jdTxtArr[1]) { return true } $item = $(el); return false; } let $finishItem = $(el).find('a>span[style="color:#00A600;"]'); if ($finishItem.length == 0) { $item = $(el); return false; } }); if ($item == null) { FREEJS.tipsMsg("当前课程视频已经完成"); return; } else { if ($item.find('i.si-control-play').length == 0 && $item.find('[style="color:#00A600;"]').length == 0) { $item.find("a")[0].click() } } FREEJS.pageData.video.index = setInterval(async () => { try { if (FREEJS.pageData.waitTime > 0) { FREEJS.pageData.waitTime -= timeout; return; } let cur = FREEJS.getCurTime().toFixed(0); let total = FREEJS.getTotalTime().toFixed(0); let title = `进度:${cur}/${total}`; $("title").text(title); FREEJS.updateProgress(cur, total); console.log("%c video run", "background:rgb(255,0,0);color:#fff"); if ( FREEJS.getElByText( $("div"), "本章不需要进行课堂测试,请继续学习!", "endsWith" ) != null ) { FREEJS .getElByText( $("div"), "本章不需要进行课堂测试,请继续学习!", "endsWith" ) .parents(".layui-layer-dialog") .find("a.layui-layer-btn0")[0] .click(); } let isFinish = await FREEJS.isPlayFinish(); if (isFinish) { FREEJS.tipsMsg("视频即将结束"); FREEJS.pageData.waitTime = 15; if (FREEJS.pageData.video.index) { clearInterval(FREEJS.pageData.video.index); FREEJS.pageData.video.index = null; } return; } let isPlay = await FREEJS.videoIsPlay(); if (!isPlay) { if (!isFinish) { if ($("#tcaptcha_transform>visible").length == 0) { FREEJS.play(); } } } } catch (e) { console.error("视频页面定时器出错", e); } }, timeout * 1000); }, // ---- 悬浮引流面板 ---- addFloatingPanel() { let panelHtml = `
汕头大学脚本·免费版 ×
当前免费功能:解除视频暂停限制
⏳ 等待视频播放...
接各类脚本开发、代挂、网站小程序开发工作,微信:zhanyc_cn
如需使用全功能版本(自动换课程、自动换章节、考试答题、作业答题等),请通过下方地址安装付费版本
👉 查看付费版本
`; $("body").append(panelHtml); $("#freejsCloseBtn").click(function () { $("#freejsPanel").remove(); }); }, updateProgress(cur, total) { let $wrap = $("#freejsProgressWrap"); let $bar = $("#freejsProgressBar"); let $text = $("#freejsProgressText"); let $status = $("#freejsStatus"); if (!total || total <= 0) return; let pct = Math.min(100, (cur / total) * 100); $wrap.show(); $bar.css("width", pct + "%"); $text.text(`${cur}/${total}`); $status.html("▶ 视频播放中...").css("color", "#0f0"); }, getVideo() { return document.querySelector("video"); }, play() { FREEJS.getVideo().volume = 0; setTimeout(() => { FREEJS.getVideo().play(); }, 200); }, setVideoVolume() { try { if (FREEJS.getVideo().volume != 0) { $("video")[0].volume = 0; } } catch (e) { console.error(e); } }, setStep(time) { if (FREEJS.getVideo()) { if (time >= 0) { FREEJS.getVideo().currentTime = time; } else { FREEJS.getVideo().currentTime = FREEJS.getVideo().duration + time; } } }, tipsMsg(msg, timeout = 3000) { let id = "freejs_tips_" + Date.now(); let $tips = $(`
${msg}
`); $("body").append($tips); setTimeout(() => { $tips.remove(); }, timeout); }, isPlayFinish() { try { return ( FREEJS.getTotalTime() > 0 && FREEJS.getCurTime() + 5 >= FREEJS.getTotalTime() ); } catch (e) { return false; } }, getCurTime() { let res = 0; try { res = FREEJS.getVideo().currentTime; } catch (e) { console.error(e); } return res; }, getTotalTime() { let res = 0; try { res = FREEJS.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); } }); }, confirmRun(msg = "脚本:3秒后执行下一步操作", time = 3000) { return new Promise((resolve, reject) => { clearTimeout(FREEJS.pageData.confirmRunIndex); FREEJS.tipsMsg(msg, time); setTimeout(() => { resolve(true); }, time); }); }, closeWaitConfrimWin() { // 免费版无需额外处理 }, addMenu() { if ($("#freejsLeftMenu").length > 0) return; GM_addStyle(`#freejsLeftMenu{z-index:9998;position:fixed;left:0;top:50%;transform:translateY(-50%);color:#fff;background:rgba(0,0,0,0.4);border-radius:0 4px 4px 0;padding:6px}#freejsLeftMenu:hover .freejsMenuTitle{width:auto}#freejsLeftMenu .freejsMenuTitle{cursor:pointer;word-wrap:break-word;width:1em;display:inline-block}#freejsLeftMenu .freejsMenuUl{display:none;margin:0 -6px;box-sizing:border-box}#freejsLeftMenu .freejsMenuUl li{list-style:none;color:#fff !important;cursor:pointer;padding:6px}#freejsLeftMenu .freejsMenuUl li:hover{background:#000}#freejsLeftMenu .freejsMenuUl li::before{content:"+ "}#freejsLeftMenu *{font-size:14px}`); $(`
菜单
`).appendTo("body"); $("#freejsLeftMenu").hover( () => { $(".freejsMenuUl").show(); }, () => { $(".freejsMenuUl").hide(); } ); $("#freejsMenuClear").click(function () { if (confirm("确认要清空缓存数据吗?")) { FREEJS.delGMData("result"); FREEJS.delGMData("studyRecord"); FREEJS.tipsMsg("清空完成"); } }); $("#freejsMenuVersion").click(function () { alert("免费版本 v1.0-free\n如需全功能版本请访问:" + docUrl); }); $("#freejsMenuContact").click(function () { window.open("http://doc.zhanyc.cn/contact-me/"); }); }, addStyle() { }, getElByText(query, text, mode = "eq", visible = true) { let $el = null; $(query).each((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; }, getElListByText(query, text, mode = "eq", visible = true) { let arr = []; $(query).each((i, el) => { if (visible && !$(query).is(":visible")) { return true; } if (mode == "eq" && $(el).text().trim() == text) { arr.push($(el)); } else if ( mode == "startsWith" && $(el).text().trim().startsWith(text) ) { arr.push($(el)); } else if (mode == "endsWith" && $(el).text().trim().endsWith(text)) { arr.push($(el)); } }); return arr; }, waitTimeout(timeout) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(); }, timeout); }); }, waitOf(fun, interval = 1000, timeout = 30) { console.log("%c waitOf", "background:rgb(0,0,0);color:#fff"); return new Promise((resolve, reject) => { let _timeOut = timeout * 1000; if (fun()) { return resolve(); } let index = setInterval(() => { if (timeout != -1) { _timeOut -= interval; if (_timeOut < 0) { clearInterval(index); return reject(); } } if (fun()) { clearInterval(index); return resolve(); } }, interval); }); }, getUrlParam(url, name) { if (arguments.length == 1) { name = url; url = window.location; } var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = url.search.substr(1).match(reg); if (r != null) return unescape(r[2]); return ""; }, getConfig() { let config = GM_getValue("config", {}); let def = { bs: "1", mode: "看课" }; config = Object.assign(def, config); return config; }, setConfig(val, site = "") { console.log("setConfig" + site, JSON.stringify(val)); GM_setValue("config", val); }, getGMData(item, def) { return GM_getValue(item, def); }, setGMData(item, val) { return GM_setValue(item, val); }, delGMData(item, val) { return GM_deleteValue(item); }, now() { return new Date().getTime(); }, setClip(txt) { GM_setClipboard(txt, "text"); FREEJS.tipsMsg("复制成功"); }, }; setTimeout(() => { if (typeof (zfk) == 'undefined') { FREEJS.init(); } else { console.log('付费版已运行,跳过免费版初始化'); } }, 3000); unsafeWindow.FREEJS = FREEJS; })();