// ==UserScript== // @name 🍀汕头市教师发展中心|使用说明:http://doc.zhanyc.cn/pages/stsjsfzzx/ // @namespace free // @version 1.0 // @description 当前是免费版本,只包含了视频自动播放功能。如需自动下一集、自动换课程等高级功能可升级付费版本|接各类脚本开发、代挂任务,微信:zhanyc_cn 个人网站:http://doc.zhanyc.cn // @include *://*shantou.gov.cn* // @include *://*ttcn.cn* // @include *://*southteacher.com/* // @include *://*.chaoxing.com/* // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // @grant GM_xmlhttpRequest // @run-at document-end // @require http://libs.baidu.com/jquery/2.0.0/jquery.min.js // @require https://m.zhanyc.cn/myhook.min.js // @license MIT // ==/UserScript== (function () { let _jq = $; unsafeWindow._jq = $; let _docUrl = "http://doc.zhanyc.cn/pages/stsjsfzzx/"; let _isDev = false; let qwe = { pageData: { videoListInit: false, video: { index: null, }, waitTime: 0, }, async init() { console.log("%c init", "background:rgb(0,0,0);color:#fff"); qwe.setHook() if (window === top) { qwe.showFloatPanel() } let _lastUrl = location.href; setInterval(async () => { if (_lastUrl != location.href) { _lastUrl = location.href; qwe.routeByUrl(location.href); } }, 500); qwe.routeByUrl(location.href); }, setHook() { try { ah.proxy( { onRequest: (config, handler) => { handler.next(config); }, onError: (err, handler) => { console.log(err.type); handler.next(err); }, onResponse: (response, handler) => { try { let url = response.config.url; _isDev && console.log(url); if (url.includes('/activity-info/classActivityInfo')) { qwe.pageData.videoListInit = true } } finally { handler.next(response); } }, }, unsafeWindow.window ); } catch (e) { console.error(e) } }, async routeByUrl(url) { url = url.toLowerCase() if (url.includes("studyWorkVideo".toLocaleLowerCase()) || url.includes('fileRead'.toLocaleLowerCase()) || url.includes('/RateLearning'.toLocaleLowerCase())) { qwe.handleVideoPage(); } }, showFloatPanel() { if ($('.qwe-float-panel').length > 0) return; let panelHtml = `
🍀 脚本助手 - 免费版
状态:等待视频加载...
当前功能:解除视频暂停限制(自动播放)
接各类脚本开发、代挂、网站小程序开发工作
微信:zhanyc_cn
🔥 付费版一次付费,永久使用,免费维护
支持自动下一集、自动换课程、秒过、考试答题等
了解全功能版本
`; $("body").append(panelHtml); $(".qwe-float-close").off("click").on("click", function () { $(".qwe-float-panel").remove(); }); }, updateFloatProgress(curTime, totalTime) { let $panel = $('.qwe-float-panel'); if ($panel.length == 0) return; let pct = totalTime > 0 ? (curTime / totalTime * 100).toFixed(1) : 0; let curStr = qwe.timeFormat(curTime); let totalStr = qwe.timeFormat(totalTime); $panel.find('.qwe-float-progress').show().html(`▶ 播放中 ${curStr} / ${totalStr}(${pct}%)`); $panel.find('.qwe-float-status').html('状态:视频自动播放中'); }, updateFloatStatus(msg) { let $panel = $('.qwe-float-panel'); if ($panel.length == 0) return; $panel.find('.qwe-float-status').html('状态:' + msg); }, async handleVideoPage() { qwe.updateFloatStatus('正在加载视频...'); console.log("%c handleVideoPage", "background:rgb(0,0,0);color:#fff"); await qwe._waitOf(a => qwe.pageData.videoListInit == true) await qwe._waitOf(a => $(`[role="treeitem"]`).length > 0) await qwe._waitTimeout(1000) qwe._waitOf(a => qwe.getElByText($(".btn1"), "继续学习") != null).then(a => { qwe.getElByText($(".btn1"), "继续学习").click() }) let _timeout = 2; let _lastTime = null; let _checkTimesBak = 60; let _checkTimes = _checkTimesBak; if (qwe.pageData.video.index != null) { return; } setTimeout(async () => { let _time = qwe._getCurTime() await qwe._waitTimeout(5000) if (qwe._getCurTime() == _time) { qwe.updateFloatStatus('视频疑似卡住,即将刷新...'); setTimeout(() => { location.href = GM_getValue("RateLearningUrl", "/") }, 3000) } }, 60 * 1000); qwe.pageData.video.index = setInterval(async () => { try { if (qwe.pageData.waitTime > 0) { qwe.pageData.waitTime -= _timeout; return; } if ($(".ant-tree-node-selected").find(`[data-icon="check"]`).length > 0) { qwe.pageData.waitTime = 15 qwe.updateFloatStatus('当前章节已完成,等待跳转...'); setTimeout(() => { location.href = GM_getValue("RateLearningUrl", "/") }, 3000) return } if (location.href.includes('fileRead')) { qwe.pageData.waitTime = 15 qwe.updateFloatStatus('非视频任务,等待10秒后跳转...'); setTimeout(() => { location.href = GM_getValue("RateLearningUrl", "/") }, 10 * 1000) return } if (!qwe.getVideo()) { console.log("%c no video", "background:rgb(0,0,0);color:#fff"); return; } let _curTime = qwe._getCurTime(); if (_curTime == _lastTime) { _checkTimes -= _timeout; if (_checkTimes <= 0) { _checkTimes = _checkTimesBak; qwe.updateFloatStatus('视频卡死,前往列表页面'); setTimeout(() => { location.href = GM_getValue("courseDetailUrl", "/"); }, 3000) qwe.pageData.waitTime = 10; return; } } else { _lastTime = _curTime; _checkTimes = _checkTimesBak; } qwe.getVideo().volume = 0; let _totalTime = qwe._getTotalTime(); qwe.updateFloatProgress(_curTime, _totalTime); let _title = `进度:${_curTime.toFixed(0)}/${_totalTime.toFixed(0)}`; $("title").text(_title); console.log("%c video run", "background:rgb(255,0,0);color:#fff"); let _isFinish = qwe._isPlayFinish(); if (_isFinish) { qwe.pageData.waitTime = 15; qwe.updateFloatStatus('视频播放完毕,等待跳转...'); setTimeout(() => { location.href = GM_getValue("RateLearningUrl", "/") }, 10 * 1000); return; } let _isPlay = await qwe._videoIsPlay(); if (!_isPlay) { if (!_isFinish) { qwe._play(); } } } catch (e) { console.error("视频页面定时器出错", e); } }, _timeout * 1000); }, _play() { qwe.getVideo().volume = 0; setTimeout(() => { qwe.getVideo().play(); }, 200); }, getVideo() { return $("video")[0]; }, _getCurTime() { let _res = 0; try { _res = qwe.getVideo().currentTime; } catch (e) { console.error(e); } return _res; }, _getTotalTime() { let _res = 0; try { _res = qwe.getVideo().duration; } catch (e) { console.error(e); } return _res; }, _isPlayFinish() { try { return ( qwe._getTotalTime() > 0 && qwe._getCurTime() + 5 >= qwe._getTotalTime() ); } catch (e) { return false; } }, 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); } }); }, _waitTimeout(timeout) { return new Promise((resolve) => { setTimeout(() => { resolve(); }, timeout); }); }, _waitOf(fun, interval = 1000, timeout = 30) { 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); }); }, _getGMData(item, def) { return GM_getValue(item, def); }, _setGMData(item, val) { return GM_setValue(item, val); }, now() { return new Date().getTime(); }, 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; }, timeFormat(seconds) { seconds = Math.floor(Math.abs(seconds)); let _h = Math.floor(seconds / 3600); let _m = Math.floor((seconds % 3600) / 60); let _s = seconds % 60; _h = (_h < 10) ? "0" + _h : _h; _m = (_m < 10) ? "0" + _m : _m; _s = (_s < 10) ? "0" + _s : _s; return _h + ":" + _m + ":" + _s; }, openDoc() { if (_docUrl) { window.open(_docUrl); } }, }; setTimeout(() => { debugger if (typeof(zfk)=='undefined') { qwe.init(); } else { console.log('skip init'); } }, 3000); })();