Advertisement
asgargg

qz v3

Sep 9th, 2019 (edited)
76,715
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.90 KB | None | 0 0
  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