您需要先安装一个扩展,例如 篡改猴、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();
- }
- }
- }
- }