You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Language code is the language the server you are on should be. If you are joining a private lobby, you instead send id=<lobby id> which will make you join that lobby.
Response Body:
<server uri for a game server>
This is the URI that all next requests should be sent on. An example of a server URI is https://server3.skribbl.io:5006.
Note: All requests after this can be handled by socket.io-client.
GET <server uri>/socket.io/?EIO=4&transport=polling&t=<timestamp>
This is the network request responsible for starting the websocket session between the browser and the server.
GET <server uri>/socket.io/?EIO=4&transport=polling&t=<unique id>&sid=<session id>
Request Headers:
Same as first request
Response Body:
42["data", {
"id": 10,
"data": {
"settings": [
0, // Server language
0, // Max Online Players
0, // Max Draw Time
0, // Total Rounds
0, // Word Count
0, // Total Hints
0, // Word Mode
0 // Use Custom Words
], // Lobby settings
"id": "--------", // Lobby Id
"type": 0, // Lobby type. 0 is public and 1 is private
"me": 0, // Your user ID.
"owner": -1, // The ID of the lobby owner. On public lobbies, its simply -1
"users": [], // Every player in the lobby. The user object can be found in the Datatypes section
"round": 1, // The current round
"state": {
"id": 4, // The current state of the game. A list of states and its meaning is in the GameState datatype.
"time": 0, // The time until the next person starts drawing
"data": {
"id": 0, // The user id of the person currently drawing
"word": [5] // Length of each word
"hints": [ // The letter hints for each word
[<index>, ""]
],
"drawCommands": [ // An array filled with each coloured pixel
[]
]
}
}
}
}]
POST <server uri>/socket.io/?EIO=4&transport=polling&t=<unique id>&sid=<session id>
Request Headers:
Same as first request
Request Body:
42["login",{
"join": "", // The lobby code to join. If joining a public lobby, this is set to blank
"create": 0, // If a private lobby should be created
"name": "", // Your username
"lang": "0", // Your language
"avatar": [0,0,0,0] // Avatar
}]
Response Body:
ok
This request is responsible for making you fully join the game session
For packet ID 6. ReportReason uses bitwise right shifting to store multiple report reasons. If you report the player for spam and botting, the report reason would be 6 ((1 << 1) | (1 << 2) = 6).
Value
Type
Reason
1 << 0
Number
Inappropriate Messages / Drawings
1 << 1
Number
Spam
1 << 2
Number
Botting / Cheating
DrawData
(array)
Index is the index of the item in the array.
Packets are very limited, they are usually a single number with no other data. They are used for testing the websocket connection.
Note: All of these are automatically handled by socket.io-client.
2probe
2probe is the very first websocket message the client should send.
3probe
3probe is sent by the server to acknowledge the 2probe message.
5 (Upgrade)
5 is sent by the client to acknowledge the 3probe message. This is the end of the handshake.
2 (Ping)
2 is sent by the server to the client every 25 seconds (or the pingInterval in the 2nd network request). It is a simple ping/pong request.
3 (Pong)
3 is sent by the client in response to the 2 message. This finishes the ping-pong handshake.
Data Packets
Data Packets are more advanced. They are responsible for handling every in-game action, such as drawing, sending a text message or liking/disliking a drawing.
Example action packet: 42["data",{"id":\<packet id\>,"data":\<data\>}]. The packet ID is the data id.
[1] Player Add
When a new player joins the lobby, the server sends this packet to all logged in players
["data",{"id":11,"data":{"id":3,"time":15,"data":{"id":1,"words":["word1","word2","word3"]}}}] (Possible word choices for drawer)
["data",{"id":11,"data":{"id":4,"time":80,"data":{"id":1,"word":"word1"}}}] (Server auto-selected word due to timeout)
[12] Update Room Settings
Packet ID 12 is sent by the client (if its a private lobby host) to update the game's setting. The server then sends this packet to all online players to let them known that a setting has changed
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This list show a non-exhaustive list of all the words you can use in Skribbl.io. It is currently auto-generated with https://github.com/Skribblers/skribbl.io-word-dumper
Ok, I've tried for the past few hours now and I can't seem to get the socket instance with Playwright or Puppeteer. There's also no way to put a breakpoint programatically and extract the socket instance. If you have any idea on how to build a headful client with your project, I am all ears.
You could use a Proxy. In dev tools set a breakpoint to line 2569, press the "Join" button, and in the console type e = "http://localhost:3000";.
This will make skribbl.io connect to the proxy server which connects to a normal skribbl.io lobby. (client -> proxy -> skribbl.io)
You could use a Proxy. In dev tools set a breakpoint to line 2569, press the "Join" button, and in the console type
e = "http://localhost:3000";
.This will make skribbl.io connect to the proxy server which connects to a normal skribbl.io lobby. (client -> proxy -> skribbl.io)