Blooket Winner

Automaticly Get every answer in Blooket correct with Anti-Detection from teachers!

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

You will need to install an extension such as Tampermonkey to install this script.

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==UserScript==
// @name         Blooket Winner
// @namespace    http://tampermonkey.net/
// @namespace    https://violentmonkey.github.io
// @namespace    https://www.greasespot.net
// @version     38.0
// @description  Automaticly Get every answer in Blooket correct with Anti-Detection from teachers!
// @author       Thundercatcher
// @license      All Rights Reserved
// @match        https://*.blooket.com/*
// @match        https://play.blooket.com/play*
// @match        https://goldquest.blooket.com/*
// @match        https://monsterbrawl.blooket.com/*
// @match        https://cryptohack.blooket.com/*
// @match        https://fishingfrenzy.blooket.com/*
// @match        https://deceptivedinos.blooket.com/*
// @match        https://blookrush.blooket.com/*
// @match        https://battleroyale.blooket.com/*
// @match        https://towerdefense.blooket.com/*
// @match        https://cafe.blooket.com/*
// @match        https://factory.blooket.com/*
// @match        https://racing.blooket.com/*
// @match        https://crazykingdom.blooket.com/*
// @match        https://towerofdoom.blooket.com/*
// @match        https://classic.blooket.com/*
// @match        https://towerdefense2.blooket.com/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// @license      All Rights Reserved
// ==/UserScript==
 
