// ==UserScript== // @name 科研诚信培训系统/诚信学堂/wanfangdata // @namespace http://tampermonkey.net/ // @version 1.2.1 // @description 检测视频完成图标,自动切换下一个视频并点击播放 // @author Erifil // @match https://cx.wanfangdata.com.cn/* // @icon https://www.google.com/s2/favicons?sz=64&domain=wanfangdata.com.cn // @grant none // @license All Rights Reserved // ==/UserScript== (function () { 'use strict'; // 检查频率(毫秒) const CHECK_INTERVAL = 1000; // 点击“下一个视频”后,最多等待播放按钮的时间(毫秒) const PLAY_BUTTON_TIMEOUT = 20000; // 当前是否已经处理过一次“视频完成” let isHandlingCompletedVideo = false; /** * 判断元素是否在页面中可见 */ function isVisible(element) { if (!element) return false; const style = window.getComputedStyle(element); return ( style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0' && element.getClientRects().length > 0 ); } /** * 查找“播放进度”区域中表示完成的图片图标。 * * 对应结构大致为: * * 播放进度: * ... * * */ function findCompletedIcon() { const flexList = document.querySelectorAll('span.flex'); for (const flex of flexList) { const label = flex.querySelector('.label'); // 确保这是“播放进度”所在的区域,避免误匹配其他图片 if (!label || !label.textContent.includes('播放进度')) { continue; } const completedImg = flex.querySelector('img'); if (completedImg && isVisible(completedImg)) { return completedImg; } } return null; } /** * 点击“下一个视频”按钮 */ function clickNextVideo() { const nextButton = document.querySelector('span.next'); if (!nextButton || !isVisible(nextButton)) { console.warn('[自动播放] 未找到“下一个视频”按钮。'); return false; } console.log('[自动播放] 当前视频已完成,点击下一个视频。'); nextButton.click(); return true; } /** * 等待并点击播放器中央/大播放按钮 */ function waitAndClickPlayButton() { const startTime = Date.now(); const timer = setInterval(() => { const playButton = document.querySelector('.prism-big-play-btn'); if (playButton && isVisible(playButton)) { console.log('[自动播放] 找到播放按钮,开始播放下一个视频。'); playButton.click(); clearInterval(timer); return; } if (Date.now() - startTime > PLAY_BUTTON_TIMEOUT) { console.warn('[自动播放] 等待播放按钮超时。'); clearInterval(timer); } }, 500); } /** * 主检测逻辑 */ function checkVideoCompleted() { const completedIcon = findCompletedIcon(); // 当前没有完成图标,说明新视频正在播放或页面已刷新状态; // 重新允许下一次完成事件触发。 if (!completedIcon) { isHandlingCompletedVideo = false; return; } // 已经处理过当前完成状态,防止重复点“下一个” if (isHandlingCompletedVideo) { return; } isHandlingCompletedVideo = true; if (clickNextVideo()) { // 页面切换、播放器加载需要一点时间 setTimeout(() => { waitAndClickPlayButton(); }, 1200); } else { // 找不到下一个按钮时,允许后续继续尝试 isHandlingCompletedVideo = false; } } console.log('[自动播放] 脚本已启动。'); // 页面加载后立即检测一次 checkVideoCompleted(); // 定时检测完成图标 setInterval(checkVideoCompleted, CHECK_INTERVAL); })();