// ==UserScript== // @name 🥇【举名继教小助手】无人值守|自动静音|视频助手|考试助手 // @namespace https://juming-helper.example.com // @version 5.8.4 // @description 脚本本身免费,但也希望得到大家的支持。脚本可用于【举名继续教育网】的相关课程,功能包含自动静音、自动签到、连续考试等。 // @author 境界程序员 // @license AGPL License // @match *://*.jumingedu.com/* // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAABVCAMAAAAPK1hoAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkU1NDU0RjFGQkVEQTExRjA5RDY0QzBFNkQ3ODU5NDNCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkU1NDU0RjIwQkVEQTExRjA5RDY0QzBFNkQ3ODU5NDNCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RTU0NTRGMURCRURBMTFGMDlENjRDMEU2RDc4NTk0M0IiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RTU0NTRGMUVCRURBMTFGMDlENjRDMEU2RDc4NTk0M0IiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz45FESoAAADAFBMVEUSislxlqkthLY4pv////9uprN67/8FL14XVor9/vgjhcmGiIf55tjbxbichXGrucVNhJqI9f/q29BMTlFRZ3DS4+5ZpMRXm7e0ytju7u7k5OMAUKJHr/GE6v4zm/4klv4qp/8vUmT/9eX8/PdofInQuq1ps8nn1clIntEYpP8Wd7zz8vEid7ewo5pbobaEmagWe8rT09PCw8InQ1E5sv8ris8YmP66vb6kpKKVt880fKg1jMeVo614enmXq7isrKqx0uxjqr/c29qos7z+/vuOzNNww9drxuuzs7Fcl64tXYZkaGmSk5ItMDOom5IZS3UlY5ebnJt1yOVYc4X07uu6w8ossf8lj/2vxdZEdH4DAQFPlLRLxP83YHVkhZp1hZiGe2wVg775+Pi4qJ/Ky8zCpJIGdsdAWGi7//9diqjJztNVtNg0mOVlt9dGeZOT//8AdObZ3eJ00f739fR94P/j3twnfr4GfNcwjNgnaIGGo7kGaLWekYIudaoWXZc6aYUBbcZ2gIc4fJb+/PsTLjvCsaRn3Pzg1Mpst79YqND13c0GYqYXabIMjPiMl51szPhLiakjaaUDhOQYX6qDjZY+mbr7/Px31/x33P0+hJ0dfs8OmPwYjvhpdX78+vpEZH9nkZnCys2YjH57alrm5uXa8PlpanZYfZATb8QfkMzjzL91z/cbeahyus/Y19Y3erYBZNZAjbYJf8Fai7h30fC3urp3j5ykqq12bGapqqmek5RHrcxEfrMLERfu6ueNjo0+kM7H0dcRiOTBxck/Pj9gveC6ubaqr7IBP4Dw39SWmJbV2uBXXF6QmKWVl5qfoJ9TbX8qHhpozup0dXHQ0M/IyciBgHyur6+mp6b+/f3p6em2t7YBW7a/v735///g5OhSlKpBn+8llO6emJTf4OEbHyder9DOzctyrcFrbmwbx//u+v1fTENgsMBNcJKWj5Dc///GxsXNxL2N1fKgp6sOkuMVmOBw1uQlhOGxtriPqK3Rz9GctMIzc4sybpv///89762DAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAC99JREFUeNrsmXlcE2caxwkZEiAoxNDEEIEgisUgRwKiICgYOYMEkFBI5RKlViV2CfdyWfACrQgioCBWKmCFeuGWrTitRsUYGhUNBIiybUTZeixdu61WZd+ZCR5NXK3Sv7bv58MwMyRfnvk9v+eZed/RG/0jht6f1N/9DeUfQF1iemvrhnGmpkZuSzhY0uk+ntQ6wNTPdd71T4+Px4368a+BCfoeCdt3xDUbjxcVAkxPj3S9g4UzpnrOVI4LFWrNTjD2SD8ys3E6xDVxGx9qGi6heV2uXkJjMQTG+FD7vD2bPTz0ElKWGUHjRT3p7abn4dGckDJrKiByjbiA6gC9HZVlelhPP7e5OeUewoS4XCMjhPpWsaYuPNysn6unt+6eCXrtCBWN1ejNqYmRwgR9foKeB2kzACqVXC4X/EDKt4m17rTwiINHc0lZxQw0SOTijcAWyZYD982oSmB64ycJR/SPH0CvHBBtbW2fUt8oVlBIeunA9AenTcD0VCohJNC3ovriQCHpHzlYOx16cSiRZEEmmW9ATcv2RIrzYARSSGr2b7BvRl3yUB+Y6ciRu8u4CIVEkvdcab3aExCgoltYIAoDqufvpLK8dzSDbncEKyQwwugNbTwKyVeddLY3GGaNVezv6YSpkUI9hLnu7xomVCdLQtAkFuDJeWo5evL8C9laErnXAivg1I90UZOA6YGgHjwTpQYaMCwFOAuvdlVbgHyYruy9isX6rA+wHuC+OlP98DQL7OOILG1q0orVIE6skLChGPYFWzoP0bMyuBeCEuf0Qc/rqmTXf0UQVxHW78A9sBhlndOOleVgxf+PfsUBTaIBLRiGEuE+pbQVOXJRIMmDe6Dn/HrTfAeB8BdkWBJW3dorT9Wm7j2Ve8psgqaQgAQWsh5oRB7cdxb11kmv1kqIDffTEV2NMapL1mU/f3+xGMHuFFnuIMqUWtT3atz0D2AVjzRnuswdau9NlHePgBAhqAHmwZW8PnT/vFs66gEcgVx1eciHutNy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 // @grant none // @run-at document-end // @antifeature Donate听说含捐赠功能需要添加此代码(无任何作用) // ==/UserScript== (function () { 'use strict'; // ========== 全局配置与状态 ========== const CONFIG_KEY = 'jm_helper_config_v583'; const COMPLETED_EXAMS_KEY = 'jm_completed_exams_v583'; // 使用短网址替代长base64 const ASSISTANT_IMAGE_SRC = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAE4CAMAAACaIvF3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDkuMC1jMDAwIDc5LjE3MWMyN2ZhYiwgMjAyMi8wOC8xNi0yMjozNTo0MSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0M2M1MDIyOS1iZWZhLTc3NDctYWI2ZS03NTdjZThjMzg2MGQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTAyMkE5OEE3RTdBMTFFRkFGQUI4MkQzMEFCN0U1OTMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTAyMkE5ODk3RTdBMTFFRkFGQUI4MkQzMEFCN0U1OTMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjAgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NDNjNTAyMjktYmVmYS03NzQ3LWFiNmUtNzU3Y2U4YzM4NjBkIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjQzYzUwMjI5LWJlZmEtNzc0Ny1hYjZlLTc1N2NlOGMzODYwZCIv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'; // 默认配置 (autoAnswer 默认为 true, maxExamRetryAttempts 固定为 10) const DEFAULT_CONFIG = { continuousExamMode: false, // 连续考试模式 autoMute: true, autoJumpUnfinished: true, autoSign: true, autoAnswer: true, // 默认开启 logLevel: 'INFO', // DEBUG, INFO, WARN, ERROR clickDelayMin: 300, clickDelayMax: 500, // maxExamRetryAttempts: 10 // 硬编码,不从配置读取 }; let config = { ...DEFAULT_CONFIG }; let currentMode = null; let lastUrl = location.href; let isProcessingExam = false; let shouldStopAutoAnswer = false; let isInitialized = false; // 防止重复初始化 let isPanelInjected = false; // 专门标记UI面板是否已注入 // 日志等级映射 const logLevels = { 'DEBUG': 0, 'INFO': 1, 'WARN': 2, 'ERROR': 3 }; let currentLogLevel = logLevels[config.logLevel]; // 视频模块相关状态 let silenceGuardActive = false; let silenceGuardInterval = null; let videoObserver = null; let signInterval = null; // ========== 工具函数 ========== function log(level, message, force = false) { if (force || logLevels[level] >= currentLogLevel) { const timestamp = new Date().toISOString().slice(11, 23); const styledMessage = `%c[${timestamp}] [${level}] ${message}`; const styles = { 'DEBUG': 'color: #BB86FC;', 'INFO': 'color: #03DAC6; font-weight: bold;', 'WARN': 'color: #FFD60A; font-weight: bold;', 'ERROR': 'color: #CF6679; font-weight: bold;' }; console.log(styledMessage, styles[level]); } } // 获取格式化时间戳 (时:分:秒) function getFormattedTimestamp() { const now = new Date(); const hours = String(now.getHours()).padStart(2, '0'); const minutes = String(now.getMinutes()).padStart(2, '0'); const seconds = String(now.getSeconds()).padStart(2, '0'); return `${hours}:${minutes}:${seconds}`; } // 三行滚动日志函数 function showScrollingLog(message, level = 'INFO') { const statusDiv = document.getElementById('jm-status'); if (!statusDiv) return; const timestamp = getFormattedTimestamp(); const logEntry = `[${timestamp}] ${message}`; const logColor = { 'DEBUG': '#BB86FC', 'INFO': '#03DAC6', 'WARN': '#FFD60A', 'ERROR': '#CF6679' }[level] || '#03DAC6'; // 获取现有的日志数组,如果没有则初始化 let logs = statusDiv.dataset.logs ? JSON.parse(statusDiv.dataset.logs) : []; // 添加新日志到数组开头 logs.unshift({ text: logEntry, color: logColor }); // 限制数组长度为3 if (logs.length > 3) { const removedLog = logs.pop(); // 移除最旧的日志 // 为被移除的日志设置淡出效果和延迟移除 setTimeout(() => { // 检查当前显示的日志是否包含被移除的日志内容 const currentText = statusDiv.innerHTML; if (currentText.includes(removedLog.text)) { // 如果当前显示的包含了要移除的,说明它已经被新的覆盖了,无需操作 // 如果它还在显示,我们需要替换它 const lines = currentText.split('
'); const updatedLines = lines.map(line => { if (line.includes(removedLog.text)) { return line.replace(/opacity:\s*1;/, 'opacity: 0.3; transition: opacity 0.5s ease;') .replace(/color:\s*[^;]+;/, `color: ${removedLog.color};`); } return line; }); statusDiv.innerHTML = updatedLines.join('
'); // 0.5秒后完全移除 setTimeout(() => { const finalLines = updatedLines.filter(line => !line.includes(removedLog.text)); statusDiv.innerHTML = finalLines.join('
'); }, 500); } }, 2000); // 2秒后开始淡出 } // 更新 data 属性 statusDiv.dataset.logs = JSON.stringify(logs); // 重构HTML内容 const htmlLines = logs.map((log, index) => { // 最新的一行 (index === 0) 持续显示,不设淡出 const opacityStyle = index === 0 ? 'opacity: 1;' : 'opacity: 1; transition: opacity 0.5s ease;'; return `${log.text}`; }); statusDiv.innerHTML = htmlLines.join('
'); } function isVisible(el) { if (!el || !(el instanceof HTMLElement)) return false; const style = window.getComputedStyle(el); if ( style.display === 'none' || style.visibility === 'hidden' || parseFloat(style.opacity) <= 0 || el.offsetWidth === 0 || el.offsetHeight === 0 ) { return false; } const rect = el.getBoundingClientRect(); return ( rect.bottom > 0 && rect.top < (window.innerHeight || document.documentElement.clientHeight) && rect.right > 0 && rect.left < (window.innerWidth || document.documentElement.clientWidth) ); } function safeClickElement(el) { if (!el) return false; if (!isVisible(el)) { el.scrollIntoView({ behavior: 'auto', block: 'center' }); // 等待滚动完成 return new Promise(resolve => setTimeout(() => { if (isVisible(el)) { const event = new MouseEvent('click', { view: window, bubbles: true, cancelable: true, button: 0 }); el.dispatchEvent(event); resolve(true); } else { resolve(false); } }, 300)); } else { const event = new MouseEvent('click', { view: window, bubbles: true, cancelable: true, button: 0 }); el.dispatchEvent(event); return Promise.resolve(true); } } function safeClickRadio(input) { if (!input || !(input instanceof HTMLInputElement)) return false; if (input.checked) return true; input.scrollIntoView({ behavior: 'auto', block: 'center' }); const container = input.closest('.el-radio') || input.parentElement; if (container && !isVisible(container)) { container.scrollIntoView({ behavior: 'auto', block: 'center' }); } input.checked = true; input.dispatchEvent(new Event('change', { bubbles: true })); input.dispatchEvent(new Event('input', { bubbles: true })); if (container && container.offsetParent !== null) { setTimeout(() => { if (isVisible(container)) { const event = new MouseEvent('click', { view: window, bubbles: true, cancelable: true, button: 0 }); container.dispatchEvent(event); } }, 50); } return input.checked; } function loadConfig() { try { const stored = localStorage.getItem(CONFIG_KEY); if (stored) { const parsed = JSON.parse(stored); config = { ...DEFAULT_CONFIG, ...parsed }; currentLogLevel = logLevels[config.logLevel]; log('INFO', '配置已从本地加载'); showScrollingLog('配置已从本地加载', 'INFO'); } else { log('INFO', '使用默认配置'); showScrollingLog('使用默认配置', 'INFO'); } } catch (e) { log('ERROR', `加载配置失败: ${e.message}`); showScrollingLog(`加载配置失败: ${e.message}`, 'ERROR'); config = { ...DEFAULT_CONFIG }; } } function saveConfig() { try { localStorage.setItem(CONFIG_KEY, JSON.stringify(config)); log('INFO', '配置已保存到本地'); } catch (e) { log('ERROR', `保存配置失败: ${e.message}`); showScrollingLog(`保存配置失败: ${e.message}`, 'ERROR'); } } function loadCompletedExams() { try { const stored = localStorage.getItem(COMPLETED_EXAMS_KEY); return stored ? JSON.parse(stored) : []; } catch (e) { log('ERROR', `加载已完成考核记录失败: ${e.message}`); showScrollingLog(`加载已完成考核记录失败: ${e.message}`, 'ERROR'); return []; } } function recordCompletedExam(videoTitle) { const completedList = loadCompletedExams(); if (!completedList.includes(videoTitle)) { completedList.push(videoTitle); try { localStorage.setItem(COMPLETED_EXAMS_KEY, JSON.stringify(completedList)); log('INFO', `已记录视频 "${videoTitle}" 为已完成考核。`); showScrollingLog(`已记录视频 "${videoTitle}" 为已完成考核。`, 'INFO'); } catch (e) { log('ERROR', `保存已完成考核记录失败: ${e.message}`); showScrollingLog(`保存已完成考核记录失败: ${e.message}`, 'ERROR'); } } } function hasCompletedExam(videoTitle) { const completedList = loadCompletedExams(); return completedList.includes(videoTitle); } // ========== 视频模块相关函数 ========== function enforceSilence(video) { if (video.hasAttribute('data-jm-auto-disabled')) return; video.muted = true; video.volume = 0; } function handleVideos() { if (!config.autoMute) return; document.querySelectorAll('video').forEach(video => { if (video.hasAttribute('data-jm-listening')) return; video.setAttribute('data-jm-listening', 'true'); enforceSilence(video); video.addEventListener('play', () => { video.removeAttribute('data-jm-auto-disabled'); log('DEBUG', '视频播放,已恢复静音'); }); }); } function startSilenceGuard() { if (silenceGuardActive || !config.autoMute) return; silenceGuardActive = true; silenceGuardInterval = setInterval(() => { document.querySelectorAll('video').forEach(enforceSilence); }, 800); window.addEventListener('beforeunload', () => clearInterval(silenceGuardInterval)); } function stopSilenceGuard() { if (silenceGuardInterval) { clearInterval(silenceGuardInterval); silenceGuardInterval = null; silenceGuardActive = false; log('INFO', '静音守护已停止'); showScrollingLog('静音守护已停止', 'INFO'); } } function autoJumpToUnfinishedVideo() { if (!config.autoJumpUnfinished) return; const items = document.querySelectorAll('.directoryList .item'); let foundUnfinished = false; for (const item of items) { const statusEl = item.querySelector('.status'); if (!statusEl) continue; const text = statusEl.textContent.trim(); const match = text.match(/^已学(\d+)%$/); if (match && parseInt(match[1], 10) < 100) { safeClickElement(item); log('INFO', `自动跳转至未完成视频:${item.querySelector('.title')?.textContent}`); showScrollingLog(`自动跳转至未完成视频`, 'INFO'); foundUnfinished = true; break; } } if (!foundUnfinished) { log('DEBUG', '未找到未完成视频'); } } function trySign() { if (!config.autoSign) return false; const now = Date.now(); const MIN_INTERVAL = 5000; const spans = document.querySelectorAll('button.el-button--primary span'); for (const span of spans) { if (span.textContent.trim() !== '点击签到') continue; const button = span.closest('button'); if (!button || button.disabled || button.classList.contains('is-disabled') || !isVisible(button)) continue; log('INFO', '签到按钮已点击'); showScrollingLog('签到按钮已点击', 'INFO'); safeClickElement(button); return true; } return false; } // 启动签到轮询 function startSignPolling() { if (signInterval) clearInterval(signInterval); if (config.autoSign) { signInterval = setInterval(() => { trySign(); }, 3000); log('INFO', '签到轮询已启动'); showScrollingLog('签到轮询已启动', 'INFO'); } } // 停止签到轮询 function stopSignPolling() { if (signInterval) { clearInterval(signInterval); signInterval = null; log('INFO', '签到轮询已停止'); showScrollingLog('签到轮询已停止', 'INFO'); } } // ========== UI 配置面板 ========== function injectUIPanel() { if (document.getElementById('jm-config-panel')) return; const panel = document.createElement('div'); panel.id = 'jm-config-panel'; panel.style.cssText = ` position: fixed; left: 0; top: 320px; z-index: 99999; background: linear-gradient(145deg, #1a1a2e, #16213e); color: #e6e6e6; /* 高对比度文字颜色 */ width: 280px; border-radius: 12px; box-shadow: 0 8px 24px rgba(0,0,0,0.5); font-family: 'Microsoft YaHei', sans-serif; padding: 12px; backdrop-filter: blur(6px); border: 1px solid rgba(100, 100, 255, 0.3); /* 更明显的边框 */ user-select: none; cursor: move; `; panel.innerHTML = `
🥇举名继教小助手 ${GM_info.script.version}
助手头像
开发者日志等级:
最小延迟 (ms):
最大延迟 (ms):
[${getFormattedTimestamp()}] 状态: 等待配置
`; document.body.appendChild(panel); const autoMuteInput = document.getElementById('jm-auto-mute'); const autoJumpInput = document.getElementById('jm-auto-jump'); const autoSignInput = document.getElementById('jm-auto-sign'); const continuousExamInput = document.getElementById('jm-continuous-exam'); const logLevelSelect = document.getElementById('jm-log-level'); const clickDelayMinInput = document.getElementById('jm-click-delay-min'); const clickDelayMaxInput = document.getElementById('jm-click-delay-max'); const saveBtn = document.getElementById('jm-save-config'); const resetBtn = document.getElementById('jm-reset-config'); const statusDiv = document.getElementById('jm-status'); function updateUIFromConfig() { autoMuteInput.checked = config.autoMute; autoJumpInput.checked = config.autoJumpUnfinished; autoSignInput.checked = config.autoSign; continuousExamInput.checked = config.continuousExamMode; logLevelSelect.value = config.logLevel; clickDelayMinInput.value = config.clickDelayMin; clickDelayMaxInput.value = config.clickDelayMax; currentLogLevel = logLevels[config.logLevel]; showScrollingLog(`配置已加载 - ${config.continuousExamMode ? '连续考试模式开启' : '常规模式'}`, 'INFO'); } // 监听复选框变化,立即生效 autoMuteInput.addEventListener('change', function () { config.autoMute = this.checked; saveConfig(); if (this.checked) { // 开启静音 handleVideos(); startSilenceGuard(); showScrollingLog('自动静音已开启', 'INFO'); } else { // 关闭静音 stopSilenceGuard(); // 恢复视频音量 document.querySelectorAll('video').forEach(video => { if (video.hasAttribute('data-jm-listening')) { video.muted = false; video.volume = 1; // 恢复到默认音量 } }); showScrollingLog('自动静音已关闭', 'INFO'); } }); autoJumpInput.addEventListener('change', function () { config.autoJumpUnfinished = this.checked; saveConfig(); if (this.checked) { // 如果在视频页面,立即执行跳转 if (location.href.includes('/MedicalIndex/videoPlay')) { setTimeout(() => { autoJumpToUnfinishedVideo(); }, 100); } showScrollingLog('自动跳转未学已开启', 'INFO'); } else { showScrollingLog('自动跳转未学已关闭', 'INFO'); } }); autoSignInput.addEventListener('change', function () { config.autoSign = this.checked; saveConfig(); if (this.checked) { startSignPolling(); showScrollingLog('自动签到已开启', 'INFO'); } else { stopSignPolling(); showScrollingLog('自动签到已关闭', 'INFO'); } }); continuousExamInput.addEventListener('change', function () { config.continuousExamMode = this.checked; saveConfig(); showScrollingLog(`连续考试模式已${this.checked ? '开启' : '关闭'}`, 'INFO'); // 如果开启且在视频页面,立即执行 if (this.checked && location.href.includes('/MedicalIndex/videoPlay')) { showScrollingLog('在视频页面开启连续考试模式,立即启动流程...', 'INFO'); setTimeout(() => { startContinuousExam(); // 调用连续考试函数 }, 100); } }); // 监听日志等级变化,立即生效 logLevelSelect.addEventListener('change', function () { config.logLevel = this.value; currentLogLevel = logLevels[this.value]; saveConfig(); showScrollingLog(`日志等级已更改为: ${this.value}`, 'INFO'); }); saveBtn.addEventListener('click', () => { const oldConfig = { ...config }; // 保存旧配置用于比较 config.logLevel = logLevelSelect.value; currentLogLevel = logLevels[config.logLevel]; // 更新当前日志等级 config.clickDelayMin = parseInt(clickDelayMinInput.value) || DEFAULT_CONFIG.clickDelayMin; config.clickDelayMax = parseInt(clickDelayMaxInput.value) || DEFAULT_CONFIG.clickDelayMax; saveConfig(); updateUIFromConfig(); showScrollingLog('配置已保存并应用', 'INFO'); }); resetBtn.addEventListener('click', () => { if (confirm('确定要重置所有配置为默认值吗?')) { config = { ...DEFAULT_CONFIG }; currentLogLevel = logLevels[config.logLevel]; // 更新当前日志等级 saveConfig(); updateUIFromConfig(); showScrollingLog('配置已重置为默认值', 'INFO'); // 重新初始化所有功能 if (config.autoMute) { handleVideos(); startSilenceGuard(); } else { stopSilenceGuard(); } if (config.autoSign) { startSignPolling(); } else { stopSignPolling(); } } }); // 初始加载配置 updateUIFromConfig(); // --- 拖拽功能 --- let isDragging = false; let offsetX, offsetY; panel.addEventListener('mousedown', (e) => { if (e.target === panel || panel.contains(e.target)) { if (e.target.closest('input, select, button')) return; // 避免在控件上拖拽 isDragging = true; offsetX = e.clientX - panel.getBoundingClientRect().left; offsetY = e.clientY - panel.getBoundingClientRect().top; panel.style.cursor = 'grabbing'; e.preventDefault(); } }); document.addEventListener('mousemove', (e) => { if (isDragging) { const x = e.clientX - offsetX; const y = e.clientY - offsetY; const maxX = window.innerWidth - panel.offsetWidth; const maxY = window.innerHeight - panel.offsetHeight; panel.style.left = `${Math.max(0, Math.min(x, maxX))}px`; panel.style.top = `${Math.max(0, Math.min(y, maxY))}px`; } }); document.addEventListener('mouseup', () => { if (isDragging) { isDragging = false; panel.style.cursor = 'move'; } }); // 标记面板已注入 isPanelInjected = true; } // ========== 连续考试核心逻辑 ========== async function startContinuousExam() { if (!config.continuousExamMode) { log('DEBUG', '连续考试模式未开启,不执行。'); return; } log('INFO', '开始连续考试流程'); showScrollingLog('开始连续考试流程', 'INFO'); // 查找所有视频项 const items = document.querySelectorAll('.directoryList .item'); if (items.length === 0) { log('WARN', '未找到视频列表项。'); showScrollingLog('未找到视频列表项', 'WARN'); return; } for (const item of items) { const statusEl = item.querySelector('.status'); if (!statusEl) continue; const text = statusEl.textContent.trim(); log('DEBUG', `检查视频项状态: "${text}"`); if (text === '待考核') { const videoTitleEl = item.querySelector('.title'); const videoTitle = videoTitleEl ? videoTitleEl.textContent.trim() : '未知视频'; // 检查本地记录,避免重复考核 if (hasCompletedExam(videoTitle)) { log('INFO', `视频 "${videoTitle}" 已在本地记录中,跳过。`); showScrollingLog(`视频 "${videoTitle}" 已完成,跳过`, 'INFO'); continue; } log('INFO', `即将进入考试:${videoTitle}`); showScrollingLog(`即将进入考试:${videoTitle}`, 'INFO'); await safeClickElement(item); // 等待页面跳转和加载 await new Promise(resolve => setTimeout(resolve, 5000)); // 查找并点击"开始考核"按钮 let startExamBtn = null; const maxRetries = 10; // 最多重试10次 (硬编码) let attempts = 0; while (attempts < maxRetries) { // **优化查找逻辑:尝试在更具体的上下文中查找** // 1. 尝试在页面主要内容区域查找 (例如 .content, .videoPlay, .main) // 这些类名是猜测的,您可能需要根据实际页面结构调整 const mainContainers = ['.content', '.videoPlay', '.main', '.video-content', '.play-container']; let foundInContainer = false; for (const containerSelector of mainContainers) { const container = document.querySelector(containerSelector); if (container) { log('DEBUG', `在容器 ${containerSelector} 中查找...`); // 在容器内部查找 const allAssessDivsInContainer = container.querySelectorAll('[class*="Assess"]'); log('DEBUG', `在 ${containerSelector} 中找到 ${allAssessDivsInContainer.length} 个 [class*="Assess"] 元素。`); for (const div of allAssessDivsInContainer) { if (div.innerText.trim() === '开始考核' && isVisible(div)) { startExamBtn = div; log('DEBUG', `在容器 ${containerSelector} 中找到可见的"开始考核"按钮:`, startExamBtn); foundInContainer = true; break; } } if (foundInContainer) break; // 如果在某个容器找到,就跳出循环 } } // 2. 如果在容器中没找到,再尝试全局查找 if (!foundInContainer) { log('DEBUG', `在指定容器中未找到,尝试全局查找...`); const allAssessDivs = document.querySelectorAll('[class*="Assess"]'); log('DEBUG', `全局找到 ${allAssessDivs.length} 个 [class*="Assess"] 元素。`); for (const div of allAssessDivs) { // **关键改进:增加可见性检查** if (div.innerText.trim() === '开始考核' && isVisible(div)) { startExamBtn = div; log('DEBUG', `全局找到可见的"开始考核"按钮:`, startExamBtn); break; } } } if (startExamBtn) { log('INFO', '找到"开始考核"按钮,准备点击...'); showScrollingLog('找到"开始考核"按钮,准备点击...', 'INFO'); await safeClickElement(startExamBtn); log('INFO', '"开始考核"按钮已点击,等待二维码出现。'); showScrollingLog('"开始考核"按钮已点击,等待二维码出现。', 'INFO'); // 点击后,脚本任务完成,用户手动扫码 return; // 退出循环,等待用户操作 } else { log('DEBUG', `未找到可见的"开始考核"按钮,等待后重试 (${attempts + 1}/${maxRetries})...`); await new Promise(resolve => setTimeout(resolve, 1000)); // 等待1秒再试 attempts++; } } if (!startExamBtn) { log('ERROR', `在视频 "${videoTitle}" 页面尝试 ${maxRetries} 次后仍未找到可见的"开始考核"按钮。`); showScrollingLog(`未找到"开始考核"按钮,跳过 "${videoTitle}"`, 'ERROR'); // 如果点击了视频但没找到按钮,可能需要回到列表继续下一个 window.history.back(); // 尝试返回列表页 await new Promise(resolve => setTimeout(resolve, 2000)); // 等待页面加载 } } } log('INFO', '连续考试流程结束,未找到更多"待考核"视频。'); showScrollingLog('连续考试流程结束', 'INFO'); } // ========== 视频模块 ========== function initVideoModule() { if (currentMode === 'video') return; currentMode = 'video'; log('INFO', '视频模块已启动'); showScrollingLog('视频模块已启动', 'INFO'); // 初始化视频模块时根据配置启动相应功能 if (config.autoMute) { handleVideos(); startSilenceGuard(); } if (config.autoSign) { startSignPolling(); } // 监听DOM变化,处理新出现的视频元素 if (!videoObserver) { videoObserver = new MutationObserver(() => { if (config.autoMute) handleVideos(); if (config.autoSign) trySign(); }); videoObserver.observe(document.body, { childList: true, subtree: true }); } // 在视频列表页面,如果开启了连续考试模式,启动连续考试 if (config.continuousExamMode) { log('INFO', '页面加载时连续考试模式已开启,启动流程...'); showScrollingLog('连续考试模式已开启,启动流程...', 'INFO'); startContinuousExam(); } // 如果开启了自动跳转未学,立即执行一次 if (config.autoJumpUnfinished) { setTimeout(() => { autoJumpToUnfinishedVideo(); }, 800); } } // ========== 考试模块 ========== function initExamModule() { if (currentMode === 'exam' || !config.autoAnswer) return; // config.autoAnswer 现在始终为 true currentMode = 'exam'; log('INFO', '考试模块已启动'); showScrollingLog('考试模块已启动', 'INFO'); let hasSubmitted = false; let isAnswering = false; let retryAttempts = 0; const MAX_RETRY_ATTEMPTS = 10; // 硬编码为 10 const CACHE_KEY = 'jm_smart_answers_v583'; function getQuestions() { return Array.from(document.querySelectorAll('.itemTopic')).filter(el => { const hasOptions = el.querySelector('input[type="radio"].el-radio__original'); const hasTitleOrStem = el.querySelector('.title') || el.querySelector('.stem') || el.innerText.trim(); return hasOptions && hasTitleOrStem; }); } function getOptions(questionEl) { return Array.from(questionEl.querySelectorAll('input[type="radio"].el-radio__original')); } function getQuestionHash(questionEl) { let stem = questionEl.querySelector('.title')?.innerText || questionEl.querySelector('.stem')?.innerText || (questionEl.innerText.match(/^(.{0,300})/)?.[0] || ''); stem = stem .replace(/^\s*\d+[、.\s]?\s*/, '') .replace(/((单选题|多选题|判断题))/g, '') .replace(/【判断题】/g, '') .trim(); if (!stem) return null; const clean = stem .replace(/[^\u4e00-\u9fa5a-zA-Z0-9\uFF01-\uFF5E!?。,;:]/g, '') .substring(0, 250); if (!clean) return null; let hash = 0; for (let i = 0; i < clean.length; i++) { const char = clean.charCodeAt(i); hash = ((hash << 5) - hash) + char; hash |= 0; } return 'q' + Math.abs(hash).toString(36); } function loadCache() { try { return JSON.parse(localStorage.getItem(CACHE_KEY) || '{}'); } catch (e) { localStorage.removeItem(CACHE_KEY); return {}; } } function saveRecord(hash, record) { const cache = loadCache(); cache[hash] = record; localStorage.setItem(CACHE_KEY, JSON.stringify(cache)); } function learnFromResultDialog() { const questions = getQuestions(); if (questions.length === 0) { log('WARN', '未找到题目,跳过学习'); showScrollingLog('未找到题目,跳过学习', 'WARN'); return; } const errorNumbers = [...document.querySelectorAll('.sheetBox.error')].map(el => parseInt(el.innerText.trim(), 10)); const successNumbers = [...document.querySelectorAll('.sheetBox.success')].map(el => parseInt(el.innerText.trim(), 10)); log('INFO', `正确: [${successNumbers.join(', ')}] 错误: [${errorNumbers.join(', ')}]`); showScrollingLog(`答题结果: 正确${successNumbers.length}, 错误${errorNumbers.length}`, 'INFO'); for (const num of successNumbers) { const idx = num - 1; if (idx >= 0 && idx < questions.length) { const q = questions[idx]; const hash = getQuestionHash(q); const selected = q.querySelector('input.el-radio__original:checked'); if (hash && selected) { const rec = loadCache()[hash] || { tried: [] }; rec.correct = selected.value; rec.tried = [...new Set([...rec.tried, selected.value])]; saveRecord(hash, rec); } } } for (const num of errorNumbers) { const idx = num - 1; if (idx >= 0 && idx < questions.length) { const q = questions[idx]; const hash = getQuestionHash(q); const selected = q.querySelector('input.el-radio__original:checked'); if (hash && selected?.value) { const rec = loadCache()[hash] || { tried: [] }; if (!rec.tried.includes(selected.value)) { rec.tried.push(selected.value); delete rec.correct; saveRecord(hash, rec); } } } } } function clickReAnswer() { const reBtn = [...document.querySelectorAll('.el-dialog .el-button--primary')] .find(btn => btn.innerText.trim() === '重新答题'); if (reBtn) { safeClickElement(reBtn); log('INFO', '点击【重新答题】'); showScrollingLog('点击【重新答题】', 'INFO'); return true; } return false; } function waitForResultDialog() { log('INFO', '开始轮询结果弹窗...'); showScrollingLog('等待考核结果...', 'INFO'); let attempts = 0; const maxAttempts = 20; const check = setInterval(() => { attempts++; const allHeaders = document.querySelectorAll('.el-dialog__header'); const targetHeader = Array.from(allHeaders).find(header => header.innerText.includes('考核未通过') ); if (targetHeader) { clearInterval(check); log('INFO', '成功检测到考核未通过弹窗!'); showScrollingLog('考核未通过,学习答案中...', 'INFO'); learnFromResultDialog(); setTimeout(() => { if (clickReAnswer()) { hasSubmitted = false; isAnswering = false; retryAttempts++; if (retryAttempts <= MAX_RETRY_ATTEMPTS) { log('INFO', `重答第 ${retryAttempts} 次`); showScrollingLog(`重答第 ${retryAttempts} 次`, 'INFO'); waitForAllQuestionsLoaded().then(autoAnswer); } else { log('ERROR', `重答次数已达到上限 ${MAX_RETRY_ATTEMPTS} 次,停止自动答题。`); showScrollingLog(`重答次数已达上限,停止自动答题`, 'ERROR'); shouldStopAutoAnswer = true; } } }, 800); return; } if (attempts >= maxAttempts) { clearInterval(check); log('WARN', '轮询超时:未检测到结果弹窗'); showScrollingLog('未检测到结果弹窗', 'WARN'); // 如果是连续考试模式,且超时,可能需要通知上层 } }, 500); } async function waitForAllQuestionsLoaded() { return new Promise((resolve) => { const MAX_INITIAL_WAIT = 10000; const MAX_TOTAL_TIME = 12000; const startTime = Date.now(); log('INFO', '等待题目初始化(AJAX加载中)...'); showScrollingLog('等待题目加载...', 'INFO'); function waitForInitialQuestion() { const firstQuestion = document.querySelector('.itemTopic'); if (firstQuestion) { log('INFO', '首题已加载,开始渐进滚动...'); showScrollingLog('题目加载中...', 'INFO'); startProgressiveScroll(); return; } if (Date.now() - startTime > MAX_INITIAL_WAIT) { log('WARN', '首题超时,仍尝试滚动'); showScrollingLog('题目加载超时,继续...', 'WARN'); startProgressiveScroll(); return; } setTimeout(waitForInitialQuestion, 300); } let currentCount = 0; let stableRounds = 0; const REQUIRED_STABLE_ROUNDS = 3; function startProgressiveScroll() { const checkAndScroll = () => { if (Date.now() - startTime > MAX_TOTAL_TIME) { log('WARN', '总加载超时'); showScrollingLog('题目加载超时', 'WARN'); resolve(); return; } const questions = document.querySelectorAll('.itemTopic'); const newCount = questions.length; if (newCount === currentCount) { stableRounds++; if (stableRounds >= REQUIRED_STABLE_ROUNDS) { log('INFO', `题目加载完成!共 ${newCount} 道`); showScrollingLog(`题目加载完成!共 ${newCount} 道`, 'INFO'); resolve(); return; } } else { stableRounds = 0; currentCount = newCount; log('DEBUG', `当前题目数: ${newCount}`); } const scrollTop = window.scrollY || document.documentElement.scrollTop; const clientHeight = window.innerHeight || document.documentElement.clientHeight; const scrollHeight = Math.max( document.body.scrollHeight, document.documentElement.scrollHeight ); if (scrollTop < scrollHeight - clientHeight - 10) { window.scrollTo(0, scrollTop + clientHeight); } setTimeout(checkAndScroll, Math.random() * 400 + 600); }; checkAndScroll(); } waitForInitialQuestion(); }); } async function autoAnswer() { if (!config.autoAnswer || shouldStopAutoAnswer) { // config.autoAnswer 现在始终为 true log('INFO', '自动答题已禁用或收到停止信号,停止答题。'); showScrollingLog('自动答题已停止', 'INFO'); isAnswering = false; return; } if (isAnswering || hasSubmitted) return; isAnswering = true; showScrollingLog('开始自动答题...', 'INFO'); const questions = getQuestions(); if (questions.length === 0) { isAnswering = false; showScrollingLog('未找到题目', 'WARN'); return; } log('INFO', `共检测到 ${questions.length} 道题,开始逐题作答...`); for (let i = 0; i < questions.length; i++) { if (!config.autoAnswer || shouldStopAutoAnswer) { // config.autoAnswer 现在始终为 true log('INFO', '自动答题已禁用或收到停止信号,停止答题。'); showScrollingLog('自动答题已停止', 'INFO'); isAnswering = false; return; } const q = questions[i]; const hash = getQuestionHash(q); const options = getOptions(q); if (options.length === 0) continue; const cache = loadCache(); const record = hash ? (cache[hash] || { tried: [] }) : { tried: [] }; let targetOption = null; if (record.correct !== undefined) { targetOption = options.find(opt => opt.value === record.correct); } if (!targetOption) { targetOption = options.find(opt => !record.tried.includes(opt.value)); } if (!targetOption) { targetOption = options[0]; // fallback } log('DEBUG', `正在作答第 ${i + 1} 题...`); safeClickRadio(targetOption); const delay = Math.random() * (config.clickDelayMax - config.clickDelayMin) + config.clickDelayMin; await new Promise(r => setTimeout(r, delay)); } if (!config.autoAnswer || shouldStopAutoAnswer) { // config.autoAnswer 现在始终为 true log('INFO', '自动答题已禁用或收到停止信号,跳过提交。'); showScrollingLog('自动答题已停止,跳过提交', 'INFO'); isAnswering = false; return; } setTimeout(() => { if (hasSubmitted) return; const submitBtn = document.querySelector('.submitBtn .btns'); if (submitBtn) { hasSubmitted = true; log('INFO', '点击提交按钮'); showScrollingLog('点击提交按钮', 'INFO'); safeClickElement(submitBtn); shouldStopAutoAnswer = false; // 提交后重置 setTimeout(waitForResultDialog, 1500); } isAnswering = false; }, 1000); } // 只有在考试页面时才注入UI面板 if (location.href.includes('/MedicalIndex/medicalAssess')) { injectUIPanel(); } if (config.autoAnswer) { // config.autoAnswer 现在始终为 true waitForAllQuestionsLoaded().then(() => { if (getQuestions().length > 0 && !hasSubmitted && config.autoAnswer && !shouldStopAutoAnswer) { autoAnswer(); } }); } else { log('INFO', '自动答题未开启,考试页面不自动答题。'); } const examObserver = new MutationObserver(() => { if (getQuestions().length > 0 && !hasSubmitted && !isAnswering && config.autoAnswer && !shouldStopAutoAnswer) { // config.autoAnswer 现在始终为 true examObserver.disconnect(); waitForAllQuestionsLoaded().then(autoAnswer); } }); examObserver.observe(document.body, { childList: true, subtree: true }); } // ========== 页面类型检测与初始化 ========== function checkCurrentPage() { const url = location.href; const isExam = url.includes('/MedicalIndex/medicalAssess'); const isVideo = url.includes('/MedicalIndex/videoPlay'); // 检查是否为支持的页面 const isSupportedPage = isExam || isVideo; if (url === lastUrl && currentMode) { return; } lastUrl = url; currentMode = null; // 重置模式,允许重新初始化 // 只有在支持的页面才初始化 if (isSupportedPage) { if (!isInitialized) { loadConfig(); isInitialized = true; } // 在支持的页面上才注入UI面板 if (!isPanelInjected) { injectUIPanel(); } if (isExam) { initExamModule(); } else if (isVideo) { initVideoModule(); } } else { // 在非支持页面,确保UI面板被移除 if (isPanelInjected) { const panel = document.getElementById('jm-config-panel'); if (panel) { panel.remove(); isPanelInjected = false; } } // 停止视频相关功能 if (videoObserver) { videoObserver.disconnect(); videoObserver = null; } stopSilenceGuard(); stopSignPolling(); } } checkCurrentPage(); setInterval(checkCurrentPage, 1000); document.addEventListener('visibilitychange', () => { if (!document.hidden) { setTimeout(checkCurrentPage, 300); } }); })();