// ==UserScript== // @name Auto grading // @namespace http://tampermonkey.net/ // @version 0.4.0 // @description USTC 自动评价 tqm.ustc.edu.cn // @author PRO_2684 // @match https://tqm.ustc.edu.cn/index.html* // @icon https://tqm.ustc.edu.cn/favicon.ico // @grant none // @license gpl-3.0 // @require https://greasyfork.org/scripts/468177-%E6%95%99%E5%AD%A6%E8%B4%A8%E9%87%8F%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0%E6%A0%87%E5%87%86%E7%AD%94%E6%A1%88/code/%E6%95%99%E5%AD%A6%E8%B4%A8%E9%87%8F%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0%E6%A0%87%E5%87%86%E7%AD%94%E6%A1%88.js?version=1201736 // @downloadURL none // ==/UserScript== (function() { 'use strict'; let menu_root; function append_link() { let auto_grade = document.createElement('li'); auto_grade.innerText = "自动评价"; auto_grade.onclick = grade; auto_grade.setAttribute('class', 'ant-menu-item'); menu_root.appendChild(auto_grade); let ignore_continue = document.createElement('li'); ignore_continue.innerText = "忽略并转到下一个"; ignore_continue.onclick = ignore; ignore_continue.setAttribute('class', 'ant-menu-item'); menu_root.appendChild(ignore_continue); } function grade() { let questions = document.querySelectorAll("[class|='index_subject']"); questions.forEach((question) => { let required = Boolean(question.querySelector('[class|="index_necessary"]')); if (!required) return; let tmp = question.querySelector("[class|='index_title']").querySelectorAll('p'); let title = tmp[tmp.length - 1].innerText; let standard_answer = standard_answers[title]; console.log(`[Auto grading] ${title}: ${standard_answer}`); if (standard_answer) { let options = question.querySelectorAll('[style="width: 100%;"]'); options.forEach((option) => { let is_standard_answer = (standard_answer.indexOf(option.innerText) >= 0); if (is_standard_answer) { option.firstChild.click(); } }); } }); } function ignore() { let ignore_btn = root_node.querySelector("[class|='TaskDetailsMainContent_normalButton']"); if (ignore_btn && ignore_btn.parentElement.parentElement.parentElement.getAttribute('aria-hidden') == 'false') { ignore_btn.click(); } else { console.log("[Auto grading] 未找到忽略按钮!"); } let tabs = root_node.querySelector("[class='ant-tabs-nav-scroll']"); if (tabs) { tabs = tabs.children[0].children[0]; } else { console.log("[Auto grading] 未找到教师/助教列表!"); return; } let flag = false; let tab; for (tab of tabs.children) { if (flag) { tab.click(); break; } else if (tab.getAttribute('aria-selected') == 'true') { flag = true; } } } const root_node = document.getElementById('root'); const config = { attributes: false, childList: true, subtree: true }; const callback = function(mutations, observer) { menu_root = root_node.querySelector('.ant-menu-root'); if (menu_root) { append_link(); observer.disconnect(); } } const observer = new MutationObserver(callback); observer.observe(root_node, config); })();