您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Skip the half of the fun!
当前为
// ==UserScript== // @name Sorryops // @namespace https://git.disroot.org/electromagneticcyclone/sorryops // @version 20240422.1 // @description Skip the half of the fun! // @icon https://orioks.miet.ru/favicon.ico // @author electromagneticcyclone & angelbeautifull // @license Unlicense // @supportURL https://git.disroot.org/electromagneticcyclone/sorryops // @match https://orioks.miet.ru/student/student/test* // @grant GM_getValue // @grant GM_setValue // @grant GM_addStyle // @grant GM_registerMenuCommand // @grant GM_setClipboard // @require https://openuserjs.org/src/libs/sizzle/GM_config.js // @run-at document-start // ==/UserScript== var config = new GM_config({ id: 'config', title: 'Script Settings', fields: { auto_answer: { label: "Auto answer", type: 'select', options: [ 'No', 'First', 'Random' ], default: 'No', }, display_answer: { label: "Display answer near variant", type: 'checkbox', default: true, }, register_keyboard_keys: { label: "Continue by pressing Enter", type: 'checkbox', default: true, }, copy_answers: { label: "Copy answers to the clipboard", type: 'checkbox', default: false, }, append_question_number: { label: "Show question numbers in the final report", type: 'checkbox', default: true, }, accumulator_enable: { label: "Accumulate test results in one field", type: 'checkbox', default: false, }, accumulator_prefix: { label: "Accumulated results prefix (test number)", type: 'text', default: "", }, auto_continue: { label: "Auto continue (DANGEROUS!!! Will be disabled after an hour. Press `d` to disable)", type: 'checkbox', default: false, }, auto_continue_time: { type: 'hidden', default: 0, }, auto_restart: { label: "Auto restart (DANGEROUS!!! Will be disabled after an hour. Press `d` to disable. Make sure you have infinite attempts)", type: 'checkbox', default: false, }, auto_restart_time: { type: 'hidden', default: 0, }, }, events: { init: function() { if (this.get('auto_continue') && (this.get('auto_answer') == "No")) { this.set('auto_continue', false); } if (this.get('accumulator_enable') == false) { GM_setValue('accumulated_answers', ""); } }, save: function(forgotten) { this.set('auto_continue_time', Date.now()); this.set('auto_restart_time', Date.now()); if (this.isOpen && this.get('auto_continue') && (this.get('auto_answer') == "No")) { this.set('auto_continue', false); alert("Can't automatically continue without answer."); } }, }, }); var answers = []; var variant, hash; var testID = (() => { var url = document.URL; url = url.slice(url.indexOf("idKM=") + 5); url = url.slice(0, url.indexOf("&")); return url; })(); GM_registerMenuCommand('Script Settings', () => { config.open(); }); window.addEventListener('load', actionFunction); window.onkeydown = (e) => { if ((e.key == "Enter") && config.get('register_keyboard_keys')) { press_continue_btn(); } if (e.key == "d") { config.set('auto_continue', false); config.set('auto_restart', false); config.save(); } }; // https://stackoverflow.com/a/15710692 function hashCode(s) { return s.split("").reduce(function(a, b) { a = ((a << 5) - a) + b.charCodeAt(0); return a & a; }, 0); } function update_variant() { var i, pbox; var chosen_answer = ""; for (i = 0; i < answers.length; i++) { chosen_answer += answers[i].checked ? answers[i].value : ""; } chosen_answer = chosen_answer.split('').sort().join(''); var pboxes = document.getElementsByTagName('p'); const display_answer = config.get('display_answer'); for (i = 0; i < pboxes.length; i++) { pbox = pboxes[i]; if (pbox.textContent.includes("Вопрос:")) { pbox.innerHTML = "<i>(Вариант <input onfocus='this.select();' id='variant' value='" + hash + (display_answer == true ? (" " + chosen_answer) : "") + "' readonly>)</i><br>Вопрос:"; break; } } var question_num = undefined; for (i = 0; i < pboxes.length; i++) { pbox = pboxes[i]; if (pbox.textContent.includes("Текущий вопрос: ")) { question_num = pbox.textContent.slice(variant.indexOf("Текущий вопрос: ") + 16); break; } } var tests = GM_getValue('tests', new Object()); if (tests[testID] === undefined) { tests[testID] = new Object(); } tests[testID][hash] = [question_num, chosen_answer]; GM_setValue('tests', tests); } function test_form_handler() { var i; var objects = new Object(); var boxes = document.getElementsByTagName('input'); var form = document.getElementById('testform-answer'); for (i = 0; i < boxes.length; i++) { if (boxes[i].type === 'checkbox' | boxes[i].type === 'radio') { var span = document.createElement('span'); span.innerHTML = boxes[i].type === 'radio' && boxes[i].value == "1" ? "<b>" + boxes[i].value + ")</b> " : boxes[i].value + ") "; boxes[i].parentNode.insertBefore(span, boxes[i]); objects[boxes[i].value] = boxes[i]; } } const sorted_objects = Object.keys(objects).sort().reduce( (obj, key) => { obj[key] = objects[key]; return obj; }, {} ); for (var key in sorted_objects) { sorted_objects[key].parentNode.remove(); form.appendChild(sorted_objects[key].parentNode); answers.push(sorted_objects[key]); } const auto_answer = config.get('auto_answer'); var answer; if (auto_answer == 'Random') { if (answers[0].type === 'radio') { var chosen_answer = Math.floor(Math.random() * answers.length); answers[chosen_answer].click(); } else { var pick = Math.floor(Math.random() * (Math.pow(2, answers.length) - 1)) + 1; for (i = 0; i < answers.length; i++) { if(pick & Math.pow(2, i)) { answers[i].click(); } } } } else if (auto_answer == 'First') { answers[0].click(); } variant = document.getElementById('w0').parentNode.textContent; variant = variant.slice(variant.indexOf("Вопрос:")); hash = hashCode(variant); update_variant(); form.addEventListener('click', update_variant); } function result_page_handler() { var i; var correct = variant.slice(variant.indexOf("Число верных ответов: ") + 22); correct = correct.slice(0, correct.indexOf("\n")); var test = GM_getValue('tests', new Object())[testID]; if (test === undefined) { return; } var printer = ""; var sorted_test = []; for (var hash in test) { sorted_test.push([hash].concat(test[hash])); } sorted_test.sort((a, b) => {return a[1] - b[1]}); console.log(sorted_test); for (i = 0; i < sorted_test.length; i++) { printer += (config.get('append_question_number') ? (sorted_test[i][1] + ") ") : "") + sorted_test[i][0] + " " + sorted_test[i][2] + "\n"; } printer += correct; if (config.get('copy_answers')) { GM_setClipboard(printer); } if (config.get('accumulator_enable')) { var acc = GM_getValue('accumulated_answers', ""); if (acc != "") { acc += "\n\n"; } var prefix = config.get('accumulator_prefix'); if (prefix != "") { acc += prefix + "\n"; } acc += printer; GM_setValue('accumulated_answers', acc); printer = acc; } printer = "<textarea readonly style='resize:none; width:fit-content; height:fit-content' rows='" + String(Object.keys(test).length + 1) + "' cols='50' onfocus='this.select();' id='answers'>" + printer + "</textarea>"; var pboxes = document.getElementsByTagName('p'); for (i = 0; i < pboxes.length; i++) { var pbox = pboxes[i]; if (pbox.textContent.includes("Попытка ")) { pbox.outerHTML += printer; break; } } var clear = GM_getValue('clear_tests', new Object()); clear[testID] = true; GM_setValue('clear_tests', clear); } function DB_cleaner() { var clear = GM_getValue('clear_tests', new Object()); var tests = GM_getValue('tests', new Object()); for (var test in clear) { delete tests[test]; } GM_setValue('tests', tests); GM_setValue('clear_tests', new Object()); } function press_continue_btn() { var i; var buttons = document.getElementsByTagName('button'); var button = undefined; for (i = 0; i < buttons.length; i++) { var btn = buttons[i]; if (btn.textContent.includes("Пройти") || btn.textContent.includes("Продолжить")) { button = btn; break; } } if (button === undefined) { return; } if (button.textContent.includes("Пройти")) { window.location.replace(button.parentNode.href); } else if (button.textContent.includes("Продолжить")) { button.click(); } } function actionFunction() { var old_time, cur_time; variant = document.getElementById('w0').parentNode.textContent; if (variant.includes("Вопрос:")) { DB_cleaner(); test_form_handler(); if (config.get('auto_continue')) { old_time = config.get('auto_continue_time'); cur_time = Date.now(); if (cur_time - old_time > 60 * 60 * 1000) { config.set('auto_continue', false); } else { press_continue_btn(); } } } else if (variant.includes("Результат прохождения теста:")) { result_page_handler(); if (config.get('auto_restart')) { old_time = config.get('auto_restart_time'); cur_time = Date.now(); if (cur_time - old_time > 60 * 60 * 1000) { config.set('auto_restart', false); } else { press_continue_btn(); } } } }