// ==UserScript== // @name 山东省大数据工程专业技术人员专业课自动看课 // @namespace http://tampermonkey.net/ // @version 0.7 // @description 自动遍历视频列表,找到第一个未完成的视频,修改其li标签class并模拟点击,引入短时延迟以避免循环卡顿,并连续播放直到全部完成。自动处理alert弹窗。 // @match http://119.148.160.19:18006/* // @grant none // @license MIT // @downloadURL none // ==/UserScript== (function() { 'use strict'; // --- 立即重写 alert 函数,确保最早生效 --- const originalAlert = window.alert; window.alert = function(message) { console.log('🚫 alert 弹窗被拦截,内容:', message); return true; // 模拟点击“确定” }; // --- 配置项 --- // 用于标记视频已完成的文本。现在使用不带括号的“已完成”。 const COMPLETED_PREFIX = '已完成'; // 目标 class 名称,用于触发视频加载。 const TARGET_CLASS = 'lesson-select'; // 脚本检查视频状态或寻找下一个视频的频率(毫秒)。 const MAIN_CHECK_INTERVAL_MS = 3000; // 3秒 // 脚本在页面加载完毕后,额外等待的秒数(毫秒)。 const INITIAL_DELAY_MS = 5000; // 5秒 // 在激活一个视频后(设置class并点击),等待多长时间再允许主循环重新检查列表(毫秒)。 // 这给视频播放器留出加载和开始的时间,避免快速切换。 const ACTIVATION_COOLDOWN_MS = 3000; // 3秒冷却时间 // --- 内部状态变量 --- let mainLoopIntervalId = null; let currentVideoPlayingIndex = -1; let isActivatingVideo = false; // 新增标志,防止在激活视频时重复触发 /** * 查找列表中**第一个**未完成的视频,并修改其 class 属性,然后模拟点击来触发播放。 * @returns {boolean} 如果找到并处理了未完成视频,返回 true;否则(所有视频都已完成)返回 false。 */ function findAndActivateNextUnfinishedVideo() { // 如果我们正在激活一个视频,就暂停查找,等待冷却期结束 if (isActivatingVideo) { console.log('⏳ 正在激活视频冷却中,暂停查找下一个视频...'); return true; // 假装已激活,但实际是等待冷却 } console.log('🤖 正在寻找下一个未完成的视频...'); const ulControl = document.querySelector('ul.ul-control'); if (!ulControl) { console.warn('⚠️ 未找到