// ==UserScript== // @name 河南工业职业技术学院继续教育学习平台-视频自动播放 // @namespace http://tampermonkey.net/ // @version 0.1 // @description 尝试自动播放视频并处理到下一个;仅供参考,需要根据网站实际结构修改。 // @author You // @match http://hnpi.newzhihui.cn/* // @grant none // ==/UserScript== (function () { 'use strict'; let videoPlayer = null; let checkVideoInterval = null; let nextButton = null; const TARGET_TIME_LEFT = 3; // 目标:播放到剩余3秒 // 主要初始化函数 function init() { console.log('初始化自动播放脚本...'); try { findVideoAndSetup(); setupMutationObserver(); // 设置监听器,监测DOM变化 } catch (error) { console.error('初始化过程中出现错误:', error); } } // 尝试查找视频并设置监控 function findVideoAndSetup() { // 查找视频元素 - 需要根据实际网页结构调整选择器! videoPlayer = document.querySelector('video'); // 如果找不到video标签,可以尝试查找embed、object或者基于特定class/id的元素 // 例如: document.querySelector('#myVideoPlayer') 或 document.querySelector('.video-player-class') if (videoPlayer) { console.log('找到视频播放器'); setupVideoListeners(); // 检查是否已经可以播放 if (videoPlayer.readyState > 2) { // HAVE_FUTURE_DATA or more onVideoCanPlay(); } } else { console.warn('未在页面上找到视频播放器,将在3秒后重试...'); // 稍后重试,可能是页面加载较慢 setTimeout(findVideoAndSetup, 3000); } } // 设置视频事件监听器 function setupVideoListeners() { videoPlayer.addEventListener('canplay', onVideoCanPlay); videoPlayer.addEventListener('ended', onVideoEnded); videoPlayer.addEventListener('error', onVideoError); // 确保视频在播放 if (videoPlayer.paused) { videoPlayer.play().catch(e => console.error('自动播放失败:', e)); } } // 视频可以播放时的处理 function onVideoCanPlay() { console.log('视频可以播放'); // 清除之前的检查间隔(如果存在) if (checkVideoInterval) { clearInterval(checkVideoInterval); } // 设置间隔检查视频进度 checkVideoInterval = setInterval(checkVideoProgress, 1000); // 每秒检查一次 } // 检查视频进度 function checkVideoProgress() { if (!videoPlayer) return; const currentTime = videoPlayer.currentTime; const duration = videoPlayer.duration; if (duration > 0 && (duration - currentTime) <= TARGET_TIME_LEFT) { console.log(`达到目标时间点(剩余${TARGET_TIME_LEFT}秒),准备处理下一个`); clearInterval(checkVideoInterval); // 停止检查 handleVideoCompletion(); } } // 视频播放完成时的处理 function handleVideoCompletion() { console.log('尝试自动处理下一个视频或章节...'); // 尝试查找并点击“下一个”按钮 - 需要根据实际网页结构调整选择器! // 可能的选择器示例: button.next, .next-btn, .btn-next, a[title="Next"], 等等。 nextButton = document.querySelector('.next-button-class'); // 请替换为实际的选择器 // 可以尝试多种选择器 // if (!nextButton) { nextButton = document.querySelector('.another-next-selector'); } if (nextButton) { console.log('找到下一个按钮,模拟点击'); nextButton.click(); } else { console.warn('未找到下一个按钮,尝试寻找课程列表或跳转链接'); // 可以尝试其他方式,例如模拟键盘事件(如右箭头)或寻找课程列表 // 如果网站是单页应用,可能需要触发特定的JavaScript事件 // 提示用户手动操作 // alert('请手动切换到下一个视频或章节。'); } } // 视频意外结束 function onVideoEnded() { console.log('视频自然播放结束'); clearInterval(checkVideoInterval); handleVideoCompletion(); } // 视频加载或播放出错 function onVideoError(e) { console.error('视频发生错误:', e); clearInterval(checkVideoInterval); // 可以尝试重新加载视频或跳过 // setTimeout(findVideoAndSetup, 3000); } // 使用MutationObserver监测DOM变化(针对SPA) function setupMutationObserver() { const observer = new MutationObserver(function (mutations) { // 当DOM发生变化时,重新尝试查找视频(例如切换章节后) if (!videoPlayer || (videoPlayer && !document.contains(videoPlayer))) { console.log('DOM发生变化,重新查找视频元素'); findVideoAndSetup(); } }); // 开始观察整个body的子元素变化 observer.observe(document.body, { childList: true, subtree: true }); } // 启动脚本 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { setTimeout(init, 1000); // 延迟1秒初始化以确保DOM就绪 } })();