// ==UserScript== // @name 2026年中小学智慧·暑期教师研修·自动播放/切换·自动计算学时,学完自动暂停 // @namespace https://lingxi.wps.cn/ // @version 0.9.9 // @description 为了帮助老师们提升2026暑期研修学习效率,自动播放视频并且自动切换课程,倍速与静音可在界面中自行设置。 // @author 灵犀 // @grant GM_setValue // @grant GM_getValue // @match *://www.smartedu.cn/* // @match *://basic.smartedu.cn/* // @match *://auth.smartedu.cn/* // @run-at document-start // @license 转载请注明出处,保留红包码 // ==/UserScript== // v0.9.0 封装随机延时工具,替换关键路径固定延时,模拟人工操作节奏 // v0.9.1 移除2倍以上倍速选项,避免触发平台速度检测弹窗 // v0.9.2 学时达标检查提取为独立函数,看门狗增加兜底检查,防止ended事件未触发时不返回 // v0.9.3 视频页直接启动时,播完当前视频后返回研修页读取进度(方案B) // v0.9.4 学时基准改为板块级(ys_course_done/ys_course_required),日志展示板块学时 // v0.9.5 加宽日志区至260px,精简全部日志文案至20字符内 // v0.9.6 跑马灯阈值调整为28字符,文案优化更通顺 // v0.9.7 视频播完后切换下一节前增加随机延迟,模拟人工操作节奏 // v0.9.8 添加支持作者按钮(支付宝红包码弹窗) // ========== 反检测 ========== /** * 在页面脚本执行前劫持 visibilityState/hidden, * 拦截 visibilitychange/blur/seeking/seeked 事件, * 使用户切换标签页时平台不会暂停视频或弹出确认框。 * 必须在 @run-at document-start 时执行才有效。 */ function bypassRestrictions() { Object.defineProperty(document, 'visibilityState', { value: 'visible', writable: false }); Object.defineProperty(document, 'hidden', { value: false, writable: false }); const stopProp = e => e.stopImmediatePropagation(); window.addEventListener('visibilitychange', stopProp, true); window.addEventListener('blur', stopProp, true); window.addEventListener('seeking', stopProp, true); window.addEventListener('seeked', stopProp, true); } // ========== 可中断等待机制 ========== const _timers = new Set(); /** 安全的 setTimeout,停止脚本时所有待执行的定时器会被立即清除 */ function safeSetTimeout(fn, delay) { const id = setTimeout(() => { _timers.delete(id); if (isRunning()) fn(); }, delay); _timers.add(id); return id; } /** 清除所有未执行的定时器 */ function cancelAllTimers() { _timers.forEach(id => clearTimeout(id)); _timers.clear(); } // ========== 常量 ========== const TRAINING_URL = 'https://www.smartedu.cn/jiaoshi/training/2026jjsqpx'; const COURSE_INDEX_PREFIX = 'https://www.smartedu.cn/jiaoshi/courseIndex'; const LOGIN_URL = 'https://auth.smartedu.cn/uias/login'; const RUNNING_KEY = 'ys_running'; const PLAYBACK_RATE_KEY = 'playbackRate'; const MUTED_KEY = 'videoMuted'; const COURSE_DONE_KEY = 'ys_course_done'; const COURSE_REQUIRED_KEY = 'ys_course_required'; const ALIPAY_QR_IMG = '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'; const PLAYBACK_RATES = [1, 1.25, 1.5, 2]; const STATUS = { STOPPED: '未运行', RUNNING: '运行中' }; /** 页面类型枚举 */ const PAGE = { LOGIN: 'login', TRAINING: 'training', COURSE_INDEX: 'courseIndex', COURSE_DETAIL: 'courseDetail', OTHER: 'other', }; // ========== 工具函数 ========== /** 日志函数,同时输出到控制台与状态栏日志区 */ function log(content) { console.debug(`=== ${content} ===`); setTimeout(() => { const el = document.getElementById('log_content'); if (!el) return; el.innerText = `${content}`; if (content.length > 28) { el.classList.remove('short'); } else { el.classList.add('short'); } }, 10); } /** 将秒数格式化为 mm:ss */ function formatTime(seconds) { if (!seconds || isNaN(seconds)) return '00:00'; const m = Math.floor(seconds / 60); const s = Math.floor(seconds % 60); return `${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`; } /** 格式化视频播放进度日志(含板块学时) */ function formatPlaybackLog(video) { const accumulated = parseFloat(sessionStorage.getItem('ys_accumulated') || '0'); const courseDone = parseFloat(sessionStorage.getItem(COURSE_DONE_KEY) || '0'); const courseRequired = parseFloat(sessionStorage.getItem(COURSE_REQUIRED_KEY) || '0'); const credit = (video.duration || 0) / 2700; const playingCredit = (video.currentTime || 0) / 2700; const courseTotal = courseDone + accumulated + playingCredit; if (courseRequired > 0) { return `播放中 ${formatTime(video.currentTime)}/${formatTime(video.duration)} | 学时:${courseTotal.toFixed(2)}/${courseRequired}`; } return `播放中 ${formatTime(video.currentTime)}/${formatTime(video.duration)}`; } /** 生成 [min, max) 区间的随机延时(毫秒),用于模拟人工操作节奏 */ function randomDelay(min, max) { return Math.floor(min + Math.random() * (max - min)); } // ========== 状态管理 ========== /** 读取运行状态(同标签页跨页面跳转保持,新标签页隔离) */ function isRunning() { return sessionStorage.getItem(RUNNING_KEY) === 'true'; } function setRunning(running) { sessionStorage.setItem(RUNNING_KEY, running ? 'true' : 'false'); } /** 设置状态文案(同步到状态栏 DOM) */ function setStatus(status) { const el = document.getElementById('script-status'); if (el) el.textContent = status; } // ========== 倍速与静音(跨标签页共享) ========== function getPlaybackRate() { return GM_getValue(PLAYBACK_RATE_KEY, 2); } function setPlaybackRate(rate) { GM_setValue(PLAYBACK_RATE_KEY, rate); const video = getVideo(); if (video) video.playbackRate = rate; } function getMuted() { return GM_getValue(MUTED_KEY, true); } function setMuted(muted) { GM_setValue(MUTED_KEY, muted); const video = getVideo(); if (video) video.muted = muted; } // ========== DOM 查询 ========== /** 获取微前端 Shadow DOM 根节点 */ function getRoot() { const head = document.querySelector('micro-app-head, #micro-app-head'); if (head && head.shadowRoot) return head.shadowRoot; const micro = document.querySelector('micro-app'); if (micro && micro.shadowRoot) { const inner = micro.shadowRoot.querySelector('micro-app-head, #micro-app-head'); return inner?.shadowRoot || micro.shadowRoot; } return document; } /** 获取当前页面上的 video 元素(支持 Shadow DOM) */ function getVideo() { const root = getRoot(); return root.querySelector('video[id^="vjs_video_"][id$="_html5_api"]') || root.querySelector('video') || document.querySelector('video'); } /** 判断当前页面类型 */ function getPageType() { const href = window.location.href; const path = window.location.pathname; if (href.startsWith(LOGIN_URL)) return PAGE.LOGIN; if (href.startsWith(TRAINING_URL)) return PAGE.TRAINING; if (path.startsWith('/jiaoshi/courseIndex')) return PAGE.COURSE_INDEX; if (path.startsWith('/jiaoshi/courseDetail')) return PAGE.COURSE_DETAIL; return PAGE.OTHER; } // ========== 视频控制 ========== /** 检查板块累计学时是否已达标,达标则返回研修页(course_required>0 时才检查) */ function checkCreditsAndReturn() { const required = parseFloat(sessionStorage.getItem(COURSE_REQUIRED_KEY) || '0'); if (!(required > 0)) return false; const done = parseFloat(sessionStorage.getItem(COURSE_DONE_KEY) || '0'); const accumulated = parseFloat(sessionStorage.getItem('ys_accumulated') || '0'); const total = done + accumulated; if (total >= required) { log(`板块学时达标 ${total.toFixed(1)}/${required},返回研修页`); window.top.location.href = TRAINING_URL; return true; } return false; } /** 为 video 绑定 ended 事件(播完计算学时并决策跳转),通过 dataset 防重复绑定 */ function bindVideoEnded(video) { if (video.dataset.ysBound) return; video.addEventListener('ended', () => { if (!isRunning()) return; // 未读取进度基准(用户在视频页直接启动)→ 播完返回研修页读进度 const courseRequired = parseFloat(sessionStorage.getItem(COURSE_REQUIRED_KEY) || '0'); if (!(courseRequired > 0)) { log('视频播完,返回研修页读进度'); window.top.location.href = TRAINING_URL; return; } // 累加本视频学时(1学时=45分钟=2700秒) const duration = video.duration || 0; const credit = duration / 2700; const accumulated = parseFloat(sessionStorage.getItem('ys_accumulated') || '0') + credit; sessionStorage.setItem('ys_accumulated', accumulated); const courseDone = parseFloat(sessionStorage.getItem(COURSE_DONE_KEY) || '0'); const courseTotal = courseDone + accumulated; log(`视频播完,板块累计 ${courseTotal.toFixed(1)}/${courseRequired}`); // 总学时已达标 → 返回研修页 if (checkCreditsAndReturn()) return; // 总学时未达标 → 在当前课程内切换到下一节 const items = document.querySelectorAll('.resource-item.resource-item-train'); const activeIdx = Array.from(items).findIndex(el => el.classList.contains('resource-item-active')); if (activeIdx === -1) { log('未找到当前节点,返回研修页'); window.top.location.href = TRAINING_URL; return; } const nextUnfinished = Array.from(items).slice(activeIdx + 1).findIndex(el => !isItemFinished(el)); if (nextUnfinished !== -1) { const targetIdx = activeIdx + 1 + nextUnfinished; log(`切换到第 ${targetIdx + 1} 节继续播放`); safeSetTimeout(() => { if (!isRunning()) return; items[targetIdx].click(); safeSetTimeout(() => { if (isRunning()) checkActiveItem(); }, randomDelay(1500, 3000)); }, randomDelay(1500, 3000)); } else { log('所有节点已学完,返回研修页'); window.top.location.href = TRAINING_URL; } }); video.dataset.ysBound = '1'; } /** 拦截 video.pause 方法:非末尾位置禁止暂停 */ function interceptVideoPause(video) { if (video.dataset.ysPauseIntercepted) return; video.pause = function() { if (video.currentTime < video.duration - 0.5) return; HTMLMediaElement.prototype.pause.apply(this, arguments); }; video.dataset.ysPauseIntercepted = '1'; } /** * 等待平台恢复播放进度后再回调 * 视频加载后平台会从服务器获取上次进度并 seek, * 脚本需等 currentTime 稳定(连续 1.5s 不变化)后再触发播放, * 避免抢先 play 导致从头播放覆盖平台进度恢复。 * 最多等待 8s,超时后强制执行。 */ function waitForProgressStable(video, callback) { let lastTime = -1; let stableCount = 0; let elapsed = 0; const interval = 500; const maxWait = 8000; const requiredStable = 3; log('等待播放进度恢复...'); const check = () => { if (!isRunning()) return; const current = video.currentTime; if (current === lastTime && current > 0) { stableCount++; } else { stableCount = 0; } lastTime = current; elapsed += interval; if (stableCount >= requiredStable) { log(`进度已恢复至 ${formatTime(current)}`); callback(); } else if (elapsed >= maxWait) { log('进度恢复超时,强制播放'); callback(); } else { safeSetTimeout(check, interval); } }; safeSetTimeout(check, interval); } // ========== UI ========== /** 注入底部状态栏 */ function inject() { if (window.top != window.self) return; if (document.getElementById('auto-play-status-bar')) return; const rateOptions = PLAYBACK_RATES.map(r => `` ).join(''); const statusBar = document.createElement('div'); statusBar.id = 'auto-play-status-bar'; statusBar.innerHTML = `