// ==UserScript== // @name 数学弹窗自动处理(环境隔离版) // @namespace http://tampermonkey.net/ // @version 1.0 // @description 每10秒自动检查并处理数学弹窗(隔离环境+独立定时) // @author 脚本猫用户 // @match *://zdkj.v.zzu.edu.cn/play/* // @grant none // @license MIT // ==/UserScript== (function() { 'use strict'; // 初始化脚本状态(用于原函数的频率限制) const scriptState = { lastPopupCheck: 0 // 记录上次检查弹窗的时间 }; // 日志函数(适配原函数的log调用) function log(message) { const time = new Date().toLocaleTimeString(); console.log(`[${time}] 弹窗处理: ${message}`); } // 关闭弹窗函数(原函数提供) function closePopup(popup) { try { log("尝试关闭弹窗..."); // 尝试多种关闭按钮选择器 let closeBtn = popup.querySelector('button.close-btn, .close-button, [aria-label="关闭"], .ant-modal-close, .dialog-close'); if (!closeBtn) { // 如果找不到标准关闭按钮,尝试在弹窗内查找文本包含"关闭"的按钮 const buttons = popup.querySelectorAll('button'); for (const btn of buttons) { if (btn.textContent.includes('关闭') || btn.textContent.includes('关窗') || btn.textContent.includes('关') || btn.textContent.includes('确定') || btn.textContent.includes('完成')) { closeBtn = btn; break; } } } if (closeBtn) { closeBtn.click(); log('已点击关闭按钮'); } else { log('未找到关闭按钮,尝试隐藏弹窗'); popup.style.display = 'none'; } } catch (error) { log(`关闭弹窗时出错: ${error.message}`); } } // 主处理函数(原函数提供) function handleMathPopup() { try { // 优化性能:限制检查频率(原逻辑保留) const now = Date.now(); if (now - scriptState.lastPopupCheck < 1000) return false; scriptState.lastPopupCheck = now; log("正在检查弹窗..."); // 尝试多种方式查找弹窗 let popup = document.querySelector('.m-exam-dialog, .ant-modal-content'); if (!popup) { const dialogs = document.querySelectorAll('[role="dialog"]'); if (dialogs.length) popup = dialogs[0]; } if (!popup) { log("未找到弹窗元素"); return false; } // 检查弹窗是否可见 const isVisible = popup.offsetWidth > 0 && popup.offsetHeight > 0; if (!isVisible) { log("弹窗存在但不可见"); return false; } log("找到弹窗元素,开始处理..."); // 获取题目 let questionEl = popup.querySelector('.d-qus-body[data-id="topic"], .exam-question'); if (!questionEl) { const divs = popup.querySelectorAll('div'); for (const div of divs) { if (div.textContent.includes('=') && div.textContent.includes('?')) { questionEl = div; break; } } } if (!questionEl) { log("未找到题目元素"); return false; } const question = questionEl.textContent.trim(); log(`题目: ${question}`); // 解析并计算答案 const match = question.match(/(\d+)\s*([\+\-\×\÷xX*])\s*(\d+)\s*=\s*\?/); if (!match) { log("无法解析题目"); return false; } const num1 = parseInt(match[1]), num2 = parseInt(match[3]); const operator = match[2]; let answer; switch(operator) { case '+': answer = num1 + num2; break; case '-': answer = num1 - num2; break; case '×': case 'x': case 'X': case '*': answer = num1 * num2; break; case '÷': answer = Math.floor(num1 / num2); break; default: log(`不支持的运算符: ${operator}`); return false; } log(`计算答案: ${answer}`); // 选择正确答案 let options = popup.querySelectorAll('.d-slt.y, .exam-option, .answer-option'); let selected = false; for (const option of options) { let contentSpan = option.querySelector('.ipt-txt-content, .option-text, .answer-text'); if (contentSpan) { const optionText = contentSpan.textContent.trim(); const optionValue = parseInt(optionText); if ((!isNaN(optionValue) && optionValue === answer) || optionText === String(answer)) { let radio = option.querySelector('input[type="radio"], input[type="checkbox"]'); if (radio) { radio.click(); log(`已选择选项: ${optionText}`); selected = true; break; } } } } if (selected) { // 提交答案 setTimeout(() => { let submitBtn = popup.querySelector('button.blue[data-action="answer"], .submit-button, .exam-submit'); if (submitBtn) { submitBtn.click(); log('答案已提交'); // 关闭弹窗 setTimeout(() => { closePopup(popup); }, 800); } else { log('未找到提交按钮'); } }, 500); return true; } else { log('未找到匹配选项'); return false; } } catch (error) { log(`发生错误: ${error.message}`); console.error(error); return false; } } // 独立定时逻辑(基于requestAnimationFrame,不受页面环境干扰) let lastExecTime = 0; const interval = 10000; // 10秒间隔 function loopCheck() { const now = Date.now(); // 达到10秒间隔时执行处理函数 if (now - lastExecTime >= interval) { handleMathPopup(); // 执行弹窗处理逻辑 lastExecTime = now; // 更新最后执行时间 } // 持续调度下一次检查(独立于页面JS环境) requestAnimationFrame(loopCheck); } // 初始化脚本 function init() { const time = new Date().toLocaleTimeString(); log(`脚本启动成功,每10秒自动检查弹窗`); lastExecTime = Date.now(); // 记录初始时间 loopCheck(); // 启动循环检查 } // 页面完全加载后启动(避免与页面初始化冲突) window.addEventListener('load', init); })();