Frozen Bot V1

Frozen bot script for gartic

// ==UserScript==
// @name         Frozen Bot V1
// @namespace    tampermonkey.net 
// @version      1.0
// @description  Frozen bot script for gartic
// @match        *://*/*?__cpo=aHR0cHM6Ly9nYXJ0aWMuaW8
// @match        *://gartic.io/?bot*
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_addValueChangeListener
// @grant        GM_addStyle
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    const config = {
        Rooms: [],
        userAgents: ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36"],
        proxies: ["https://www.blockaway.net/"],
        playerName: "",
        roomCode: "",
        delayBetweenEntries: 1000,
        reexecutionDelay: 1900,
        randomAvatar: false,
        selectedAvatar: 0,
        settings: {
            nickName: "",
            roomCode: "",
            avatarId: 0
        }
    };

    let wsList = [];
    let isRunning = false;
    let messageInterval;
    let mainInterval;
    let afkIntervals = [];
    let isAfkPaused = false;
    let roomusers = [];
    let kickedUsers = new Set();
    let userListUpdateInterval;

    const drawCommands = [
        '[6,"11"]',
        '[5,"x000000"]',
        '[3,0,0,767,448]',
        '[5,"x26C9FF"]',
        '[2,245,64,249,67,257,75,260,81,262,89,264,96,263,105,260,114,255,121,249,127,242,132,242,132]',
        '[2,231,69,237,67,247,67,259,66,270,67,274,67]',
        '[2,311,89,311,90,309,98,308,107,307,112,306,120]',
        '[2,312,71,320,68,328,67,332,67]',
        '[2,337,119,337,119,341,114,348,106,353,99,361,88,368,80,372,74,373,73,374,72,374,73,372,77,371,85,369,97,368,107,369,115]',
        '[2,369,115,371,120,374,120,380,116,387,109,396,101,408,87,422,75,443,55,452,49]',
        '[2,217,192,217,192,218,194,221,200,224,205,226,211,227,217,229,224,230,229,231,234,231,237,232,240,232,242,233,244,233,244,233,244]',
        '[2,233,244,235,241,241,233,248,222,257,210,267,197,275,187,279,182,280,180,280,181,280,181]',
        '[2,282,190,282,190,282,192,284,198,285,206,285,214,287,221,287,228,288,236,288,242,289,246,290,249,290,250,291,250,293,248,296,241]',
        '[2,355,203,355,203,349,211,344,220,344,229,344,236,347,241,352,242,360,240,369,236,378,230,385,223,390,215,391,210,392,204,389,198]',
        '[2,296,241,304,230,312,217,321,205,328,195,332,188,334,185,337,182]',
        '[2,418,196,418,196,417,198,414,208,413,218,414,228,421,234,429,237,440,236,450,231,458,224,465,216,468,207,470,198,465,194,458,192]',
        '[2,458,192,449,192,441,194,438,196,438,196]',
        '[2,389,198,384,194,378,192,373,191,367,194,360,198]'
    ];

    window.toggleBot = toggleBot;
    window.sendMessage = sendMessage;
    window.exitFromRooms = exitFromRooms;
    window.autoDraw = autoDraw;
    window.toggleRandomAvatar = toggleRandomAvatar;
    window.updateAvatarPreview = updateAvatarPreview;
    window.applySettings = applySettings;
    window.sendReport = sendReport;


    function loadSettings() {
        const savedSettings = localStorage.getItem('frozenBotSettings');
        if(savedSettings) {
            config.settings = JSON.parse(savedSettings);
            document.querySelector('.bot-nick').value = config.settings.nickName;
            document.querySelector('.room-input').value = config.settings.roomCode;
            document.querySelector('.avatar-input').value = config.settings.avatarId;
            updateAvatarPreview(config.settings.avatarId);
            updateRoomCode();
        }
    }

    function updateUserList() {
        const userListElement = document.querySelector('.user-list');
        const botNick = document.querySelector('.bot-nick').value.trim();
        userListElement.innerHTML = '';
        const addedUsers = new Set();

        wsList.forEach(ws => {
            if (ws.readyState === WebSocket.OPEN) {
                ws.send('42[32]');
            }
        });

        roomusers.forEach(user => {
            if (user.nick && 
                user.nick !== "Jinwoo" && 
                !addedUsers.has(user.id) && 
                !user.nick.replace(/\s+/g, '').includes(botNick.replace(/\s+/g, ''))) {
                const button = document.createElement('button');
                button.className = 'user-button';
                button.textContent = user.nick;
                button.onclick = () => kickUser(user.id, user.nick);
                userListElement.appendChild(button);
                addedUsers.add(user.id);
            }
        });
    }

    function kickUser(userId, userNick) {
        if (!kickedUsers.has(userId)) {
            wsList.forEach(ws => {
                if (ws.readyState === WebSocket.OPEN) {
                    ws.send(`42[11,${ws.id},"siktirgit ${userNick}"]`);
                    setTimeout(() => {
                        ws.send(`42[45,${ws.id},["${userId}",true]]`);
                        ws.send(`42[45,${ws.id},["${userId}",false]]`);
                    }, 100);
                }
            });
            kickedUsers.add(userId);
            updateUserList();
        }
    }

    function applySettings() {
        config.settings.nickName = document.querySelector('.bot-nick').value;
        config.settings.roomCode = document.querySelector('.room-input').value;
        config.settings.avatarId = parseInt(document.querySelector('.avatar-input').value) || 0;
        localStorage.setItem('frozenBotSettings', JSON.stringify(config.settings));
        updateRoomCode();
    }

    function generateInvisibleChar() {
        const invisibleChars = ['\u200B', '\u200C', '\u200D', '\u2061', '\u2062', '\u2063', '\u2064', '\u2066', '\u17b4', '\u17b5', '\u2068', '\u2069'];
        return invisibleChars[Math.floor(Math.random() * invisibleChars.length)];
    }

    function addInvisibleCharsToMessage(message) {
        let result = '';
        for (let i = 0; i < message.length; i++) {
            result += message[i] + generateInvisibleChar();
        }
        return result;
    }

    function getRandomName() {
        let name = document.querySelector('.bot-nick').value.trim();
        let result = '';
        for (let i = 0; i < name.length; i++) {
            result += name[i] + generateInvisibleChar();
        }
        result += generateInvisibleChar();
        return result.trim();
    }

    function setRandomPlayerName() {
        config.playerName = getRandomName();
    }

    function updateRoomCode() {
        const roomInput = document.querySelector('.room-input');
        const roomCode = roomInput.value.trim();
        if(roomCode) {
            config.Rooms = [roomCode];
            config.settings.roomCode = roomCode;
        }
    }

    function autoDraw() {
        isAfkPaused = true;
        setTimeout(() => { isAfkPaused = false; }, 7000);
        
        wsList.forEach(ws => {
            if(ws.readyState === WebSocket.OPEN) {
                ws.send(`42[34,${ws.id}]`);
                let index = 0;
                const drawInterval = setInterval(() => {
                    if(index < drawCommands.length) {
                        ws.send(`42[10,${ws.id},${drawCommands[index]}]`);
                        index++;
                    } else {
                        clearInterval(drawInterval);
                    }
                }, 50);
            }
        });
    }

    function exitFromRooms() {
        wsList.forEach(ws => {
            if (ws.readyState === WebSocket.OPEN) {
                ws.send(`42[11,${ws.id},"bb"]`);
                setTimeout(() => {
                    ws.send(`42[24,${ws.id}]`);
                }, 100);
            }
        });
        wsList = [];
        roomusers = [];
        updateUserList();
        kickedUsers.clear();
        document.querySelector('.bot-counter').textContent = 'Bots: 0';
    }

    function sendReport() {
        wsList.forEach(ws => {
            if (ws.readyState === WebSocket.OPEN) {
                ws.send(`42[35,${ws.id}]`);
            }
        });
    }

    async function enterRoom(roomCode) {
        setRandomPlayerName();
        try {
            const logoutResponse = await fetch("/logout");
            if (!logoutResponse.ok) throw new Error('Logout failed');

            const roomResponse = await fetch("https://gartic.io/server?check=1&v3=1&room=" + roomCode);
            if (!roomResponse.ok) throw new Error('Room check failed');

            const roomText = await roomResponse.text();
            const server = roomText.split("//")[1].split(".")[0];
            const ccode = roomText.split("c=")[1];

            const ws = new WebSocket('wss://' + server + '.gartic.io/socket.io/?c=' + ccode + '&EIO=3&transport=websocket');
            wsList.push(ws);

            ws.onopen = () => {
                let botData = {
                    v: 20000,
                    nick: getRandomName(),
                    avatar: config.randomAvatar ? Math.floor(Math.random() * 36) : config.selectedAvatar,
                    platform: 0,
                    sala: roomCode.slice(-4)
                };
                ws.send(`42[3,${JSON.stringify(botData)}]`);
            };

            ws.onmessage = (msg) => {
                if (msg.data.indexOf('42["5"') !== -1) {
                    let objlist = JSON.parse('["5"' + msg.data.split('42["5"')[1]);
                    ws.id = objlist[2];
                    roomusers = objlist[5];
                    updateUserList();
                    updateBotCounter();
                    startAntiAfk(ws.id);
                    setTimeout(() => {
                        ws.send(`42[11,${ws.id},"sa"]`);
                    }, 10);
                }
                if (msg.data.indexOf('42["23"') !== -1) {
                    let user = JSON.parse("{" + msg.data.split("{")[1].split("}")[0] + "}");
                    if (!roomusers.some(existingUser => existingUser.id === user.id)) {
                        roomusers.push(user);
                        updateUserList();
                    }
                }
                if (msg.data.indexOf('42["24"') !== -1) {
                    let userId = msg.data.split(",")[1].split('"')[1];
                    roomusers = roomusers.filter(u => u.id !== userId);
                    updateUserList();
                }
                if (msg.data.indexOf('42["33"') !== -1) {
                    try {
                        let userList = JSON.parse(msg.data.split('42["33",')[1]);
                        roomusers = userList;
                        updateUserList();
                    } catch(e) {
                        console.error(e);
                    }
                }
            };
        } catch (error) {
            console.error(error);
        }
    }

    function startAntiAfk(botId) {
        const interval = setInterval(() => {
            if (!isAfkPaused) {
                wsList.forEach(ws => {
                    if (ws.readyState === WebSocket.OPEN && ws.id === botId) {
                        ws.send(`42[25,${botId}]`);
                    }
                });
            }
        }, 5000);
        afkIntervals.push(interval);
    }

    function updateBotCounter() {
        let botCounter = document.querySelector('.bot-counter');
        let currentBots = parseInt(botCounter.textContent.split(': ')[1]);
        botCounter.textContent = `Bots: ${currentBots + 1}`;
    }

    function toggleRandomAvatar() {
        const switch_elem = document.querySelector('.avatar-switch input');
        const avatar_input = document.querySelector('.avatar-input');
        config.randomAvatar = switch_elem.checked;
        avatar_input.disabled = config.randomAvatar;
        if(config.randomAvatar) {
            avatar_input.value = '';
            updateAvatarPreview('');
        }
    }

    function updateAvatarPreview(value) {
        const preview = document.querySelector('.avatar-preview');
        const numValue = parseInt(value);
        if(numValue >= 0 && numValue <= 36) {
            preview.src = `https://gartic.io/static/images/avatar/svg/${numValue}.svg`;
            preview.style.display = 'inline';
            config.selectedAvatar = numValue;
            config.settings.avatarId = numValue;
        } else {
            preview.style.display = 'none';
        }
    }

    function sendMessage() {
        const messageInput = document.querySelector('.message-input');
        const message = messageInput.value;
        if (message && wsList.length > 0) {
            const firstBot = wsList[0];
            if (firstBot && firstBot.readyState === WebSocket.OPEN) {
                firstBot.send(`42[11,${firstBot.id},"${addInvisibleCharsToMessage(message)}"]`);
            }
        }
    }

    function toggleBot() {
        const toggleButton = document.querySelector('.toggle-button');
        isRunning = !isRunning;
        toggleButton.textContent = isRunning ? 'Stop Bots' : 'Start Bots';
        toggleButton.style.backgroundColor = isRunning ? '#ff4444' : '#4CAF50';

        if (isRunning) {
            enterAllRooms();
            mainInterval = setInterval(enterAllRooms, config.reexecutionDelay);
        } else {
            clearInterval(mainInterval);
        }
    }

    async function enterAllRooms() {
        if (!isRunning) return;
        for (const roomCode of config.Rooms) {
            await enterRoom(roomCode);
            await new Promise(resolve => setTimeout(resolve, config.delayBetweenEntries));
        }
    }

    function createGUI() {
        const css = `
            .frozen-bot {
                position: fixed;
                top: 0;
                left: 0;
                width: 100%;
                height: 100%;
                background: linear-gradient(135deg, #0c1d3b 0%, #1a3b7c 100%);
                padding: 20px;
                color: #fff;
                font-family: 'Arial', sans-serif;
                z-index: 9999;
                overflow-y: auto;
            }

            .bot-container {
                max-width: 1200px;
                margin: 0 auto;
                display: grid;
                grid-template-columns: repeat(2, 1fr);
                gap: 20px;
                padding: 20px;
            }

            .control-panel, .user-panel {
                background: rgba(255, 255, 255, 0.1);
                padding: 20px;
                border-radius: 15px;
                backdrop-filter: blur(10px);
            }

            .frozen-bot input {
                width: 100%;
                padding: 12px;
                margin: 8px 0;
                border: none;
                border-radius: 8px;
                background: rgba(255, 255, 255, 0.15);
                color: #fff;
                font-size: 16px;
            }

            .frozen-bot button {
                width: 100%;
                padding: 12px;
                margin: 8px 0;
                border: none;
                border-radius: 8px;
                cursor: pointer;
                font-weight: bold;
                font-size: 16px;
                transition: all 0.3s ease;
            }

            .user-list {
                display: grid;
                grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
                gap: 10px;
                max-height: 600px;
                overflow-y: auto;
                padding: 15px;
                background: rgba(255, 255, 255, 0.05);
                border-radius: 10px;
            }

            .user-button {
                background: linear-gradient(135deg, #1a3b7c 0%, #0c1d3b 100%);
                color: #89CFF0;
                padding: 10px;
                border-radius: 8px;
                font-size: 14px;
                text-align: center;
                margin: 0;
            }

            h2 {
                color: #89CFF0;
                text-align: center;
                margin-bottom: 15px;
                text-shadow: 0 0 10px rgba(137, 207, 240, 0.5);
            }

            .toggle-button { background: #4CAF50; color: white; }
            .send-button { background: #2196F3; color: white; }
            .exit-button { background: #f44336; color: white; }
            .report-button { background: #E91E63; color: white; }
            .draw-button { background: #9C27B0; color: white; }
            .apply-button { background: #FF9800; color: white; }

            .bot-counter {
                text-align: center;
                margin: 10px 0;
                font-size: 1.2em;
                color: #89CFF0;
            }

            .avatar-container {
                display: flex;
                align-items: center;
                margin: 10px 0;
                gap: 10px;
            }

            .avatar-input { width: 60px !important; }

            .avatar-switch {
                position: relative;
                display: inline-block;
                width: 60px;
                height: 34px;
            }

            .avatar-preview {
                width: 30px;
                height: 30px;
                display: none;
            }

            .avatar-switch input {
                opacity: 0;
                width: 0;
                height: 0;
            }

            .slider {
                position: absolute;
                cursor: pointer;
                top: 0;
                left: 0;
                right: 0;
                bottom: 0;
                background-color: #ccc;
                transition: .4s;
                border-radius: 34px;
            }

            .slider:before {
                position: absolute;
                content: "";
                height: 26px;
                width: 26px;
                left: 4px;
                bottom: 4px;
                background-color: white;
                transition: .4s;
                border-radius: 50%;
            }

            input:checked + .slider { background-color: #2196F3; }
            input:checked + .slider:before { transform: translateX(26px); }
        `;

        const html = `
            <div class="frozen-bot">
                <div class="bot-container">
                    <div class="control-panel">
                        <h2>❄️ Frozen Bot Control Panel ❄️</h2>
                        <div class="bot-counter">Bots: 0</div>
                        <input type="text" class="room-input" placeholder="Enter Room Code..." oninput="updateRoomCode()">
                        <input type="text" class="message-input" placeholder="Enter message...">
                        <button class="send-button" onclick="window.sendMessage()">Send Message</button>
                        <input type="text" class="bot-nick" placeholder="Bot Nick...">
                        <div class="avatar-container">
                            <input type="number" class="avatar-input" placeholder="Avatar" min="0" max="36" oninput="window.updateAvatarPreview(this.value)">
                            <label class="avatar-switch">
                                <input type="checkbox" onchange="window.toggleRandomAvatar()">
                                <span class="slider"></span>
                            </label>
                            <span style="color: #89CFF0;">Random Avatar</span>
                            <img class="avatar-preview">
                        </div>
                        <button class="apply-button" onclick="window.applySettings()">Apply Settings</button>
                        <button class="toggle-button" onclick="window.toggleBot()">Start Bots</button>
                        <button class="exit-button" onclick="window.exitFromRooms()">Exit Room</button>
                        <button class="report-button" onclick="window.sendReport()">Report</button>
                        <button class="draw-button" onclick="window.autoDraw()">AUTO DRAW</button>
                    </div>
                    <div class="user-panel">
                        <h2>👥 User List</h2>
                        <div class="user-list"></div>
                    </div>
                </div>
            </div>
        `;

        const style = document.createElement('style');
        style.textContent = css;
        document.head.appendChild(style);

        const div = document.createElement('div');
        div.innerHTML = html;
        document.body.appendChild(div);
    }

    function init() {
        createGUI();
        loadSettings();
        userListUpdateInterval = setInterval(updateUserList, 100);
    }

    init();
})();
长期地址
遇到问题?请前往 GitHub 提 Issues,或加Q群1031348184

赞助商

Fishcpy

广告

Rainyun

注册一下就行

Rainyun

一年攒够 12 元