websocket-client é um cliente WebSocket para Python. Ele fornece acesso a APIs de baixo nível para WebSockets. websocket-client implementa a versão hybi-13 do protocolo WebSocket. Atualmente, este cliente não oferece suporte à extensão permessage-deflate da RFC 7692.
A documentação deste projeto pode ser encontrada em https://websocket-client.readthedocs.io/
Por favor, veja as diretrizes de contribuição
Você pode usar pip install websocket-client
para instalar ou pip install -e .
para instalar a partir de uma cópia local do código. Este módulo foi testado em Python 3.9+.
Existem várias dependências opcionais que podem ser instaladas para habilitar recursos específicos do websocket-client.
python-socks
para uso de proxy e wsaccel
para um pequeno aumento de desempenho, use: pip install websocket-client[optional]
websockets
para executar testes de unidade usando o servidor de eco local, use: pip install websocket-client[test]
Sphinx
e sphinx_rtd_theme
para construir a documentação do projeto, use: pip install websocket-client[docs]
Embora não seja uma dependência estrita, rel é útil ao usar run_forever
com reconexão automática. Instale rel com pip install rel
.
Nota de rodapé: Alguns shells, como zsh, exigem que você escape dos caracteres [
e ]
com .
Confira as Perguntas frequentes da documentação para obter diretrizes adicionais: https://websocket-client.readthedocs.io/en/latest/faq.html
Problemas conhecidos com esta biblioteca incluem falta de suporte à compactação WebSocket (RFC 7692) e documentação/suporte mínimo de threading.
Os métodos send
e validate_utf8
às vezes podem ser gargalos. Você pode desabilitar a validação UTF8 nesta biblioteca (e receber uma melhoria de desempenho) com o parâmetro skip_utf8_validation
. Se você deseja obter melhor desempenho, instale o wsaccel. Embora o websocket-client não dependa do wsaccel, ele será usado se estiver disponível. wsaccel dobra a velocidade de validação UTF8 e oferece um pequeno aumento de desempenho de 10% ao mascarar os dados de carga útil como parte do processo send
. Numpy costumava ser uma alternativa sugerida para melhorar o desempenho, mas o problema nº 687 descobriu que não ajudava.
Muitos outros exemplos são encontrados na documentação de exemplos.
A maioria das situações de WebSockets do mundo real envolve conexões de longa duração. O loop WebSocketApp run_forever
tentará automaticamente se reconectar a uma conexão WebSocket aberta quando uma conexão de rede for perdida se for fornecida com:
dispatcher
(despachante assíncrono como rel ou pyevent)reconnect
diferente de zero (atraso entre a desconexão e a tentativa de reconexão) run_forever
fornece uma variedade de controles de conexão baseados em eventos usando retornos de chamada como on_message
e on_error
. run_forever
não se reconecta automaticamente se o servidor fechar o WebSocket normalmente (retornando um código de fechamento padrão do websocket). Esta é a lógica por trás da decisão. A personalização do comportamento quando o servidor fecha o WebSocket deve ser tratada no retorno de chamada on_close
. Este exemplo usa rel para o despachante fornecer reconexão automática.
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 ()
Isso se você quiser comunicar uma mensagem curta e desconectar-se imediatamente quando terminar. Por exemplo, se você deseja confirmar se um servidor WebSocket está em execução e responde adequadamente a uma solicitação específica.
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 ()