Kahoot Cheat (Beta) (Working Dec 2024)

Skibidi Toilet approved, made by floidAI

目前为 2024-12-06 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Kahoot Cheat (Beta) (Working Dec 2024)
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.01
  5. // @description Skibidi Toilet approved, made by floidAI
  6. // @author You
  7. // @match https://kahoot.it/*
  8. // @grant GM.xmlHttpRequest
  9. // @run-at document-idle
  10. // @license Unlicense
  11. // ==/UserScript==
  12.  
  13. (function () {
  14. 'use strict';
  15.  
  16. const selectors = [
  17. 'answer-0',
  18. 'answer-1',
  19. 'answer-2',
  20. 'answer-3'
  21. ];
  22. const questionSelector = '.question-title__Title-sc-12qj0yr-1';
  23. const questionCounterSelector = '.visually-hidden__SROnly-sc-18gl3eq-0';
  24. const currentQuestionSelector = 'question-index-counter';
  25.  
  26. let quizData = null;
  27.  
  28. let currentUrl = location.href;
  29.  
  30. const observeUrlChange = () => {
  31. setInterval(() => {
  32. if (location.href !== currentUrl) {
  33. currentUrl = location.href;
  34. if (currentUrl === 'https://kahoot.it/gameblock') {
  35. extractAndSendData();
  36. }
  37. }
  38. }, 500);
  39. };
  40.  
  41. const getTotalQuestions = () => {
  42. const counterElement = document.getElementsByClassName("visually-hidden__SROnly-sc-18gl3eq-0")[1];
  43. if (counterElement) {
  44. const text = counterElement.innerText;
  45. const match = text.match(/of (\d+)/);
  46. if (match && match[1]) {
  47. return parseInt(match[1], 10);
  48. }
  49. }
  50. return null;
  51. };
  52.  
  53. const extractAndSendData = () => {
  54. const questionElement = document.querySelector(questionSelector);
  55. const answerElements = selectors
  56. .map(selector => document.querySelector(`[data-functional-selector="${selector}"]`))
  57. .filter(el => el);
  58.  
  59. const totalQuestions = getTotalQuestions();
  60. if (!totalQuestions) {
  61. return;
  62. }
  63.  
  64. if (questionElement && answerElements.length > 0) {
  65. const question = questionElement.innerText;
  66. const answers = answerElements.map(el => el.innerText);
  67. const curQuestion = document.querySelector(`[data-functional-selector="${currentQuestionSelector}"]`).innerText;
  68.  
  69. if (quizData) {
  70. processQuestionData(question, answers, totalQuestions);
  71. } else {
  72. const query = question;
  73. const apiUrl = `https://create.kahoot.it/rest/kahoots/?query=${encodeURIComponent(query)}&limit=20&orderBy=relevance&cursor=0&searchCluster=1&includeExtendedCounters=false&inventoryItemId=ANY`;
  74.  
  75. GM.xmlHttpRequest({
  76. method: 'GET',
  77. url: apiUrl,
  78. onload: function (response) {
  79. const jsonResponse = JSON.parse(response.responseText);
  80. const filteredResults = jsonResponse.entities.filter(quiz => quiz.card.number_of_questions === totalQuestions);
  81. if (filteredResults.length > 0) {
  82. const quizId = filteredResults[0].card.uuid;
  83.  
  84. const quizDetailsUrl = `https://create.kahoot.it/rest/kahoots/${quizId}/card/?includeKahoot=true`;
  85.  
  86. GM.xmlHttpRequest({
  87. method: 'GET',
  88. url: quizDetailsUrl,
  89. onload: function (response) {
  90. quizData = JSON.parse(response.responseText);
  91.  
  92. processQuestionData(question, answers, totalQuestions);
  93. },
  94. onerror: function (error) {
  95. console.error('Error fetching quiz details:', error);
  96. }
  97. });
  98. } else {
  99. console.error(`No quizzes found with ${totalQuestions} questions.`);
  100. }
  101. },
  102. onerror: function (error) {
  103. console.error('Error making API request:', error);
  104. }
  105. });
  106. }
  107. } else {
  108. console.error('Required elements not found or no answers available.');
  109. }
  110. };
  111.  
  112. const processQuestionData = (question, answers, totalQuestions) => {
  113. const questionData = quizData.kahoot.questions.find(questionInData => questionInData.question == question);
  114. const correctChoice = questionData.choices.find(choice => choice.correct);
  115.  
  116. if (correctChoice) {
  117. const correctAnswerText = correctChoice.answer;
  118.  
  119. answers.forEach((answerText, index) => {
  120. if (answerText.trim() === correctAnswerText.trim()) {
  121. const answerElement = document.querySelector(`[data-functional-selector="answer-${index}"]`);
  122. if (answerElement) {
  123. answerElement.innerText = answerText.trim() + '.';
  124. }
  125. }
  126. });
  127. }
  128. };
  129.  
  130. observeUrlChange();
  131. })();