// ==UserScript== // @name 南方医科大学继续教育网课助手 // @namespace http://tampermonkey.net/ // @version 0.1.0 // @description 自动关闭学习提醒并在 nfykcj-kfkc.webtrn.cn 上保持视频播放 // @author You // @match https://nfykcj-kfkc.webtrn.cn/* // @run-at document-idle // @grant none // ==/UserScript== (function () { 'use strict'; const CONFIRM_TEXT_SNIPPET = '确定'; const LAYER_BUTTON_SELECTOR = '.layui-layer-btn0'; const PLAY_CHECK_INTERVAL_MS = 5000; const MUTE = true; const CONFIRM_CHECK_INTERVAL_MS = 1000; const PLAY_BUTTON_SELECTORS = [ '.vjs-big-play-button', '.prism-big-play-btn', '.prism-controlbar .prism-play-btn', '.xgplayer-play', '.video-play-button', '.play-btn', '.play-button', '.btn-play' ]; function clickConfirmButtons(rootDoc) { if (!rootDoc) { return; } const buttons = rootDoc.querySelectorAll(LAYER_BUTTON_SELECTOR); buttons.forEach((btn) => { const text = btn.textContent || btn.innerText; if (text && text.indexOf(CONFIRM_TEXT_SNIPPET) !== -1) { btn.click(); } }); } function ensureVideosArePlaying(rootDoc) { if (!rootDoc) { return; } const videos = rootDoc.getElementsByTagName('video'); Array.from(videos).forEach((video) => { if (MUTE) { video.muted = true; video.volume = 0; } if (video.paused && !video.ended) { const playPromise = video.play(); if (playPromise && typeof playPromise.catch === 'function') { playPromise.catch(() => { clickFallbackPlayButton(rootDoc); }); } } }); } function ensureAudioMuted(rootDoc) { if (!rootDoc || !MUTE) { return; } const audios = rootDoc.getElementsByTagName('audio'); Array.from(audios).forEach((audio) => { audio.muted = true; audio.volume = 0; }); } function clickFallbackPlayButton(rootDoc) { for (const selector of PLAY_BUTTON_SELECTORS) { const btn = rootDoc.querySelector(selector); if (btn) { btn.click(); break; } } } function processWindow(targetWindow) { let targetDoc; try { targetDoc = targetWindow.document; } catch (err) { return; } clickConfirmButtons(targetDoc); ensureVideosArePlaying(targetDoc); ensureAudioMuted(targetDoc); } function watchSelfAndFrames() { processWindow(window); Array.from(document.getElementsByTagName('iframe')).forEach((frame) => { try { if (frame.contentWindow) { processWindow(frame.contentWindow); } } catch (err) { // Ignore cross-origin frames. } }); } setInterval(() => { clickConfirmButtons(document); }, CONFIRM_CHECK_INTERVAL_MS); setInterval(() => { watchSelfAndFrames(); }, PLAY_CHECK_INTERVAL_MS); document.addEventListener('visibilitychange', () => { if (!document.hidden) { watchSelfAndFrames(); } }); })();