- // ==UserScript==
- // @name iChineseReader Cheat
- // @namespace s_ambigious
- // @version 1
- // @license MIT
- // @description Anti too fast and quiz answers for iChineseReader.com
- // @author @ambigious
- // @match *://*.ichinesereader.com/*
- // @icon https://www.google.com/s2/favicons?sz=64&domain=ichinesereader.com
- // @grant GM_registerMenuCommand
- // @grant unsafeWindow
- // @require https://cdn.jsdelivr.net/npm/@violentmonkey/shortcut@1
- // ==/UserScript==
-
- function create(tag, attrs, attach, ...children) {
- const element = document.createElement(tag);
-
- if (attrs.events) {
- for (let [event, callback] of Object.entries(attrs.events)) {
- element.addEventListener(event, callback);
- }
- }
-
- if (attrs.styles) {
- for (let [style, value] of Object.entries(attrs.styles)) {
- element.style[style] = value;
- }
- }
-
- for (let [attr, value] of Object.entries(
- (({ events, styles, ...o }) => o)(attrs),
- )) {
- element.setAttribute(attr, value);
- }
-
- if (children) {
- for (let child of children) {
- if (child instanceof HTMLElement) element.appendChild(child);
- else element.appendChild(document.createTextNode(child.toString()));
- }
- }
-
- if (attach) attach.appendChild(element);
- else return element;
- }
-
- window.addEventListener(
- "load",
- () => {
- const { register } = VM.shortcut;
-
- async function answers() {
- const quiz = await (await fetch(
- performance
- .getEntries()
- .filter(e => e instanceof PerformanceResourceTiming)
- .map(e => e.name)
- .filter(e =>
- e.includes("api.ichinesereader.com/superadmin/quiz"),
- )
- .at(-1),
- {
- headers: {
- authtoken: Object.fromEntries(
- document.cookie
- .split(";")
- .map(e => e.split("=").map(e => e.trim())),
- ).nanhaiIndividualSession.concat("="),
- },
- },
- )).json();
-
- const data = await (await fetch(quiz.book.quizLinkUrl)).json();
-
- create("div", {}, window.open().document.body,
- create("style", {}, null,
- await (
- await fetch(
- "https://cdn.jsdelivr.net/npm/water.css@2/out/water.css",
- )
- ).text(),
- ),
- create("h1", {}, null, `Quiz Answers for ${data.simp_name}`),
- create("table", {}, null,
- create("thead", {}, null,
- create("tr", {}, null,
- create("th", {}, null, "Question"),
- create("th", {}, null, "Answer"),
- ),
- ),
- create("tbody", {}, null,
- ...data.questions
- .map(e => e.answers.find(e => e.isCorrect))
- .map((e, i) =>
- create("tr", {}, null,
- create("td", {}, null, i + 1),
- create("td", {}, null, e.simp_answer),
- ),
- ),
- ),
- ),
- );
-
- /*console.log(
- data.questions.map(e =>
- e.answers
- .filter(e => e.isCorrect)
- .map((e, i) =>
- create(
- "tr",
- {},
- null,
- create("td", {}, null, i + 1),
- create("td", {}, null, e.simp_answer),
- ),
- ),
- ),
- );*/
- }
-
- function anti() {
- const bookFrame = document
- .querySelector("iframe").contentDocument
- .querySelector("iframe").contentWindow;
-
- bookFrame.userRole = "TEACHER";
- }
-
- GM_registerMenuCommand("Anti too fast", anti);
- register("ctrl-alt-s", anti);
-
- GM_registerMenuCommand("Get answers (Opens in new tab)", answers);
- register("ctrl-alt-a", answers);
- },
- false,
- );