(function() {
    /**
     * Ultra / Fast / Human / Full Human / Doofus / Slow Poke / OFF Auto-Answer with HUD
     */
    
    let hackHidden = false;
    let lastTime = performance.now();
    let loopMS = 0;
 
    const modes = ["ULTRA", "FAST", "HUMAN", "FULL HUMAN", "DOOFUS", "SLOW POKE", "OFF"];
    const humanMS = 250;
    const fullHumanMS = 3000;
    const doofusMS = 5000;
    const slowPokeMS = 10000;
    let currentModeIndex = 0; // start with ULTRA
 
    // HUD toggle detection (Shift + Control within 1s)
    let shiftPressedTime = null;
    let ctrlPressedTime = null;
    let hudHidden = false;
 
    (() => {
 
        const toggleMode = () => {
            currentModeIndex = (currentModeIndex + 1) % modes.length;
            updateSwitchButton();
        };
 
        const toggleHackVisibility = () => {
            hackHidden = !hackHidden;
            const elements = document.querySelectorAll('[class*="answerContainer"], [class*="feedback"], [class*="typingAnswerWrapper"]');
            elements.forEach(el => el.style.display = hackHidden ? 'none' : 'block');
            console.log(`Hack is ${hackHidden ? 'hidden' : 'visible'}`);
        };
 
        const hideButtons = () => {
            buttonToggleHack.style.display = 'none';
            buttonToggleVisibility.style.display = 'none';
        };
 
        const toggleHUDVisibility = () => {
            hudHidden = !hudHidden;
            hudContainer.style.display = hudHidden ? "none" : "flex";
        };
 
        const updateSwitchButton = () => {
            const mode = modes[currentModeIndex];
            switchButton.textContent = mode;
            switch (mode) {
                case "OFF":
                    switchButton.style.backgroundColor = "#888"; // gray
                    activeIndicator.style.opacity = 0.3;
                    break;
                case "ULTRA":
                    switchButton.style.backgroundColor = "#00FFFF"; // cyan
                    activeIndicator.style.opacity = 1;
                    break;
                case "FAST":
                    switchButton.style.backgroundColor = "#4CAF50";
                    activeIndicator.style.opacity = 1;
                    break;
                case "HUMAN":
                    switchButton.style.backgroundColor = "#FFA500";
                    activeIndicator.style.opacity = 1;
                    break;
                case "FULL HUMAN":
                    switchButton.style.backgroundColor = "#FF4500";
                    activeIndicator.style.opacity = 1;
                    break;
                case "DOOFUS":
                    switchButton.style.backgroundColor = "#8A2BE2"; // purple
                    activeIndicator.style.opacity = 1;
                    break;
                case "SLOW POKE":
                    switchButton.style.backgroundColor = "#0000FF"; // blue
                    activeIndicator.style.opacity = 1;
                    break;
            }
        };
 
        const autoAnswer = async () => {
            const mode = modes[currentModeIndex];
            if (mode === "OFF") return;
 
            const { stateNode: { state: { question, stage, feedback }, props: { client: { question: pquestion } } } } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
 
            try {
                if (question.qType !== "typing") {
                    if (stage !== "feedback" && !feedback) {
                        [...document.querySelectorAll(`[class*="answerContainer"]`)][(question || pquestion).answers.map((x, i) => (question || pquestion).correctAnswers.includes(x) ? i : null).filter(x => x != null)[0]]?.click?.();
                    } else {
                        document.querySelector('[class*="feedback"]')?.firstChild?.click?.();
                    }
                } else {
                    Object.values(document.querySelector("[class*='typingAnswerWrapper']"))[1].children._owner.stateNode.sendAnswer(question.answers[0]);
                }
 
                const nextQuestion = document.querySelector('[class*="questionContainer"]');
                if (nextQuestion) nextQuestion.click();
 
            } catch { }
        };
 
        const buttonToggleHack = document.createElement('button');
        buttonToggleHack.textContent = 'Toggle Hack (`)';
        buttonToggleHack.style.position = 'fixed';
        buttonToggleHack.style.top = '10px';
        buttonToggleHack.style.left = '10px';
        buttonToggleHack.style.padding = '10px 20px';
        buttonToggleHack.style.fontSize = '16px';
        buttonToggleHack.style.backgroundColor = '#4CAF50';
        buttonToggleHack.style.color = 'white';
        buttonToggleHack.style.border = 'none';
        buttonToggleHack.style.borderRadius = '4px';
        buttonToggleHack.style.cursor = 'pointer';
        buttonToggleHack.addEventListener('click', toggleMode);
        buttonToggleHack.style.display = 'none';
        document.body.appendChild(buttonToggleHack);
 
        const buttonToggleVisibility = document.createElement('button');
        buttonToggleVisibility.textContent = 'Toggle Visibility (press \\)';
        buttonToggleVisibility.style.position = 'fixed';
        buttonToggleVisibility.style.top = '70px';
        buttonToggleVisibility.style.left = '10px';
        buttonToggleVisibility.style.padding = '10px 20px';
        buttonToggleVisibility.style.fontSize = '16px';
        buttonToggleVisibility.style.backgroundColor = '#4CAF50';
        buttonToggleVisibility.style.color = 'white';
        buttonToggleVisibility.style.border = 'none';
        buttonToggleVisibility.style.borderRadius = '4px';
        buttonToggleVisibility.style.cursor = 'pointer';
        buttonToggleVisibility.style.display = 'none';
        buttonToggleVisibility.addEventListener('click', toggleHackVisibility);
        document.body.appendChild(buttonToggleVisibility);
 
        // KEY LISTENER
        document.addEventListener('keydown', event => {
 
            const now = Date.now();
 
            if (event.key === "Shift") {
                shiftPressedTime = now;
            }
 
            if (event.key === "Control") {
                ctrlPressedTime = now;
            }
 
            // If both pressed within 1 second
            if (
                shiftPressedTime &&
                ctrlPressedTime &&
                Math.abs(shiftPressedTime - ctrlPressedTime) <= 1000
            ) {
                toggleHUDVisibility();
                shiftPressedTime = null;
                ctrlPressedTime = null;
            }
 
            if (event.key === '`') {
                toggleMode();
                buttonToggleHack.style.display = 'block';
            } 
            else if (event.key === '\'') {
                toggleHackVisibility();
            } 
            else if (event.keyCode === 220) {
                hideButtons();
            }
 
        });
 
        const hudContainer = document.createElement('div');
        hudContainer.style.position = 'fixed';
        hudContainer.style.bottom = '5px';
        hudContainer.style.right = '10px';
        hudContainer.style.display = 'flex';
        hudContainer.style.flexDirection = 'column';
        hudContainer.style.alignItems = 'center';
        hudContainer.style.fontFamily = 'monospace';
        hudContainer.style.zIndex = 9999;
        document.body.appendChild(hudContainer);
 
        const switchButton = document.createElement('button');
        switchButton.style.width = '60px';
        switchButton.style.height = '20px';
        switchButton.style.fontSize = '12px';
        switchButton.style.marginBottom = '2px';
        switchButton.style.border = 'none';
        switchButton.style.borderRadius = '4px';
        switchButton.style.cursor = 'pointer';
        switchButton.addEventListener('click', toggleMode);
        hudContainer.appendChild(switchButton);
 
        const activeIndicator = document.createElement('div');
        activeIndicator.textContent = 'Active';
        activeIndicator.style.width = '50px';
        activeIndicator.style.textAlign = 'center';
        activeIndicator.style.fontSize = '12px';
        activeIndicator.style.padding = '2px 0';
        activeIndicator.style.borderRadius = '4px';
        activeIndicator.style.backgroundColor = 'rgba(0,200,0,0.8)';
        activeIndicator.style.color = 'white';
        activeIndicator.style.marginBottom = '2px';
        hudContainer.appendChild(activeIndicator);
 
        const msCounter = document.createElement('div');
        msCounter.textContent = '0 ms';
        msCounter.style.fontSize = '12px';
        msCounter.style.color = 'white';
        msCounter.style.backgroundColor = 'rgba(0,0,0,0.5)';
        msCounter.style.padding = '2px 4px';
        msCounter.style.borderRadius = '4px';
        hudContainer.appendChild(msCounter);
 
        updateSwitchButton();
 
        let flashToggle = false;
        let humanTimer = null;
 
        const loop = () => {
            const now = performance.now();
            loopMS = now - lastTime;
            lastTime = now;
 
            const mode = modes[currentModeIndex];
 
            if (mode === "OFF") {
                // do nothing
            } else if (mode === "ULTRA") {
                autoAnswer(); // as fast as possible
            } else if (mode === "FAST") {
                autoAnswer();
            } else if (mode === "HUMAN") {
                if (!humanTimer) humanTimer = setTimeout(async () => { await autoAnswer(); humanTimer = null; }, humanMS);
            } else if (mode === "FULL HUMAN") {
                if (!humanTimer) humanTimer = setTimeout(async () => { await autoAnswer(); humanTimer = null; }, fullHumanMS);
            } else if (mode === "DOOFUS") {
                if (!humanTimer) humanTimer = setTimeout(async () => { await autoAnswer(); humanTimer = null; }, doofusMS);
            } else if (mode === "SLOW POKE") {
                if (!humanTimer) humanTimer = setTimeout(async () => { await autoAnswer(); humanTimer = null; }, slowPokeMS);
            }
 
            flashToggle = !flashToggle;
            activeIndicator.style.backgroundColor =
                (mode === "OFF")
                    ? 'rgba(100,100,100,0.3)'
                    : (flashToggle ? 'rgba(0,200,0,0.8)' : 'rgba(0,255,0,0.5)');
 
            if (mode === "OFF") msCounter.textContent = "0 ms";
            else if (mode === "ULTRA") msCounter.textContent = "0 ms";
            else if (mode === "FAST") msCounter.textContent = `${loopMS.toFixed(2)} ms`;
            else if (mode === "HUMAN") msCounter.textContent = `${humanMS} ms`;
            else if (mode === "FULL HUMAN") msCounter.textContent = `${fullHumanMS} ms`;
            else if (mode === "DOOFUS") msCounter.textContent = `${doofusMS} ms`;
            else if (mode === "SLOW POKE") msCounter.textContent = `${slowPokeMS} ms`;
 
            requestAnimationFrame(loop);
        };
 
        loop();
 
    })();
})();