Khan Academy Problem Solver

Here is a Khan Academy Solver!

当前为 2022-03-30 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Khan Academy Problem Solver
  3. // @version 3.2
  4. // @description Here is a Khan Academy Solver!
  5. // @author Logzilla6
  6. // @match https://www.khanacademy.org/*
  7. // @grant none
  8. // @namespace https://greasyfork.org/users/783447
  9. // ==/UserScript==
  10. (function () {
  11. let overlayHTML = ` <link rel="preconnect" href="https://fonts.googleapis.com">
  12. <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  13. <link href="https://fonts.googleapis.com/css2?family=Roboto&display=swap" rel="stylesheet">
  14. <div id="box">
  15. <button class="main" id="accordian">Toggle</button>
  16. <div class="main" id="box2">
  17. <p class="pdark" id="pdark"> KhanHack </p>
  18. <section><label>Answer: [<label id="ans1" value="thisisvalue">...</label>]</section>
  19. <button class="inputans" id="inputans">Copy</button><br>
  20. <section><label>Next And Last Answer: [<label id="ans2">...</label>]</section>
  21. <button class="inputans" id="inputans2">Copy</button>
  22. <section><label>&nbsp;</label></section>
  23. <section><label id="ans3text">Dropdown 1: [<label id="ans3">...</label>]</label></section>
  24. <section><label id="ans4text">Dropdown 2: [<label id="ans4">...</label>]</label></section>
  25. <section><label id="ans5text">Dropdown 3: [<label id="ans5">...</label>]</label></section>
  26. <section><label>&nbsp;</label></section>
  27. <section class="toggleclass"><label>M also toggles Menu</label></section>
  28. </div>
  29. </div>
  30. <style>
  31. #box {
  32. z-index: 9999;
  33. position: fixed;
  34. top: 0;
  35. right: 0;}
  36. #box2 {
  37. padding: 15px;
  38. margin-bottom: 5px;
  39. display: none;
  40. border-radius: 25px;};
  41. section {
  42. display: flex;
  43. justify-content: space-between;margin:5px;}
  44. .main {
  45. background-color: #072357;
  46. letter-spacing: 2px;
  47. font-weight: none;
  48. font-size: 11px;
  49. font-family: 'Roboto', sans-serif;
  50. color:white;
  51. webkit-user-select: all;}
  52. .pdark {
  53. border-bottom:2px solid white;}
  54. #accordian {
  55. width: 100%;
  56. border: 0;
  57. cursor: pointer;
  58. border-radius: 25px;}
  59. .inputans {
  60. width: 15%;
  61. border: 0;
  62. cursor: pointer;
  63. border-radius: 25px;
  64. background-color: #0b40a1;
  65. color: white;
  66. font-family: 'Roboto', sans-serif;
  67. display: none;
  68. }
  69. .inputans:hover {
  70. background-color: #0b378a;
  71. }
  72. .toggleclass {
  73. text-align: center;
  74. }
  75. </style>
  76. `
  77. function get(x) { return document.getElementById(x); }
  78. let overlay = document.createElement("div");
  79. overlay.innerHTML = overlayHTML;
  80. document.body.appendChild(overlay);
  81. let acc = get("accordian"),
  82. darkToggle = get("darkToggle"),
  83. ansbutton = get("inputans"),
  84. ansbutton2 = get("inputans2")
  85. acc.onclick = function() {
  86. let panel = get("box2");
  87. let acc = get("accordian")
  88. if (panel.style.display == "grid") panel.style.display = "none";
  89. else { panel.style.display = "grid";}
  90. }
  91. document.addEventListener('keydown', (event) => {
  92. if (event.key === 'm') {
  93. let panel = get("box2");
  94. if (panel.style.display == "grid") panel.style.display = "none";
  95. else { panel.style.display = "grid"; }
  96. }
  97. });
  98. 'use strict';
  99. window.loaded = false;
  100. class Answer {
  101. constructor(answer, type) {
  102. this.body = answer;
  103. this.type = type;
  104. }
  105. get isMultiChoice() {
  106. return this.type == "multiple_choice";
  107. }
  108. get isFreeResponse() {
  109. return this.type == "free_response";
  110. }
  111. get isExpression() {
  112. return this.type == "expression";
  113. }
  114. get isDropdown() {
  115. return this.type == "dropdown";
  116. }
  117. }
  118. const originalFetch = window.fetch;
  119. window.fetch = function () {
  120. return originalFetch.apply(this, arguments).then((res) => {
  121. if (res.url.includes("/getAssessmentItem")) {
  122. const clone = res.clone();
  123. clone.json().then(json => {
  124. let item, question;
  125. try {
  126. item = json.data.assessmentItem.item.itemData;
  127. question = JSON.parse(item).question;
  128. } catch {
  129. let errorIteration = () => { return localStorage.getItem("error_iter") || 0; }
  130. localStorage.setItem("error_iter", errorIteration() + 1);
  131. if (errorIteration() < 4) {
  132. return location.reload();
  133. } else {
  134. return alert("An error occurred");
  135. }
  136. }
  137. if (!question) return;
  138. Object.keys(question.widgets).map(widgetName => {
  139. switch (widgetName.split(" ")[0]) {
  140. case "numeric-input":
  141. return freeResponseAnswerFrom(question);
  142. case "radio":
  143. return multipleChoiceAnswerFrom(question);
  144. case "expression":
  145. return expressionAnswerFrom(question);
  146. case "dropdown":
  147. return dropdownAnswerFrom(question);
  148. }
  149. });
  150. });
  151. }
  152. return res;
  153. })
  154. }
  155. function freeResponseAnswerFrom(question) {
  156. const answer = Object.values(question.widgets).map((widget) => {
  157. if (widget.options?.answers) {
  158. return widget.options.answers.map(answer => {
  159. if (answer.status == "correct") {
  160. //alert('freeresponse')
  161. ansbutton.style.display = "none"
  162. ansbutton2.style.display = "none"
  163. var ans1 = document.getElementById('ans1').innerHTML
  164. var ans2 = document.getElementById('ans2').innerHTML
  165. document.getElementById('ans2').innerHTML = (answer.value)
  166. document.getElementById('ans1').innerHTML = (ans2)
  167. }
  168. });
  169. }
  170. }).flat().filter((val) => { return val !== undefined; });
  171. return new Answer(answer, "free_response");
  172. }
  173. function multipleChoiceAnswerFrom(question) {
  174. const answer = Object.values(question.widgets).map((widget) => {
  175. if (widget.options?.choices) {
  176. return widget.options.choices.map(choice => {
  177. if (choice.correct) {
  178. //alert('multichoice')
  179. ansbutton.style.display = "none"
  180. ansbutton2.style.display = "none"
  181. var ans1 = document.getElementById('ans1').innerHTML
  182. var ans2 = document.getElementById('ans2').innerHTML
  183. document.getElementById('ans2').innerHTML = (choice.content)
  184. document.getElementById('ans1').innerHTML = (ans2)
  185. }
  186. });
  187. }
  188. }).flat().filter((val) => { return val !== undefined; });
  189. return new Answer(answer, "multiple_choice");
  190. }
  191. function expressionAnswerFrom(question) {
  192. const answer = Object.values(question.widgets).map((widget) => {
  193. if (widget.options?.answerForms) {
  194. return widget.options.answerForms.map(answer => {
  195. if (Object.values(answer).includes("correct")) {
  196. //alert('expression')
  197. ansbutton.style.display = "grid"
  198. ansbutton2.style.display = "grid"
  199. var ans1 = document.getElementById('ans1').innerHTML
  200. var ans2 = document.getElementById('ans2').innerHTML
  201. var ans1val = document.getElementById('ans1').value
  202. document.getElementById('ans2').innerHTML = (answer.value)
  203. document.getElementById('ans1').innerHTML = (ans2)
  204. ansbutton.onclick = function() {
  205. prompt("Copy and paste this into the answer box", (document.getElementById('ans1').innerHTML))
  206. }
  207. ansbutton2.onclick = function() {
  208. prompt("Copy and paste this into the answer box", (document.getElementById('ans2').innerHTML))
  209. }
  210. }
  211. });
  212. }
  213. }).flat();
  214. return new Answer(answer, "expression");
  215. }
  216. function dropdownAnswerFrom(question) {
  217. const answer = Object.values(question.widgets).map((widget) => {
  218. if (widget.options?.choices) {
  219. return widget.options.choices.map(choice => {
  220. if (choice.correct) {
  221. //alert('dropdown')
  222. ansbutton.style.display = "none"
  223. ansbutton2.style.display = "none"
  224. var ans1 = document.getElementById('ans1').innerHTML
  225. var ans2 = document.getElementById('ans2').innerHTML
  226. var ans3 = document.getElementById('ans3').innerHTML
  227. var ans4 = document.getElementById('ans4').innerHTML
  228. var ans5 = document.getElementById('ans5').innerHTML
  229. document.getElementById('ans2').innerHTML = (choice.content)
  230. document.getElementById('ans1').innerHTML = (ans2)
  231. document.getElementById('ans5').innerHTML = (choice.content)
  232. document.getElementById('ans4').innerHTML = (ans5)
  233. document.getElementById('ans3').innerHTML = (ans4)
  234. }
  235. });
  236. }
  237. }).flat();
  238. return new Answer(answer, "dropdown");
  239. }
  240. })();