Использование Python для связи с веб-сокетом с помощью JSON

чтобы лучше понять, как websockets используются за пределами базового hello-world, я поставил перед собой задачу получить некоторые данные со страницы с помощью websockets и JSON (поскольку исходный код gitxiv легко доступен, я решил посмотреть на http://gitxiv.com/day/2015/12/31).

подключение к этому websocket через Python кажется простым

from websocket import create_connection
import websocket
import pprint

websocket.enableTrace(True)
ws=create_connection("ws://gitxiv.com/sockjs/212/2aczpiim/websocket")
result = ws.recv()
print "Received '%s'" % result
result = ws.recv()
print "Received '%s'" % result

Я не совсем ясно о переменных в WS: / / url, как '212'. Бегущий этот код, похоже, надежно подключается (хотя всегда возможно, что неспособность иметь правильные переменные там заставляет сервер отказываться от сотрудничества позже?)

теперь, если я смотрю связь между Firefox и страницей gitxiv, я вижу, что следующее соединение websocket сервер отправляет

o
a["{"server_id":"0"}"]

скрипт, приведенный выше, получает тот же ответ, поэтому кажется, что соединение успешно установлено.

однако, здесь я спотыкаюсь. Этот следующим шагом в общении является то, что мой браузер отправляет довольно много информации в веб-службу, например, строку:

"["{"msg":"connect","version":"1","support":["1","pre2","pre1"]}"]"

отправка этих строк напрямую с помощью ws.send () приводит к "сломанному обрамлению". Отправка просто:

controlstr='{"msg":"connect","version":"1","support":["1","pre2","pre1"]}';
ws.send(controlstr)

приводит к отправке чего-то, что выглядит так:

send: 'x81xbdxefx17F8x945+Kx885|x1ax8cx(Vx8at2x1axc350]x9dd/Wx815|x1axde5jx1ax9cb6Hx80e2x1axd5Ldtxcd;dHx9drtx1axc356Jx8a&dex92'

Я получаю другую ошибку:

'a["{"msg":"error","reason":"Bad request"}"]'

поэтому кажется, что есть что-то неправильное в том, как я отправляю это сообщение JSON в вебсокетов. Кто-нибудь знает, какой формат он ожидает, и как его достичь с помощью websocket/websocket-client? Любые разъяснения / предложения приветствовались бы.

сообщения JSON, которые я хочу отправить, - это те, о которых сообщает инструмент разработчика Websocket Firefox: вот скриншот:

Firefox Web Developer Tool report

1 ответов


Если вы внимательно посмотрите на то, что отправляется через браузер, обратите внимание, что это:

["{\"msg\":\"connect\"}"]

Это очень похоже на массив строк JSON. Действительно, если вы попытаетесь воспроизвести его:

ws.send(json.dumps([json.dumps({'msg': 'connect', 'version': '1', 'support': ['1', 'pre2', 'pre1']})]))

вы увидите, что вы подключаетесь. Вот весь мой код:

import json
import pprint
import websocket
from websocket import create_connection

websocket.enableTrace(True)
ws = create_connection('ws://gitxiv.com/sockjs/212/2aczpiim/websocket')

result = ws.recv()
print('Result: {}'.format(result))

result = ws.recv()
print('Result: {}'.format(result))

ws.send(json.dumps([json.dumps({'msg': 'connect', 'version': '1', 'support': ['1', 'pre2', 'pre1']})]))
result = ws.recv()
print('Result: {}'.format(result))