您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
一起学习
// ==UserScript== // @name 日升通 // @namespace 日升通 // @version 0.8 // @description 一起学习 // @author zusheng // @match *://*.chaoxing.com/mycourse/studentstudy* // @icon https://www.google.com/s2/favicons?domain=chaoxing.com // @grant none // @license MIT // ==/UserScript== (function () { 'use strict'; window.alert = () => { console.error('alert被拦截!') return false } // 未完成的列表 const undoneList = [] /** * 查找是否有未完成的章节 */ function findUndoneList() { document.querySelectorAll(".chapter #coursetree ul li .posCatalog_level ul li").forEach(item => { if (item.querySelector('.prevTips') && item.querySelector('.prevTips').classList?.length > 0) { let content = item.querySelector('.prevTips').classList.value let reg = new RegExp(/icon_Completed/) if (!reg.test(content)) undoneList.push(item) } else { undoneList.push(item) } }) console.log('找到' + undoneList.length + '个未完成章节') if (undoneList.length > 0) delUndoneList() } /** * 正式刷课 */ function delUndoneList() { document.documentElement.querySelector('.left').addEventListener('DOMNodeInserted', run) // 选中目录 console.log('@click, 切换任务') undoneList[0]?.querySelector('div > .posCatalog_name').click() // 完成一个,下一步 function nextSteps() { undoneList.shift() if (undoneList.length > 0) { setTimeout(() => { delUndoneList() }, 6 * 1000) } } function run() { if (!!document.documentElement.querySelector('#iframe')) { document.documentElement.querySelector('.left').removeEventListener('DOMNodeInserted', run) document.documentElement.querySelector('#iframe').onload = () => { console.log('iframe.load') // 本页iframe列表 // const iframeList = document.documentElement.querySelector('#iframe').contentDocument.querySelectorAll('.ans-attach-online') const iframeList = document.documentElement.querySelector('#iframe').contentDocument.querySelectorAll('.wrap .ans-cc p .ans-attach-ct') // DOM WORKS LI const workList = document.documentElement.querySelectorAll('#prev_tab .prev_ul li') // 执行完本页窗口,开始查看是否存在本章其余任务 if (iframeList && iframeList.length > 0) { setTimeout(async () => { // 完成 iframe 窗口内的任务 await rushWorks(iframeList) // if (workList > 1) await nextWorks(workList) nextSteps() }, 0 * 1000) } else { // 下一章 nextSteps() } } } } } /** * 执行本页任务 */ function rushWorks(iframeList) { return new Promise(resolve => { console.log('任务总数:', iframeList?.length) let i = 0 let runFlag = false iframeList[0].querySelector('iframe').onload = () => run() setTimeout(() => { if (!runFlag) run() }, 3 * 1000) function run() { const currentIframe = iframeList[i] runFlag = true // ?.parentElement || iframeList[i]?.parentNode || null if (iframeList?.length > i) { // DOM BUTTON const pptFlag = currentIframe?.querySelector('iframe')?.contentDocument?.querySelector('#navigation #ext-gen1045') // DOM VIDEO const videoFlag = currentIframe?.querySelector('iframe')?.contentDocument?.querySelector('#video_html5_api') // 标记是否完成 const complete = [...currentIframe?.classList].includes('ans-job-finished') console.log('rushWorks - run:ppt?', !!pptFlag, ',video?', !!videoFlag) if (!!pptFlag) { console.log('当前任务(PPT):', i + 1) checkPPT(pptFlag).then(() => run()) } else if (!!videoFlag) { if (!complete) { console.log('当前任务(VIDEO):', i + 1) // const p_id = 'p_work' + (i + 1) // currentIframe.setAttribute('id', p_id) // location.hash = p_id checkVideo(videoFlag).then(() => run()) } else { console.log('跳过任务(VIDEO):', i + 1) i++ run() } } } else { resolve() } i++; } }) } /** * 检测并自动播放PPT * @return {Promise<unknown>} * @param pptFlag 下一页按钮 */ function checkPPT(pptFlag) { return new Promise(resolve => { let timer = setInterval(() => { // 一秒换一张PPT if (pptFlag?.style?.visibility === 'hidden') { // 当翻到最后一页PPT时,清除定时器 clearInterval(timer) resolve() } else { // 下一页PPT pptFlag.click() } }, 1000) }) } /** * 检测并自动播放视频 * @param videoFlag * @return {Promise<unknown>} */ function checkVideo(videoFlag) { return new Promise(resolve => { videoFlag.muted = true videoFlag.preload = "auto" videoFlag.playbackRate = 2 // videoFlag.controls = true // videoFlag.autoplay = true // setTimeout(() => videoFlag.play().catch(), 1000) // 可以播放时 videoFlag.addEventListener('canplay', function () { console.log('canplay') videoFlag.play().catch() console.log('checkVideo - videoFlag:muted?', videoFlag.muted, ', preload?', videoFlag.preload, ', playbackRate?', videoFlag.playbackRate, ', pausedStatus?', videoFlag.paused) }); // 视频播放结束监听 videoFlag.addEventListener('ended', function () { console.log('视频播放结束') resolve() }); // waiting let waitTimer = null videoFlag.addEventListener('waiting', function () { console.log('waiting') videoFlag.pause() if (waitTimer) clearTimeout(waitTimer) waitTimer = setTimeout(() => { videoFlag.play() }, 3000) }); // 视频出错监听 let playTimer = null videoFlag.addEventListener('error', function () { console.log('视频播放错误, 即将重新开始') if (playTimer) clearTimeout(playTimer) resolve() }) // if (videoFlag.paused) { setTimeout(() => { videoFlag.play().catch() console.log('checkVideo - videoFlag:muted?', videoFlag.muted, ', preload?', videoFlag.preload, ', playbackRate?', videoFlag.playbackRate, ', pausedStatus?', videoFlag.paused) }, 1000) } }) } /** * 执行本章下一个任务 * @return {Promise<unknown>} * @param workList */ function nextWorks(workList) { return new Promise(resolve => { let i = 1 run() function run() { if (workList.length >= i) { const currentBtn = workList[i] currentBtn.click() setTimeout(async () => { await rushWorks() i++ run() }, 1000 * 5) } else { resolve() } } }) } window.addEventListener('load', function () { findUndoneList() }); // 开始查找 // setTimeout(() => findUndoneList(), 5 * 1000) })();