Веб-сокет Python автоматически закрывается при базовой аутентификации - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь настроить websocket с помощью библиотеки websocket-client, используя python 3.7.В документации поставщика API указано, что требуется базовая аутентификация.

Ниже приведен код, который я использую для подписки на их тестовый канал.Тестовый канал должен отправлять ответы обратно без остановок, пока мы не закроем сокет.

email = b'myemail@domain.com'
pw = b'mypassword'
_str = (base64.b64encode(email + b':' + pw)).decode('ascii')
headerValue = 'Authorization: Basic {0}'.format(_str)

def on_message(ws, msg):
    global msg_received
    print("Message received:     ", msg)
    msg_received += 1
    if msg_received > 10:
        ws.send(json.dumps({"unsubscribe": "/test"}))
        ws.close()


def on_error(ws, error):
    print("ERROR:     ", error)


def on_close(ws):
    print("Closing websocket...")


def on_open(ws):
    print("Opening...")
    ws.send(json.dumps({'subscribe': '/test'}))
    time.sleep(1)


if __name__ == '__main__':
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("wss://api-ws.myurl.com/",
                                header=[headerValue],
                                on_message=on_message,
                                on_error=on_error,
                                on_close=on_close))
    ws.on_open = on_open
    ws.run_forever()

Когда я запускаю это, я могу видеть заголовки моих запросов и их заголовки ответов, которые показывают, что соединение было обновлено дои мне назначен Sec-Websocket-Accept.Затем веб-сокет немедленно закрывается без каких-либо ответов.

Я попытался сначала отправить запрос post в API входа в систему и сгенерировать sessionID и csrftoken, а затем передать их в виде файлов cookie в объекте websocketapp.Это не сработало.Я пытался передать заголовки как фактический диктат, но это тоже не работает.Я перепробовал слишком много вариантов кодировки b64, и ни одна из них не работает.

Любой совет будет оценен.

...