您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
ModMenu para Khan Academy inspirado no design do Khanmigo
- // ==UserScript==
- // @name KrackMigo
- // @namespace https://greasyfork.org/pt-BR/users/1346771-kinjinho
- // @version 5.0
- // @description ModMenu para Khan Academy inspirado no design do Khanmigo
- // @author KIN
- // @match https://pt.khanacademy.org/*
- // @grant none
- // @license MIT
- // ==/UserScript==
- (function () {
- 'use strict';
- const svgLogo = `<svg width="56" height="56" viewBox="0 0 56 56" fill="none" xmlns="http://www.w3.org/2000/svg"><title>Abrir Khanmigo</title><circle cx="28" cy="28" r="28" fill="#5f1e5c"></circle><path d="M17.61 12.88H38.45C41.22 12.88 43.47 15.13 43.47 17.89V40.57C43.47 42.76 40.86 43.90 39.25 42.41L37.57 40.85C37.10 40.42 36.49 40.18 35.86 40.18H15.11C13.72 40.18 12.60 39.05 12.60 37.67V17.89C12.60 15.13 14.85 12.88 17.61 12.88Z" fill="#DEAE93"></path><circle cx="21.4178" cy="27.8582" r="6.01791" fill="white"></circle><mask id="mask0" maskUnits="userSpaceOnUse" x="15" y="21" width="13" height="13" style="mask-type: alpha;"><circle cx="21.4178" cy="27.8582" r="6.01791" fill="white"></circle></mask><g mask="url(#mask0)"><circle cx="17.22" cy="23.673" r="5.46" fill="black"></circle></g><circle cx="34.578" cy="27.8579" r="6.01791" fill="white"></circle><mask id="mask1" maskUnits="userSpaceOnUse" x="28" y="21" width="13" height="13" style="mask-type: alpha;"><circle cx="34.578" cy="27.8579" r="6.01791" fill="white"></circle></mask><g mask="url(#mask1)"><circle cx="30.3802" cy="23.6728" r="5.46" fill="black"></circle></g></svg>`;
- const html = `
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap" rel="stylesheet">
- <div id="krakdemy-container">
- <div id="krakdemy-toggle">${svgLogo}</div>
- <div id="krakdemy-sidebar">
- <div id="krakdemy-header">
- <span id="krakdemy-title">KrackMigo</span><span id="krakdemy-beta">BETA</span>
- </div>
- <div id="krakdemy-body">
- <p class="info">📖 Respostas Detectadas:</p>
- <div id="ansBreak"></div>
- <button id="clearList">Limpar Lista</button>
- </div>
- </div>
- </div>
- <style>
- #krakdemy-container {
- font-family: 'Inter', sans-serif;
- }
- #krakdemy-toggle {
- position: fixed;
- bottom: 20px;
- left: 20px;
- width: 56px;
- height: 56px;
- cursor: pointer;
- z-index: 99999;
- }
- #krakdemy-sidebar {
- position: fixed;
- left: 0;
- bottom: 0;
- top: 0;
- width: 320px;
- background-color: #fff;
- box-shadow: 2px 0 12px rgba(0,0,0,0.1);
- display: none;
- flex-direction: column;
- border-right: 3px solid #5f1e5c;
- z-index: 99998;
- }
- #krakdemy-header {
- padding: 20px;
- background: #f4eef5;
- display: flex;
- justify-content: space-between;
- align-items: center;
- border-bottom: 1px solid #ddd;
- }
- #krakdemy-title {
- font-size: 20px;
- font-weight: 600;
- color: #5f1e5c;
- }
- #krakdemy-beta {
- font-size: 12px;
- background: #5f1e5c;
- color: white;
- border-radius: 4px;
- padding: 2px 6px;
- margin-left: 5px;
- }
- #krakdemy-body {
- padding: 20px;
- overflow-y: auto;
- height: calc(100% - 80px);
- }
- #clearList {
- background: #5f1e5c;
- color: white;
- padding: 10px;
- border: none;
- border-radius: 6px;
- margin-top: 15px;
- cursor: pointer;
- }
- .info {
- font-weight: bold;
- margin-bottom: 10px;
- border: 2px solid black;
- padding: 10px;
- border-radius: 8px;
- }
- </style>
- `;
- const el = document.createElement('div');
- el.innerHTML = html;
- document.body.appendChild(el);
- const sidebar = document.getElementById('krakdemy-sidebar');
- document.getElementById('krakdemy-toggle').onclick = () => {
- sidebar.style.display = sidebar.style.display === 'flex' ? 'none' : 'flex';
- };
- document.getElementById('clearList').onclick = () => {
- document.getElementById('ansBreak').innerHTML = '';
- };
- // Logic do script Krakdemy
- let curAns = 1;
- const originalFetch = window.fetch;
- window.fetch = function () {
- return originalFetch.apply(this, arguments).then(async (res) => {
- if (res.url.includes("/getAssessmentItem")) {
- const clone = res.clone();
- const json = await clone.json();
- const item = json.data.assessmentItem.item.itemData;
- const question = JSON.parse(item).question;
- Object.keys(question.widgets).map(widgetName => {
- switch (widgetName.split(" ")[0]) {
- case "numeric-input":
- return freeResponseAnswerFrom(question);
- case "radio":
- return multipleChoiceAnswerFrom(question);
- case "expression":
- return expressionAnswerFrom(question);
- case "dropdown":
- return dropdownAnswerFrom(question);
- }
- });
- }
- return res;
- });
- };
- function addAnswer(answer) {
- const el = document.createElement('p');
- el.textContent = answer;
- document.getElementById('ansBreak').appendChild(el);
- }
- function freeResponseAnswerFrom(question) {
- Object.values(question.widgets).forEach((widget) => {
- widget.options?.answers?.forEach(answer => {
- if (answer.status == "correct") addAnswer(answer.value);
- });
- });
- }
- function multipleChoiceAnswerFrom(question) {
- Object.values(question.widgets).forEach((widget) => {
- widget.options?.choices?.forEach(choice => {
- if (choice.correct) addAnswer(choice.content);
- });
- });
- }
- function expressionAnswerFrom(question) {
- Object.values(question.widgets).forEach((widget) => {
- widget.options?.answerForms?.forEach(answer => {
- if (Object.values(answer).includes("correct")) addAnswer(answer.value);
- });
- });
- }
- function dropdownAnswerFrom(question) {
- Object.values(question.widgets).forEach((widget) => {
- widget.options?.choices?.forEach(choice => {
- if (choice.correct) addAnswer(choice.content);
- });
- });
- }
- })();