// ==UserScript==
// @name 课程作业自动答题(从解析获取答案)
// @namespace http://tampermonkey.net/
// @version 0.0.6
// @description 自动提取解析中的答案并勾选,并自动交卷(含确认弹窗)
// @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($) {
// 创建浮动控制面板
const panel = $(`
`).appendTo('body');
// 日志输出
function log(msg) {
$('#answerLog').prepend(`${new Date().toLocaleTimeString()} - ${msg}
`);
if ($('#answerLog div').length > 20) $('#answerLog div:last').remove();
}
// 从解析区域获取答案字母
function getAnswerFromSolution($question) {
const $solution = $question.find('.solution');
if (!$solution.length) return null;
// 答案示例:C
const answerText = $solution.find('.right').text().trim();
if (!answerText) return null;
const match = answerText.match(/[A-D]/i);
return match ? match[0].toUpperCase() : null;
}
// 自动答题主函数
function autoAnswer() {
log('开始扫描题目...');
let successCount = 0;
let failCount = 0;
$('.m-question').each(function(index) {
const $q = $(this);
const questionText = $q.find('.sub-dotitle pre').text().trim();
const answerLetter = getAnswerFromSolution($q);
if (!answerLetter) {
log(`❌ 第${index+1}题 未找到答案(题目:${questionText.substring(0,20)}...)`);
failCount++;
return;
}
const $targetOption = $q.find(`dd[data-value="${answerLetter}"]`);
if (!$targetOption.length) {
log(`⚠️ 第${index+1}题 答案 ${answerLetter} 但无对应选项`);
failCount++;
return;
}
$targetOption.click();
$targetOption[0].dispatchEvent(new Event('click', { bubbles: true }));
log(`✅ 第${index+1}题 已勾选答案 ${answerLetter}(${questionText.substring(0,30)})`);
successCount++;
});
log(`答题完成!成功 ${successCount} 题,失败 ${failCount} 题。`);
return successCount; // 返回成功数量,用于判断是否全部答完
}
// 自动交卷(含确定弹窗处理)
function autoSubmit() {
const $submitBtn = $('#btn_submit');
if (!$submitBtn.length) {
log('❌ 未找到交卷按钮(#btn_submit)');
return;
}
log('正在交卷...');
$submitBtn.click();
$submitBtn[0].dispatchEvent(new Event('click', { bubbles: true }));
// 监听确认弹窗并自动点击确定
let confirmClicked = false;
const checkConfirm = setInterval(() => {
// 常见的确认弹窗按钮选择器
const confirmBtn = $('.layui-layer-btn0:contains("确定"), .layui-layer-btn0:contains("确认"), .confirm-btn:contains("确定")');
if (confirmBtn.length && !confirmClicked) {
confirmClicked = true;
log('检测到确认弹窗,自动点击确定...');
confirmBtn.click();
clearInterval(checkConfirm);
}
}, 200);
// 最多等待 5 秒,超时清除定时器
setTimeout(() => {
clearInterval(checkConfirm);
if (!confirmClicked) log('⚠️ 未检测到确认弹窗,可能已经提交或弹窗选择器不匹配');
}, 5000);
}
// 入口:自动完成所有步骤(答题 + 交卷)
let autoExecuted = false;
function runFullAuto() {
if (autoExecuted) return;
autoExecuted = true;
log('🚀 自动模式启动...');
// 稍微延迟确保题目完全加载(尤其是动态加载的情况)
setTimeout(() => {
const successCount = autoAnswer();
// 无论答题成功几个,都尝试交卷(也可以设置只有全部答完才交卷,这里按需)
setTimeout(() => {
autoSubmit();
}, 1500);
}, 1000);
}
// 绑定手动按钮事件
$('#startAnswerBtn').on('click', function() {
autoAnswer();
});
$('#submitPaperBtn').on('click', function() {
autoSubmit();
});
log('脚本已加载,将自动答题并交卷...');
// 页面加载完成后自动执行
runFullAuto();
});
})();