您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Write text on the Drawaria canvas using WebSockets
// ==UserScript== // @name Drawaria Canvas Text Writer Safe Version // @namespace http://tampermonkey.net/ // @version 1.0 // @description Write text on the Drawaria canvas using WebSockets // @author YouTubeDrawaria // @include https://drawaria.online/* // @icon https://www.google.com/s2/favicons?sz=64&domain=drawaria.online // @license MIT // @grant none // ==/UserScript== (function() { 'use strict'; // Adding Text Input and Button function addTextInput() { let container = document.createElement('div'); container.style.position = 'fixed'; container.style.top = '692.984px'; // Ajusta la posición vertical container.style.left = '165.629px'; // Ajusta la posición horizontal container.style.transform = 'translateX(-50%)'; container.style.zIndex = 1000; container.style.background = 'linear-gradient(135deg, #003366, #0099cc)'; container.style.padding = '20px'; container.style.borderRadius = '10px'; container.style.boxShadow = '0 4px 8px rgba(0, 0, 0, 0.2)'; container.style.display = 'flex'; container.style.flexDirection = 'column'; container.style.alignItems = 'center'; container.style.cursor = 'move'; let title = document.createElement('h3'); title.textContent = 'Canvas Text Writer'; title.style.margin = '0'; title.style.paddingBottom = '10px'; title.style.borderBottom = '1px solid #555'; title.style.width = '100%'; title.style.textAlign = 'center'; title.style.color = 'white'; container.appendChild(title); let toggleButton = document.createElement('div'); toggleButton.innerHTML = '▲'; // Up arrow (cerrado por defecto) toggleButton.style.cursor = 'pointer'; toggleButton.style.fontSize = '20px'; toggleButton.style.color = 'white'; toggleButton.style.marginBottom = '10px'; toggleButton.addEventListener('click', () => { let content = container.querySelector('.content'); if (content.style.display === 'none') { content.style.display = 'flex'; toggleButton.innerHTML = '▼'; // Down arrow } else { content.style.display = 'none'; toggleButton.innerHTML = '▲'; // Up arrow } }); container.appendChild(toggleButton); let innerContainer = document.createElement('div'); innerContainer.className = 'content'; innerContainer.style.background = 'rgba(255, 255, 255, 0.2)'; innerContainer.style.padding = '20px'; innerContainer.style.borderRadius = '10px'; innerContainer.style.width = '100%'; innerContainer.style.display = 'none'; // Cerrado por defecto innerContainer.style.flexDirection = 'column'; innerContainer.style.alignItems = 'center'; let wordList = document.createElement('div'); wordList.style.maxHeight = '150px'; wordList.style.overflowY = 'auto'; wordList.style.margin = '10px 0'; wordList.style.width = 'calc(100% - 20px)'; wordList.style.border = '1px solid #ccc'; wordList.style.borderRadius = '5px'; wordList.style.padding = '10px'; wordList.style.background = 'white'; let words = ['Hello', 'World', 'Draw', 'Canvas', 'Text', 'Write', 'Send', 'Clear', 'Join', 'Room']; let selectedWord = null; words.forEach(word => { let checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.value = word; checkbox.style.marginRight = '10px'; checkbox.addEventListener('change', () => { if (checkbox.checked) { selectedWord = word; wordList.querySelectorAll('input[type="checkbox"]').forEach(cb => { if (cb !== checkbox) { cb.checked = false; } }); } else { selectedWord = null; } }); let label = document.createElement('label'); label.appendChild(checkbox); label.appendChild(document.createTextNode(word)); label.style.display = 'block'; label.style.marginBottom = '5px'; wordList.appendChild(label); }); let fontSelect = document.createElement('select'); fontSelect.style.margin = '10px 0'; fontSelect.style.padding = '10px'; fontSelect.style.borderRadius = '5px'; fontSelect.style.border = '1px solid #ccc'; fontSelect.style.width = 'calc(100% - 20px)'; fontSelect.innerHTML = ` <option value="Arial">Arial</option> <option value="Ravie">Ravie</option> <option value="Courier">Courier</option> <option value="Magneto">Magneto</option> <option value="Papyrus">Papyrus</option> <option value="Script MT Bold">Script MT Bold</option> <option value="Algerian">Algerian</option> <option value="Segoe Print">Segoe Print</option> `; let pixelSizeLabel = document.createElement('div'); pixelSizeLabel.textContent = 'Pixel Size: 30'; pixelSizeLabel.style.margin = '10px 0'; pixelSizeLabel.style.color = 'white'; let pixelSizeSlider = document.createElement('input'); pixelSizeSlider.type = 'range'; pixelSizeSlider.min = '10'; pixelSizeSlider.max = '30'; pixelSizeSlider.value = '30'; pixelSizeSlider.style.margin = '10px 0'; pixelSizeSlider.style.width = 'calc(100% - 20px)'; pixelSizeSlider.addEventListener('input', (event) => { pixelSizeLabel.textContent = `Pixel Size: ${event.target.value}`; }); let xPositionLabel = document.createElement('div'); xPositionLabel.textContent = 'Horizontal Position: 0'; xPositionLabel.style.margin = '10px 0'; xPositionLabel.style.color = 'white'; let xPositionSlider = document.createElement('input'); xPositionSlider.type = 'range'; xPositionSlider.min = '0'; xPositionSlider.max = '100'; xPositionSlider.value = '0'; xPositionSlider.style.margin = '10px 0'; xPositionSlider.style.width = 'calc(100% - 20px)'; xPositionSlider.addEventListener('input', (event) => { xPositionLabel.textContent = `Horizontal Position: ${event.target.value}`; }); let yPositionLabel = document.createElement('div'); yPositionLabel.textContent = 'Vertical Position: 0'; yPositionLabel.style.margin = '10px 0'; yPositionLabel.style.color = 'white'; let yPositionSlider = document.createElement('input'); yPositionSlider.type = 'range'; yPositionSlider.min = '0'; yPositionSlider.max = '100'; yPositionSlider.value = '0'; yPositionSlider.style.margin = '10px 0'; yPositionSlider.style.width = 'calc(100% - 20px)'; yPositionSlider.addEventListener('input', (event) => { yPositionLabel.textContent = `Vertical Position: ${event.target.value}`; }); let sendButton = document.createElement('button'); sendButton.textContent = 'Send Text'; sendButton.style.padding = '10px'; sendButton.style.borderRadius = '5px'; sendButton.style.border = 'none'; sendButton.style.background = 'linear-gradient(to bottom, white, #d3d3d3)'; sendButton.style.color = '#003366'; sendButton.style.cursor = 'pointer'; sendButton.style.width = 'calc(100% - 20px)'; sendButton.style.marginBottom = '10px'; sendButton.addEventListener('click', () => { if (selectedWord) { drawTextOnCanvas(selectedWord, fontSelect.value, parseInt(pixelSizeSlider.value), parseInt(xPositionSlider.value), parseInt(yPositionSlider.value)); } }); let clearCanvasButton = document.createElement('button'); clearCanvasButton.textContent = 'Clear Canvas'; clearCanvasButton.style.padding = '10px'; clearCanvasButton.style.borderRadius = '5px'; clearCanvasButton.style.border = 'none'; clearCanvasButton.style.background = 'linear-gradient(to bottom, white, #d3d3d3)'; clearCanvasButton.style.color = '#003366'; clearCanvasButton.style.cursor = 'pointer'; clearCanvasButton.style.width = 'calc(100% - 20px)'; clearCanvasButton.style.marginBottom = '10px'; clearCanvasButton.addEventListener('click', () => { let data = ["drawcmd", 0, [0.5, 0.5, 0.5, 0.5, !0, -2000, "#FFFFFF", -1, !1]]; window.sockets.forEach(socket => { if (socket.readyState === WebSocket.OPEN) { socket.send(`42${JSON.stringify(data)}`); } }); }); let joinButton = document.createElement('button'); joinButton.textContent = 'Join'; joinButton.style.padding = '10px'; joinButton.style.borderRadius = '5px'; joinButton.style.border = 'none'; joinButton.style.background = 'linear-gradient(to bottom, white, #d3d3d3)'; joinButton.style.color = '#003366'; joinButton.style.cursor = 'pointer'; joinButton.style.width = 'calc(100% - 20px)'; joinButton.style.marginBottom = '10px'; joinButton.addEventListener('mousedown', (e) => { window['___BOT'].room.join(EL('#invurl').value); }); let colorInput = document.createElement('input'); colorInput.type = 'color'; colorInput.value = '#000000'; colorInput.style.margin = '10px 0'; innerContainer.appendChild(wordList); innerContainer.appendChild(fontSelect); innerContainer.appendChild(pixelSizeLabel); innerContainer.appendChild(pixelSizeSlider); innerContainer.appendChild(xPositionLabel); innerContainer.appendChild(xPositionSlider); innerContainer.appendChild(yPositionLabel); innerContainer.appendChild(yPositionSlider); innerContainer.appendChild(sendButton); innerContainer.appendChild(clearCanvasButton); innerContainer.appendChild(joinButton); innerContainer.appendChild(colorInput); container.appendChild(innerContainer); document.body.appendChild(container); // Make the container draggable let isDragging = false; let offsetX, offsetY; container.addEventListener('mousedown', (e) => { if (e.target === container || e.target === title) { isDragging = true; offsetX = e.clientX - container.getBoundingClientRect().left; offsetY = e.clientY - container.getBoundingClientRect().top; container.style.cursor = 'grabbing'; } }); document.addEventListener('mousemove', (e) => { if (isDragging) { container.style.left = `${e.clientX - offsetX}px`; container.style.top = `${e.clientY - offsetY}px`; } }); document.addEventListener('mouseup', () => { isDragging = false; container.style.cursor = 'move'; }); } // Drawing Text on Canvas function drawTextOnCanvas(text, font, pixelSize, xPosition, yPosition) { let x = xPosition / 100; // Convert to percentage let y = yPosition / 100; // Convert to percentage let thickness = 5; let color = document.querySelector('input[type="color"]').value; // Get color from input let canvas = document.createElement('canvas'); let ctx = canvas.getContext('2d'); canvas.width = 500; canvas.height = 100; ctx.font = `${pixelSize}px ${font}`; ctx.fillStyle = color; ctx.fillText(text, 10, 50); let imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data; let commands = []; for (let i = 0; i < imageData.length; i += 4) { if (imageData[i + 3] > 0) { // Alpha channel is not zero let px = (i / 4) % canvas.width; let py = Math.floor((i / 4) / canvas.width); let nx = x + (px / canvas.width); let ny = y + (py / canvas.height); commands.push([nx, ny, nx, ny, false, -thickness, color, 0, 0, {}]); } } // Send commands in batches to avoid overloading the WebSocket const batchSize = 50; for (let i = 0; i < commands.length; i += batchSize) { let batch = commands.slice(i, i + batchSize); batch.forEach(cmd => { sendDrawCommand(cmd[0], cmd[1], cmd[2], cmd[3], thickness, color); }); // Add a small delay to avoid overloading the WebSocket setTimeout(() => {}, 10); } } // Sending Draw Command via WebSocket function sendDrawCommand(x1, y1, x2, y2, thickness, color) { let message = `42["drawcmd",0,[${x1},${y1},${x2},${y2},false,${0 - thickness},"${color}",0,0,{}]]`; window.sockets.forEach(socket => { if (socket.readyState === WebSocket.OPEN) { socket.send(message); } }); } // Overriding WebSocket send method to capture sockets const originalSend = WebSocket.prototype.send; WebSocket.prototype.send = function (...args) { if (window.sockets.indexOf(this) === -1) { window.sockets.push(this); } return originalSend.call(this, ...args); }; // Initializing window.sockets = []; addTextInput(); // Adding the bot functionality const EL = (sel) => document.querySelector(sel); const Player = function (name = undefined) { this.name = name; this.sid1 = null; this.uid = ''; this.wt = ''; this.conn = new Connection(this); this.room = new Room(this.conn); this.action = new Actions(this.conn); }; Player.prototype.annonymize = function (name) { this.name = name; this.uid = undefined; this.wt = undefined; }; const Connection = function (player) { this.player = player; }; Connection.prototype.onopen = function (event) { this.Heartbeat(25000); }; Connection.prototype.onclose = function (event) { }; Connection.prototype.onerror = function (event) { }; Connection.prototype.onmessage = function (event) { let message = String(event.data); if (message.startsWith('42')) { this.onbroadcast(message.slice(2)); } else if (message.startsWith('40')) { this.onrequest(); } else if (message.startsWith('41')) { this.player.room.join(this.player.room.id); } else if (message.startsWith('430')) { let configs = JSON.parse(message.slice(3))[0]; this.player.room.players = configs.players; this.player.room.id = configs.roomid; } }; Connection.prototype.onbroadcast = function (payload) { payload = JSON.parse(payload); if (payload[0] == 'bc_uc_freedrawsession_changedroom') { this.player.room.players = payload[3]; this.player.room.id = payload[4]; } if (payload[0] == 'mc_roomplayerschange') { this.player.room.players = payload[3]; } }; Connection.prototype.onrequest = function () {}; Connection.prototype.open = function (url) { this.socket = new WebSocket(url); this.socket.onopen = this.onopen.bind(this); this.socket.onclose = this.onclose.bind(this); this.socket.onerror = this.onerror.bind(this); this.socket.onmessage = this.onmessage.bind(this); }; Connection.prototype.close = function (code, reason) { this.socket.close(code, reason); }; Connection.prototype.Heartbeat = function (interval) { let timeout = setTimeout(() => { if (this.socket.readyState == this.socket.OPEN) { this.socket.send(2); this.Heartbeat(interval); } }, interval); }; Connection.prototype.serverconnect = function (server, room) { if (this.socket == undefined || this.socket.readyState != this.socket.OPEN) { this.open(server); } else { this.socket.send(41); this.socket.send(40); } this.onrequest = () => { this.socket.send(room); }; }; const Room = function (conn) { this.conn = conn; this.id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'; this.players = []; }; Room.prototype.join = function (invitelink) { let gamemode = 2; let server = ''; if (invitelink == null) { this.id = null; server = 'sv3.'; } else { this.id = invitelink.startsWith('http') ? invitelink.split('/').pop() : invitelink; if (invitelink.endsWith('.3')) { server = 'sv3.'; gamemode = 2; } else if (invitelink.endsWith('.2')) { server = 'sv2.'; gamemode = 2; } else { server = ''; gamemode = 1; } } let serverurl = `wss://${server}drawaria.online/socket.io/?sid1=undefined&hostname=drawaria.online&EIO=3&transport=websocket`; let player = this.conn.player; let connectstring = `420["startplay","${player.name}",${gamemode},"en",${nullify(this.id)},null,[null,"https://drawaria.online/",1000,1000,[${nullify(player.sid1)},${nullify(player.uid)},${nullify(player.wt)}],null]]`; this.conn.serverconnect(serverurl, connectstring); }; Room.prototype.next = function () { if (this.conn.socket.readyState != this.conn.socket.OPEN) { this.join(null); } else { this.conn.socket.send('42["pgswtichroom"]'); } }; const Actions = function (conn) { this.conn = conn; }; Actions.prototype.DrawLine = function (bx = 50, by = 50, ex = 50, ey = 50, thickness = 50, color = '#FFFFFF', algo = 0) { bx = bx / 100; by = by / 100; ex = ex / 100; ey = ey / 100; this.conn.socket.send(`42["drawcmd",0,[${bx},${by},${ex},${ey},true,${0 - thickness},"${color}",0,0,{"2":${algo},"3":0.5,"4":0.5}]]`); this.conn.socket.send(`42["drawcmd",0,[${bx},${by},${ex},${ey},false,${0 - thickness},"${color}",0,0,{"2":${algo},"3":0.5,"4":0.5}]]`); }; var nullify = (value = null) => { return value == null ? null : String().concat('"', value, '"'); }; if (!document.getElementById('Engine-Cheatcontainer')) { window['___BOT'] = new Player('Text Writer'); } })();