// ==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);
})();