web-dev-qa-db-ja.com

Pythonを使用して、JSONを使用してWebソケットと通信する

基本的なhello-worldを超えてWebSocketがどのように使用されるかをよりよく理解するために、WebSocketとJSONを使用してページからデータを取得するタスクを設定しました(gitxivのソースコードはすぐに利用できるため、次を確認することにしました- http://gitxiv.com/day/2015/12/31 )。

Pythonを介してこのWebSocketに接続するのは簡単なようです

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

'212'のように、ws:// urlの変数について完全に明確ではありません。このコードを実行すると、確実に接続できるように見えます(ただし、適切な変数が含まれていないと、サーバーが後で協力することを拒否する可能性が常にありますか?)

Firefoxとgitxivページの間の通信を見ると、サーバーが送信するWebSocketの接続に続いていることがわかります。

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

上記のスクリプトは同じ応答を受け取るので、接続は正常に行われたようです。

しかし、これは私がつまずくところです。通信の次のステップは、ブラウザが次のような非常に多くの情報をWebサービスに送信することです。

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

Ws.send()を使用してこれらの行を直接送信すると、「壊れたフレーミング」が発生します。送信するだけ:

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

その結果、次のようなものが送信されます。

send: '\x81\xbd\xef\x17F8\x945+K\x885|\x1a\x8cx(V\x8at2\x1a\xc350]\x9dd/W\x815|\x1a\xde5j\x1a\x9cb6H\x80e2\x1a\xd5Ld\t\xcd;dH\x9drt\x1a\xc356J\x8a&de\x92'

別のエラーが発生します:

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

したがって、このJSONメッセージをWebSocketに送信する方法に問題があるようです。誰かがそれが期待するフォーマットと、websocket/websocket-clientを使用してそれを達成する方法を知っていますか?どんな説明/提案も大歓迎です。

私が送信しようとしているJSONメッセージは、FirefoxのWebsocket開発者ツールが報告するメッセージです。スクリーンショットは次のとおりです。

Firefox Web Developer Tool report

8
Soz

ブラウザを介して送信される内容をよく見ると、次のことに注意してください。

["{\"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))
9
Wayne Werner