您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
智能自动播放视频,避免重复触发
// ==UserScript== // @name 金蓝领刷课-互联网+职业技能培训网+山东瀚德 // @namespace http://tampermonkey.net/ // @version 1.2 // @description 智能自动播放视频,避免重复触发 // @match https://www.wljnpx.com/* // @grant @license GPL3 // @run-at document-end // @license MIT // ==/UserScript== (function() { 'use strict'; console.log('自动播放脚本已启动 v3.2'); // 状态管理 let isProcessing = false; let lastPlayTime = 0; let playAttempts = 0; let isPlaying = false; // 防抖函数 function debounce(func, wait) { let timeout; return function executedFunction(...args) { const later = () => { clearTimeout(timeout); func(...args); }; clearTimeout(timeout); timeout = setTimeout(later, wait); }; } // 节流函数 - 修复 ESLint 错误 function throttle(func, limit) { let inThrottle; return function(...args) { if (!inThrottle) { func.apply(this, args); inThrottle = true; setTimeout(() => { inThrottle = false // 修复:分离赋值语句 }, limit); } }; } // 检查是否应该尝试播放 function shouldTryPlay() { const now = Date.now(); // 如果正在处理或距离上次尝试不足3秒,跳过 if (isProcessing || (now - lastPlayTime) < 3000) { return false; } // 如果尝试次数过多,延长等待时间 if (playAttempts > 5) { if ((now - lastPlayTime) < 10000) { return false; } playAttempts = 0; // 重置尝试次数 } return true; } // 安全播放视频 const safePlayVideo = throttle(function() { if (!shouldTryPlay()) { console.log('跳过播放尝试:冷却中'); return; } isProcessing = true; lastPlayTime = Date.now(); playAttempts++; const video = document.querySelector('video.pv-video, video'); const playButton = document.querySelector('.pv-playpause'); if (!video) { console.log('未找到视频元素'); isProcessing = false; return; } // 检查视频是否真的在播放 if (!video.paused && video.currentTime > 0 && !video.ended) { console.log('视频正在播放中,无需操作'); isPlaying = true; isProcessing = false; playAttempts = 0; // 播放成功,重置尝试次数 return; } // 只有在视频确实暂停时才尝试播放 if (video.paused) { console.log('检测到视频暂停,尝试播放'); // 方法1:直接播放视频 video.play().then(() => { console.log('视频播放成功'); isPlaying = true; playAttempts = 0; }).catch(err => { console.log('直接播放失败,尝试点击按钮', err); // 方法2:点击播放按钮(仅当按钮显示为播放图标时) if (playButton && playButton.classList.contains('pv-icon-play')) { setTimeout(() => { playButton.click(); console.log('已点击播放按钮'); }, 500); } }); } // 处理完成 setTimeout(() => { isProcessing = false; }, 2000); }, 3000); // 节流:最少3秒执行一次 // 监听视频状态变化(使用防抖避免频繁触发) const handleVideoStateChange = debounce(function(event) { const video = event.target; if (event.type === 'pause') { console.log('视频暂停事件'); isPlaying = false; // 延迟2秒后尝试恢复播放(给其他操作留出时间) setTimeout(() => { // 再次检查是否仍然暂停 if (video.paused && !isProcessing) { safePlayVideo(); } }, 2000); } else if (event.type === 'play') { console.log('视频播放事件'); isPlaying = true; playAttempts = 0; } else if (event.type === 'ended') { console.log('视频结束事件'); isPlaying = false; // 等待下一个视频加载 setTimeout(() => { safePlayVideo(); }, 3000); } }, 500); // 监听课程切换(使用防抖) const handleCourseSwitch = debounce(function(e) { if (e.target.closest('.sctTitle')) { console.log('检测到课程切换'); isPlaying = false; playAttempts = 0; // 等待新视频加载 setTimeout(() => { safePlayVideo(); }, 3000); } }, 1000); // 监听DOM变化(使用防抖) const handleDOMChange = debounce(function(mutations) { let videoChanged = false; mutations.forEach(function(mutation) { // 只关注视频源变化 if (mutation.type === 'attributes' && mutation.target.tagName === 'VIDEO' && mutation.attributeName === 'src') { videoChanged = true; } }); if (videoChanged) { console.log('检测到视频源变化'); isPlaying = false; playAttempts = 0; setTimeout(() => { safePlayVideo(); }, 2000); } }, 1000); // 设置DOM观察器 function setupObserver() { const observer = new MutationObserver(handleDOMChange); observer.observe(document.body, { attributes: true, childList: false, subtree: true, attributeFilter: ['src'] }); console.log('DOM观察器已设置'); } // 初始化 function initialize() { console.log('开始初始化'); // 设置事件监听器 document.addEventListener('pause', handleVideoStateChange, true); document.addEventListener('play', handleVideoStateChange, true); document.addEventListener('ended', handleVideoStateChange, true); document.addEventListener('click', handleCourseSwitch, true); // 设置DOM观察器 setupObserver(); // 首次检查(延迟执行) setTimeout(() => { safePlayVideo(); }, 2000); // 定期检查(降低频率,避免干扰) setInterval(() => { const video = document.querySelector('video.pv-video, video'); if (video && video.paused && !isProcessing && !isPlaying) { console.log('定期检查:发现视频暂停'); safePlayVideo(); } }, 10000); // 10秒检查一次 console.log('初始化完成'); } // 页面加载完成后初始化 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initialize); } else { setTimeout(initialize, 1000); } // 监听页面可见性变化 document.addEventListener('visibilitychange', function() { if (!document.hidden && !isPlaying) { console.log('页面变为可见,检查播放状态'); setTimeout(() => { safePlayVideo(); }, 1000); } }); console.log('脚本加载完成'); })();