Как отправить данные JSON для идентификации на Discord Gateway Websocket - PullRequest
0 голосов
/ 20 февраля 2019

Я использую этот код Python для подключения к шлюзу Discord, в основном мне нужно отправить Opcode 2 Identify, чтобы иметь возможность отправлять сообщения по каналу с помощью API Discord.

import websocket
import json
import pprint
ws = websocket.WebSocket()
# Connect to host url
ws.connect("wss://gateway.discord.gg/?v=6&encoding=json")
# Use ws.send() to send data to server
# Use ws.recv() to get the data sent from server
result = ws.recv()
print "Received: ",result
heartbeat = '{"op": 1,"d": 251}'
p = '{"token": "MY_BOT_TOKEN","properties": {"$os": "linux","$browser": "disco","$device": "disco" },"compress": false, "large_threshold": 250,"shard": [0, 1],"presence": {"game": {},"status": "online","since": null,"afk": false}}'
h = json.loads(heartbeat)
h_json = json.dumps(h)
p_load = json.loads(p)
p_json = json.dumps(p_load)
print(h_json)
ws.send(h_json)
# Use ws.close() to close the WebSocket handshake
result = ws.recv()
print "Received: ",result
ws.send(p_json)
result = ws.recv()
print "Received: ",result

Чтоэтот код: отправляет сердцебиение после кода операции 10, получает от сервера код операции 11, отправляет объект json для идентификации кода операции 2.

Но результат таков:

Received:  {"t":null,"s":null,"op":10,"d":{"heartbeat_interval":41250,"_trace":["gateway-prd-main-rskw"]}}
{"d": 251, "op": 1}
Received:  {"t":null,"s":null,"op":11,"d":null}
Received:  

Проблема в том, что после отправки json соединение закрывается, и я не могу получить ответ, что-то не так в моем запросе?

1 Ответ

0 голосов
/ 08 июля 2019

У меня была такая же проблема с первой попытки, поэтому я внимательно прочитал документацию и обнаружил раздел ниже.


Отправка полезных данных

Пакеты, отправленные от клиента к API шлюза, инкапсулированы в объекте полезной нагрузки шлюза и должны иметь надлежащий код операции и объект данных. Затем объект полезной нагрузки может быть сериализован в выбранном формате (см. ETF / JSON)и отправил через веб-сокет.Полезная нагрузка на шлюз ограничена до 4096 отправленных байтов, при переходе через это вызовет разрыв соединения с кодом ошибки 4002.


Хорошо, что это значит?

Каждый пакетвы послали в Gateway API, чтобы следовать модели запроса.

{
  "op": 0,
  "d": {},
  "s": 42,
  "t": "GATEWAY_EVENT_NAME"
}

Что представляет собой каждый объект в этой модели запроса?

op: код, который сообщает API шлюза, какова вашатип полезной нагрузки.Вы можете найти список op здесь .

d: сама полезная нагрузка.Здесь показан json, который вы пытаетесь отправить (переменная p)

s и t: требуется только для op 0, поэтому вы можете передать его как ноль для IDENTIFY.

Как должен выглядеть ваш запрос

{
    "op": 2,
    "d": {
        "token": "YOUR_TOKEN_HERE",
        "properties": {
            "$os": "linux",
            "$browser": "disco",
            "$device": "disco"
        }
    },
    "s": null,
    "t": null
}
...