2025, Sep 30 19:16

Как посмотреть рукопожатие WebSocket в Python-клиенте

Как увидеть рукопожатие WebSocket в Python: включите трассировку websocket-client (enableTrace) до создания соединения. Код примера и советы по отладке.

Как посмотреть содержимое рукопожатия WebSocket в клиенте websocket для Python

При отладке интеграции WebSocket часто нужно увидеть содержимое рукопожатия. Если вы используете библиотеку websocket для Python и пытаетесь включить трассировку на уже созданном объекте соединения, начальный обмен вы не поймаете.

Ниже — минимальный пример, показывающий проблему: трассировку включают после создания соединения, поэтому к моменту включения отладочного вывода рукопожатие уже прошло. Простая настройка логирования тоже не выведет рукопожатие.

from websocket import create_connection as open_conn

link = open_conn("ws://your-websocket-url")

# Слишком поздно, чтобы увидеть рукопожатие
link.enableTrace(True)

# Даже при настроенном логировании рукопожатие задним числом не появится
import logging
logging.basicConfig(
    format="%(asctime)s %(message)s",
    level=logging.DEBUG,
)

Что происходит

Рукопожатие выполняется во время начального этапа подключения. Если включить трассировку после создания соединения, библиотека к этому моменту уже завершила переговоры. В итоге показывать нечего. Переключатель трассировки нужно активировать до создания экземпляра и до любой попытки подключения.

Вызовите websocket.enableTrace(True) напрямую у класса, а не у экземпляра. Документация — здесь.

Решение

Включите трассировку на уровне модуля до создания клиента. Так библиотека перехватит и выведет содержимое рукопожатия с самого начала.

import websocket as ws_mod

# Включите вывод отладочных/трассировочных сообщений до создания любого объекта WebSocket
ws_mod.enableTrace(True)

chan = ws_mod.WebSocket()

chan.connect("ws://echo.websocket.events/", origin="testing_websockets.com")

chan.send("Hello, Server")

print(chan.recv())

chan.close()

Почему это важно

Видимость рукопожатия критична при диагностике ошибок подключения, проблем с заголовками или вопросов, связанных с Origin. Если включить трассировку слишком поздно или ограничиться настройкой логирования, ключевые данные переговоров не попадут в вывод — останутся догадки вместо прямых доказательств.

Что запомнить

Чтобы посмотреть содержимое рукопожатия в клиенте websocket для Python, включайте трассировку на уровне модуля до создания или подключения объекта WebSocket с помощью websocket.enableTrace(True). Одна лишь настройка логирования или включение отладки на уже созданном экземпляре исходное рукопожатие не покажет.

Статья основана на вопросе на StackOverflow от intrigued_66 и ответе от 0ro2.