// ==UserScript== // @name 联大学堂课程作业自动答题 // @namespace http://tampermonkey.net/ // @version 1.2 // @description 自动勾选所有答案(支持单选A-E和多选) // @match https://*.jxjypt.cn/paper/start* // @grant none // @run-at document-end // ==/UserScript== (function() { 'use strict'; // 等待 jQuery 加载 function waitForJQuery(callback) { if (window.jQuery) { callback(window.jQuery); } else { setTimeout(() => waitForJQuery(callback), 100); } } waitForJQuery(function($) { // 自动勾选所有答案 function selectAnswers() { let successCount = 0; let failCount = 0; let totalQuestions = $('.m-question').length; console.log(`共检测到 ${totalQuestions} 道题目,开始答题...`); $('.m-question').each(function(index) { const $question = $(this); // 从隐藏解析区获取答案文本 const answerElem = $question.find('.solution .right'); if (!answerElem.length) { console.log(`❌ 第${index+1}题:未找到答案区域`); failCount++; return; } const answerText = answerElem.text().trim(); if (!answerText) { console.log(`❌ 第${index+1}题:答案为空`); failCount++; return; } // 提取所有字母(A-E),支持 "C"、"ABDE"、"ABCDE" 等格式 const letterMatches = answerText.match(/[A-E]/gi); if (!letterMatches || letterMatches.length === 0) { console.log(`❌ 第${index+1}题:未识别到答案字母 (${answerText})`); failCount++; return; } // 转换为大写并去重 const uniqueLetters = []; for (let m of letterMatches) { let letter = m.toUpperCase(); if (!uniqueLetters.includes(letter)) { uniqueLetters.push(letter); } } console.log(`📝 第${index+1}题:答案 ${uniqueLetters.join('')} (原始: ${answerText})`); // 逐个勾选答案 let selectedCount = 0; for (let i = 0; i < uniqueLetters.length; i++) { const letter = uniqueLetters[i]; // 查找对应选项(使用属性选择器精确匹配) const $option = $question.find(`dd[data-value="${letter}"]`); if ($option.length === 0) { console.log(`⚠️ 第${index+1}题:未找到选项 ${letter}`); continue; } // 模拟点击 $option.click(); $option[0].dispatchEvent(new Event('click', { bubbles: true })); // 对于多选题,额外触发 change 事件(有些页面需要) $option.find('i').trigger('click'); selectedCount++; // 稍微延迟,避免事件冲突(多选题之间间隔一点时间) if (uniqueLetters.length > 1 && i < uniqueLetters.length - 1) { // 同步延迟会让整体变慢,这里不做延迟,仅做标记 } } if (selectedCount === uniqueLetters.length) { console.log(`✅ 第${index+1}题 已勾选 ${uniqueLetters.join(',')} (${selectedCount}/${uniqueLetters.length})`); successCount++; } else { console.log(`⚠️ 第${index+1}题 部分勾选成功 (${selectedCount}/${uniqueLetters.length})`); failCount++; } }); console.log(`📊 答题完成:成功 ${successCount} 题,失败 ${failCount} 题,总计 ${totalQuestions} 题`); // 可选:显示答题卡状态 const doneCount = $('.e__answerCard.doit').length; console.log(`📋 答题卡显示已做 ${doneCount} 题`); } // 阻止页面自动滚动(保持视图稳定) function preventAutoScroll() { // 方法1:监听滚动事件并阻止(可选) window.addEventListener('scroll', function(e) { // 只是记录,不阻止用户主动滚动 }); // 方法2:如果有自动滚动逻辑,可以尝试暂停 if (window.paper && paper.g_auto_scroll !== undefined) { paper.g_auto_scroll = false; console.log('已暂停页面自动滚动'); } } // 主流程 setTimeout(() => { preventAutoScroll(); selectAnswers(); }, 1500); // 增加延迟,确保页面完全加载 }); })();