您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
Pixel Place Parallel Connections
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/443907/1043372/PPPC.js
// ==UserScript== // @name PPPC // @description Pixel Place Parallel Connections // @version 1.9 // @author 0vC4 // @namespace http://greasyfork.icu/users/670183 // @match https://pixelplace.io/* // @icon https://www.google.com/s2/favicons?sz=64&domain=pixelplace.io // @license MIT // @grant none // @run-at document-start // ==/UserScript== const PPPC = (() => { if (window.PPPC) return window.PPPC; const PPPC = { get settings() { return JSON.parse(localStorage.settings || '""') }, set settings(json) { localStorage.settings = JSON.stringify(json); }, async show() { return JSON.stringify([ (await cookieStore.get('authId')).value, (await cookieStore.get('authToken')).value, (await cookieStore.get('authKey')).value ]); }, async add(username, scheme) { const settings = this.settings; settings.userlist[username] = scheme; this.settings = settings; return true; }, async remove(username) { const settings = this.settings; delete settings.userlist[username]; this.settings = settings; return true; }, async save() { const settings = this.settings; settings.current = { authId: (await cookieStore.get('authId')).value, authToken: (await cookieStore.get('authToken')).value, authKey: (await cookieStore.get('authKey')).value }; this.settings = settings; }, async load(scheme = null) { const settings = this.settings; await cookieStore.set('authId', scheme ? scheme[0] : settings.current.authId); await cookieStore.set('authToken', scheme ? scheme[1] : settings.current.authToken); await cookieStore.set('authKey', scheme ? scheme[2] : settings.current.authKey); delete settings.current; this.settings = settings; }, async join(username, server) { const settings = this.settings; if (!settings.userlist[username]) return null; const [id, token, key] = settings.userlist[username]; await cookieStore.set('authId', id); await cookieStore.set('authToken', token); await cookieStore.set('authKey', key); await fetch(`https://pixelplace.io/api/get-painting.php?id=${server}&connected=1`); settings.userlist[username] = [ (await cookieStore.get('authId')).value, (await cookieStore.get('authToken')).value, (await cookieStore.get('authKey')).value ]; this.settings = settings; return settings.userlist[username]; }, timer: window, async connect(username, boardId) { const result = await this.join(username, boardId); if (!result) return null; const [authId, authToken, authKey] = result; const timer = this.timer; const user = new WebSocket('wss://pixelplace.io/socket.io/?EIO=3&transport=websocket'); user.headless = true; user.onmessage = ({data}) => { const [code, msg] = data.split(/(?<=^\d+)(?=[^\d])/); if (code == '40') user.send('42' + JSON.stringify( ["init", { authKey, authToken, authId, boardId }] )); const message = JSON.parse(msg || '[]'); if (message.pingInterval) user.ping = timer.setInterval(() => user.send('2'), message.pingInterval); if (!message.length) return arguments; const [event, json] = message; if (event == 'throw.error') user.close(); }; user.onclose = () => { console.log(username, 'bot disconnected'); timer.setInterval(user.ping); }; user.set = (x,y,p) => user.send(`42["p",[${x},${y},${p},1]]`); return user; } }; if (!PPPC.settings) PPPC.settings = { userlist: {} }; window.PPPC = PPPC; return PPPC; })(); // 0vC4#7152