您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
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(); })();