// ==UserScript== // @name 学习通自动打分挂机脚本 // @namespace http://tampermonkey.net/ // @version 1.1 // @description 自动填写分数并点击提交 // @author jjw // @match https://mooc2-ans.chaoxing.com/mooc2-ans/work/library/review-work* // @grant none // ==/UserScript== (function() { 'use strict'; // --- 配置区域 --- var CONFIG = { inputSelector: '.questionScore', btnSelector: 'a[onclick="markAction(0)"]', intervalTime: 2000, autoSubmit: true, // 【调试模式】先设为 false,没问题了再改为 true reReview: false }; // 打印一句日志,证明脚本加载成功了 console.log("🚀 油猴脚本已启动!正在监听: " + window.location.href); // --- 定时器主逻辑 --- setInterval(function() { // 获取元素 var inputs = document.querySelectorAll(CONFIG.inputSelector); var submitBtn = document.querySelector(CONFIG.btnSelector); // 只有当找到题目时,才打印日志,避免控制台被刷屏 if (inputs.length > 0) { var reviewCount = 0; inputs.forEach(function(input) { if (CONFIG.reReview || input.value === "") { reviewCount++; // 随机打分逻辑 var placeholderText = input.getAttribute('placeholder'); var maxScore = 10; if (placeholderText && placeholderText.indexOf('-') > -1) { maxScore = parseFloat(placeholderText.split('-')[1]); } var minLimit = Math.ceil(maxScore * 0.7); var maxLimit = Math.floor(maxScore * 0.9); var randomScore = Math.floor(Math.random() * (maxLimit - minLimit + 1)) + minLimit; // 填值与触发事件 input.value = randomScore; input.dispatchEvent(new Event('input', { bubbles: true })); if(input.onkeyup) input.onkeyup(); if(input.onblur) input.onblur(); input.dispatchEvent(new Event('blur', { bubbles: true })); console.log("已填写分数: " + randomScore); } }); if (reviewCount === 0) { console.log("✅ 所有题目已填完"); if (submitBtn) { if (CONFIG.autoSubmit) { console.log(">>> 执行点击提交..."); submitBtn.click(); } else { // 提示用户手动开启 console.log("等待提交... (请在代码中将 autoSubmit 改为 true 以开启自动点击)"); } } else { console.log("❌ 没找到提交按钮"); } } else { console.log("本轮填写了 " + reviewCount + " 个空缺,等待保存..."); } } // 如果连输入框都找不到,可能是因为还在加载,或者脚本运行在了错误的iframe层级 else { // 只有在找不到元素时才偶尔报一下,防止刷屏 // console.log("未检测到题目元素..."); } }, CONFIG.intervalTime); })();