Использование 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: вот скриншот:
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))