Advertisement
ardann

Untitled

Dec 3rd, 2020
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name        quizizz hax - lldvee
  3. // @namespace   Violentmonkey Scripts
  4. // @match       *://*.quizizz.com/*
  5. // @grant       none
  6. // @version     1.7
  7. // @author      lldvee#5852 / w h e e z er
  8. // @run-at      document-start
  9. // @description final ver. bye bye world
  10. // ==/UserScript==
  11.  
  12. // cringe decryption stuff
  13.  
  14. let OffsetAdder = {
  15.     add(e, t, a, n, i) {
  16.         function _i(e) {
  17.             let res =
  18.                 !!isNumber(e) &&
  19.                 !(e >= 55296 && e <= 56319) &&
  20.                 !(e >= 56320 && e <= 57343);
  21.             return res;
  22.         }
  23.  
  24.         function fi(e, t, a, n) {
  25.             return n(e, a % 2 === 0 ? t : -t);
  26.         }
  27.  
  28.         switch (i) {
  29.             case 2:
  30.                 return _i(e) ? fi(e, t, a, n) : e;
  31.             case 1:
  32.             default:
  33.                 return fi(e, t, a, n);
  34.         }
  35.     }
  36. };
  37.  
  38. let defaults = {
  39.     stringModifier: function (e, t, a) {
  40.         return e;
  41.     },
  42.     keySumExtractor: function (e, t) {
  43.         return e.charCodeAt(0);
  44.     },
  45.     offsetAdder: function (e, t, a, n) {
  46.         return n(e, t);
  47.     },
  48.     miscDataForLogging: "",
  49.     obfsVersionExtractor: function (e) {
  50.         if (typeof e == "string" && e[e.length - 1]) {
  51.             let t = parseInt(e[e.length - 1], 10);
  52.             if (!isNaN(t)) {
  53.                 return t;
  54.             }
  55.         }
  56.         return null;
  57.     }
  58. };
  59.  
  60. let firstStage = {
  61.     offsetAdder: OffsetAdder.add,
  62.     stringModifier: function () {
  63.         var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "",
  64.             t =
  65.                 (arguments.length > 1 && arguments[1],
  66.                     arguments.length > 2 && arguments[2],
  67.                     arguments.length > 3 && arguments[3],
  68.                     e.charCodeAt(e.length - 2) - 33);
  69.         return e.slice(t, -2);
  70.     },
  71.     obfsVersionExtractor: function extractVersion(e) {
  72.         if (typeof e == "string" && e[e.length - 1]) {
  73.             let t = parseInt(e[e.length - 1], 10);
  74.             if (!isNaN(t)) {
  75.                 return t;
  76.             }
  77.         }
  78.         return null;
  79.     },
  80.     keySumExtractor: function (e, t) {
  81.         return e.charCodeAt(0) + e.charCodeAt(e.length - 1);
  82.     },
  83.     miscDataForLogging: ""
  84. };
  85.  
  86. function sliceEncrypted() {
  87.     let e =
  88.         arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
  89.     let t =
  90.         (arguments.length > 1 && arguments[1],
  91.             arguments.length > 2 && arguments[2],
  92.             e.charCodeAt(e.length - 2) - 33);
  93.     let a = e.slice(0, e.charCodeAt(e.length - 2) - 33);
  94.     return xi(a, "quizziz.com");
  95. }
  96.  
  97. function ki(e, t) {
  98.     let si = 0;
  99.     let oi = 65535;
  100.     var a = e + t;
  101.     return a > oi ? si + (a - oi) - 1 : a < si ? oi - (si - a) + 1 : a;
  102. }
  103.  
  104. function xi(encryptedData, gifunc, a) {
  105.     a = a || defaults;
  106.     let n = a.obfsVersionExtractor(encryptedData);
  107.     let i = "";
  108.     let r = typeof gifunc == "function" ? gifunc(encryptedData, a, n) : gifunc;
  109.     let o = -a.keySumExtractor(r);
  110.     let s = a.stringModifier(encryptedData, r, o, n);
  111.  
  112.     for (var c = 0; c < s.length; c++) {
  113.         let l = s.charCodeAt(c);
  114.         let d = a.offsetAdder(l, o, c, ki, n);
  115.         i += String.fromCharCode(d);
  116.     }
  117.     return i;
  118. }
  119.  
  120. function decrypt(encrypted) {
  121.     return xi(encrypted, sliceEncrypted, firstStage);
  122. }
  123.  
  124. // Helpers
  125. function getTag(value) {
  126.     if (value == null) {
  127.         return value === undefined ? "[object Undefined]" : "[object Null]";
  128.     }
  129.     return toString.call(value);
  130. }
  131.  
  132. function isObjectLike(value) {
  133.     return typeof value === "object" && value !== null;
  134. }
  135.  
  136. function isNumber(value) {
  137.     return (
  138.         typeof value === "number" ||
  139.         (isObjectLike(value) && getTag(value) == "[object Number]")
  140.     );
  141. }
  142.  
  143. // end
  144.  
  145. function AnswerParser() {
  146.     function cleanText(input) {
  147.         return input.replace(/<\/?[^>]+(>|$)/g, "");
  148.     }
  149.  
  150.     function parseMCQ(q) {
  151.         let ansIdx = decrypt(q.structure.answer)
  152.         let optAns = q.structure.options[ansIdx]
  153.         let ans = optAns.type == 'image' ? optAns.media[0].url : cleanText(optAns.text)
  154.         return {
  155.             question: cleanText(q.structure.query.text),
  156.             answers: ans
  157.         }
  158.     }
  159.  
  160.     function parseBLANK(q) {
  161.         let ans = []
  162.         for (let opt of q.structure.options) {
  163.             ans.push(opt.text)
  164.         }
  165.         return {
  166.             question: cleanText(q.structure.query.text),
  167.             answers: ans
  168.         }
  169.     }
  170.  
  171.     function parseMSQ(q) {
  172.         let ans = []
  173.         let ansIdxs = JSON.parse(decrypt(q.structure.answer))
  174.  
  175.         for (let ansIdx of ansIdxs) {
  176.             ans.push(cleanText(q.structure.options[ansIdx].text))
  177.  
  178.         }
  179.  
  180.         return {
  181.             question: cleanText(q.structure.query.text),
  182.             answers: ans
  183.         }
  184.     }
  185.  
  186.     function parseOther(q) {
  187.         return {
  188.             question: "Not supported",
  189.             answers: "Not supported"
  190.         }
  191.     }
  192.  
  193.     this.parse = function (data) {
  194.         let parsedAnswers = []
  195.         for (let key in data.questions) {
  196.             let currQuestion = data.questions[key]
  197.             if (currQuestion.type == "BLANK") {
  198.                 parsedAnswers.push(parseBLANK(currQuestion))
  199.             } else if (currQuestion.type == "MCQ") {
  200.                 parsedAnswers.push(parseMCQ(currQuestion))
  201.             } else if (currQuestion.type == "MSQ") {
  202.                 parsedAnswers.push(parseMSQ(currQuestion))
  203.             } else {
  204.                 parsedAnswers.push(parseOther(currQuestion))
  205.             }
  206.         }
  207.         return parsedAnswers
  208.     }
  209. }
  210.  
  211. function printAnswers(ansdata) {
  212.     for (data of ansdata) {
  213.         let m = false;
  214.         let f = data.answers;
  215.         if (Array.isArray(data.answers)) {
  216.             if (data.answers.length > 1) {
  217.                 m = true
  218.                 f = data.answers.map((v) => `[ ${v} ]`).join(" OR ")
  219.             }
  220.             else {
  221.                 f = data.answers[0]
  222.             }
  223.         }
  224.         console.log(
  225.             `Question: ${data.question}
  226. ${m ? "Multiple" : ""} Answers: ${f}`)
  227.     }
  228. }
  229.  
  230. function getQuizInfo() {
  231.     let ctx = JSON.parse(localStorage.getItem("previousContext"))
  232.     let roomHash = decrypt(ctx.game.roomHash.slice(9))
  233.     let type = ctx.game.gameMode
  234.     return {
  235.         roomHash,
  236.         type
  237.     }
  238. }
  239.  
  240. function printServerNotice(json) {
  241.     if (json.serverNotice) {
  242.         console.log("quizizz hax: ",  json.serverNotice.trim())
  243.     }
  244. }
  245.  
  246. async function getQuizData(quizInfo) {
  247.     const reqUrl = `https://vfgrm205b8.execute-api.us-east-1.amazonaws.com/bazinga/v3proxy?rh=${quizInfo.roomHash}&type=${quizInfo.type}`
  248.     let response = await fetch(reqUrl)
  249.     if (response.status == 200) {
  250.         return response.json()
  251.     }
  252.     let json = await response.json()
  253.     console.error(`quizizz haxx: Error retrieving answers: [${json.error}]`)
  254.     null.l0l()
  255. }
  256.  
  257. async function start() {
  258.     console.log('quizizzz haxx - retrieving answers')
  259.     let ansParser = new AnswerParser()
  260.     let quizInfo = getQuizInfo()
  261.     let quizData = await getQuizData(quizInfo)
  262.     let parsedAnswers = ansParser.parse(quizData)
  263.     console.clear()
  264.     printServerNotice(quizData)
  265.     printAnswers(parsedAnswers)
  266.     console.log("quizizz haxx v3 - by asgar & llvdee#5852");
  267. }
  268.  
  269. function _hook(f, p, r, m) {
  270.     console.log('hooking ', f)
  271.     m = m ? m : globalThis
  272.     let old = p ? m['__proto__'][f] : m[f]
  273.     if (p) {
  274.         m['__proto__'][f] = r(old)
  275.     } else {
  276.         m[f] = r(old)
  277.     }
  278. }
  279.  
  280. // function hookFetchAfter(f) {
  281. //     _hook('fetch', false, function(old) {
  282. //         return function() {
  283. //             return new Promise((resolve, reject) =>  {
  284. //                 let origCall = old.apply(this, arguments)
  285. //                 origCall
  286. //                     .then(res => f({arguments, response: res.clone()}))
  287. //                     .then(newRes => resolve(newRes))
  288. //                     .catch(err => reject(err))
  289. //             })
  290. //         }
  291. //     })
  292. // }
  293.  
  294. // _hook('setItem', true, function (old) {
  295. //     return function() {
  296. //         let orig = old.apply(this, arguments)
  297. //         let e = new CustomEvent("storageUpdated", {detail: {key: arguments[0], value: arguments[1]}})
  298. //         window.dispatchEvent(e)
  299. //         return orig
  300. //     }
  301. // }, localStorage)
  302.  
  303. _hook('pushState', false, function(old) {
  304.     return function() {
  305.         let orig = old.apply(this, arguments)
  306.         let e = new Event("updateUrl")
  307.         window.dispatchEvent(e)
  308.         return orig
  309.     }
  310. }, history)
  311.  
  312. window.addEventListener('updateUrl', function(e) {
  313.     if (window.location.href.includes('join/game')) {
  314.         start()
  315.     }
  316. });
  317.  
  318. // if you're going to rebrand the script as yours atleast improve it you fucks
  319.  
  320. console.clear()
  321. console.log("quizizz haxx v3 - by asgar & lldvee#5852");
  322.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement