Skip to content

Instantly share code, notes, and snippets.

@griffi-gh
Last active December 15, 2023 21:48
Show Gist options
  • Save griffi-gh/5e81981c154e4053322cb7b48f3f690c to your computer and use it in GitHub Desktop.
Save griffi-gh/5e81981c154e4053322cb7b48f3f690c to your computer and use it in GitHub Desktop.
// ==UserScript==
// @name Naurok Bypass v2: Extras
// @description Companion userscript for naurok bypass; Contains unstable and unfinished features and enhancements for the Testing pages.
// @author griffi-gh
// @namespace griffi-gh
// @match https://naurok.com.ua/test/testing/*
// @grant none
// @grant GM_addStyle
// @version 0.3
// @run-at document-idle
// @inject-into page
// @sandbox DOM
// @connect naurok.com.ua
// @icon https://play-lh.googleusercontent.com/scIkpmsUJTfDbV39X0rb-AvxbgxOrpa9zIGJQqDHP1VbuBTmortXomSSWVZnpErwyA=w480-h960
// ==/UserScript==
"use strict";
let session_info;
async function loadSessionInfo() {
//Get session ID
const session_id = document.querySelector(`[ng-app="testik"]`).getAttribute("ng-init").match(/[0-9]+/g)[1];
console.log("Session id: ", session_id);
//Get session info from API
session_info = await fetch(`https://naurok.com.ua/api2/test/sessions/${session_id}`, {
credentials: "include",
headers: {
'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/json'
},
redirect: 'follow',
}).then(x => x.json());
console.log("Session info: ", session_info);
}
function displayUi() {
//Add test name to the page
const testContainer = document.querySelector('.test-container')
const infoNode = document.createElement("div");
infoNode.classList.add("x-test-info");
testContainer.insertBefore(infoNode, testContainer.firstChild);
const nameNode = document.createElement("div");
nameNode.classList.add("x-test-name");
infoNode.append(nameNode);
nameNode.textContent = `${session_info.settings.name}`;
const buttonsNode = document.createElement("div");
buttonsNode.classList.add("x-button-container");
infoNode.append(buttonsNode);
let xButton
xButton = document.createElement("a");
buttonsNode.append(xButton);
xButton.classList.add("x-button");
xButton.textContent = "Результати інших учнів";
xButton.href = `https://naurok.com.ua/test/homework/${session_info.settings.id}/detailed-export/score`;
xButton = document.createElement("a");
buttonsNode.append(xButton);
xButton.classList.add("x-button");
xButton.textContent = "Наступні питання";
xButton.href = `javascript:alert("TODO")`;
}
function applyStyles() {
let styleCss = `
/* allow selection */
* {
-webkit-user-select: unset !important;
-webkit-touch-callout: unset !important;
-moz-user-select: unset !important;
-ms-user-select: unset !important;
user-select: unset !important;
}
/* style our own ui */
.test-container {
display: flex !important;
flex-direction: row !important;
}
.test-container > :last-child {
flex-grow: 1 !important;
}
.x-test-info {
background: white;
border-radius: 1rem;
max-width: 20vw;
min-width: 200px;
margin: 1rem;
padding: 1rem;
box-shadow: 0 0 .5rem rgba(0,0,0,.5);
overflow: hidden;
position: absolute;
z-index: 999;
height: 100%;
transition: transform 1s, opacity .5s;
transform: translateZ(1px);
}
.x-test-info:not(:hover) {
transform: rotate(5deg) translateX(-100%) translateX(-10px) scaleY(.95) skewX(-1deg) skewY(-1deg) translateZ(1px);
opacity: .6;
}
.dyslexia .x-test-info {
background: #fafac8;
}
.x-test-name {
margin: -1rem;
margin-bottom: 1rem;
padding: 1rem;
background: #40596b;
color: white;
}
.dyslexia .x-test-name {
background: #dadaa8;
color: black;
}
.x-button-container {
display: flex;
flex-direction: column;
gap: .5rem;
}
.x-button {
display: block;
appearance: button;
text-decoration: none;
text-align: center;
background-color: #f7cdcd;
padding: 1rem 2rem;
color: black;
border-radius: .33rem;
font-size: 1.5rem;
}
.x-button:hover {
text-decoration: inherit;
color: inherit;
}
.dyslexia .x-button {
background: #dadaa8;
}
`;
//use layer if possible on newer browsers to override important
styleCss = `
${ styleCss }
@layer { ${styleCss} }
`;
//add css to page, using GM_addStyle if possible
if (window.GM_addStyle) {
window.GM_addStyle(styleCss);
} else {
const styleElement = document.createElement("style");
styleElement.innerHTML = styleCss;
document.querySelector("head").append(styleElement);
}
}
async function main() {
applyStyles();
loadSessionInfo().then(() => {
displayUi();
});
}
main();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment