websocket-client は、Python 用の WebSocket クライアントです。これは、WebSocket の低レベル API へのアクセスを提供します。 websocket-client は、WebSocket プロトコルのバージョン hybi-13 を実装します。このクライアントは現在、RFC 7692 の permessage-deflate 拡張機能をサポートしていません。
このプロジェクトのドキュメントは https://websocket-client.readthedocs.io/ にあります。
投稿ガイドラインをご覧ください
pip install websocket-client
使用してインストールするか、 pip install -e .
コードのローカル コピーからインストールします。このモジュールは Python 3.9 以降でテストされています。
特定の WebSocket クライアント機能を有効にするためにインストールできるオプションの依存関係がいくつかあります。
python-socks
をインストールし、パフォーマンスを若干向上させるためにwsaccel
インストールするには、次を使用します: pip install websocket-client[optional]
websockets
をインストールするには、次を使用します: pip install websocket-client[test]
Sphinx
とsphinx_rtd_theme
インストールしてプロジェクト ドキュメントを構築するには、次を使用します: pip install websocket-client[docs]
厳密な依存関係ではありませんが、自動再接続でrun_forever
使用する場合、rel は便利です。 pip install rel
で rel をインストールします。
脚注: zsh などの一部のシェルでは、 [
および]
文字をでエスケープする必要があります。
追加のガイドラインについては、ドキュメントの FAQ を確認してください: https://websocket-client.readthedocs.io/en/latest/faq.html
このライブラリの既知の問題には、WebSocket 圧縮サポート (RFC 7692) の欠如と最小限のスレッド ドキュメント/サポートが含まれます。
send
とvalidate_utf8
メソッドがボトルネックになる場合があります。このライブラリでは、 skip_utf8_validation
パラメータを使用して UTF8 検証を無効にすることができます (そしてパフォーマンスの向上が得られます)。パフォーマンスを向上させたい場合は、wsaccel をインストールしてください。 websocket-client は wsaccel に依存しませんが、利用可能な場合は wsaccel が使用されます。 wsaccel は、UTF8 検証の速度を 2 倍にし、 send
プロセスの一部としてペイロード データをマスクする際のパフォーマンスをわずかに 10% 向上させます。 Numpy はパフォーマンス向上の代替手段として提案されていましたが、問題 #687 では役に立たないことが判明しました。
さらに多くの例が例のドキュメントにあります。
実際の WebSocket 状況のほとんどには、接続の存続期間が長くなります。 WebSocketApp run_forever
ループは、以下が提供されている場合、ネットワーク接続が失われたときに、開いている WebSocket 接続への再接続を自動的に試みます。
dispatcher
引数 (rel または pyevent のような非同期ディスパッチャー)reconnect
引数 (切断から再接続試行までの遅延) run_forever
on_message
やon_error
などのコールバックを使用して、さまざまなイベントベースの接続制御を提供します。 run_forever
サーバーが WebSocket を正常に閉じた場合 (標準の WebSocket クローズ コードを返す) 、自動的に再接続しません。これが決定の背後にあるロジックです。サーバーが WebSocket を閉じるときの動作のカスタマイズは、 on_close
コールバックで処理する必要があります。この例では、ディスパッチャに rel を使用して自動再接続を提供します。
import websocket
import _thread
import time
import rel
def on_message ( ws , message ):
print ( message )
def on_error ( ws , error ):
print ( error )
def on_close ( ws , close_status_code , close_msg ):
print ( "### closed ###" )
def on_open ( ws ):
print ( "Opened connection" )
if __name__ == "__main__" :
websocket . enableTrace ( True )
ws = websocket . WebSocketApp ( "wss://api.gemini.com/v1/marketdata/BTCUSD" ,
on_open = on_open ,
on_message = on_message ,
on_error = on_error ,
on_close = on_close )
ws . run_forever ( dispatcher = rel , reconnect = 5 ) # Set dispatcher to automatic reconnection, 5 second reconnect delay if connection closed unexpectedly
rel . signal ( 2 , rel . abort ) # Keyboard Interrupt
rel . dispatch ()
これは、短いメッセージを伝達し、完了したらすぐに切断したい場合に使用します。たとえば、WebSocket サーバーが実行中であり、特定のリクエストに適切に応答していることを確認したい場合です。
from websocket import create_connection
ws = create_connection ( "ws://echo.websocket.events/" )
print ( ws . recv ())
print ( "Sending 'Hello, World'..." )
ws . send ( "Hello, World" )
print ( "Sent" )
print ( "Receiving..." )
result = ws . recv ()
print ( "Received '%s'" % result )
ws . close ()