Почему websocket останавливается?

#python #websocket

#python #websocket

Вопрос:

 import json
import amino
from websocket import create_connection
from time import time as timestamp

client = amino.Client()
client.login(email=<email>, password=<password>)
subclient = amino.SubClient(comId=<comid>, profile=client.profile)

def listen():
    ws = create_connection(
            f"wss://ws1.narvii.com?signbody={client.device_id}|{timestamp() * 1000}amp;sid={client.sid}")
        while True:
            data = json.loads(ws.recv())
            if data["t"] == 1000 and data["o"]["chatMessage"]["type"] == 0:
                try:
                    if data["o"]["chatMessage"]["content"] == "!ping":
                        subclient.send_message(chatId=data["o"]["chatMessage"]["threadId"], message="Pong!")
                    print(data["o"]["chatMessage"]["content"])
                except:
                    print("ERROR")
listen()
  

Проблема в том, что после 5 минут успешной работы он по какой-то причине перестает получать сообщения из чатов, при этом программа не вылетает. В чем может быть проблема и как ее исправить?

Комментарии:

1. вы уверены, что удаленный сайт не ограничивает скорость запросов?

2. Может быть тайм-аут прокси / сервера. В зависимости от вашей конфигурации, если обмен данными некоторое время не происходит, возникает тайм-аут (обычно через 50 секунд или около того), в результате чего посредник / сервер отключает сокет. Решение этой проблемы часто заключается в том, чтобы выполнить пинг сокета до истечения времени ожидания.

3. @Myst Да, я слышал об этом, могу ли я привести пример того, как решить эту проблему?

4. @lynx1 — Я не эксперт по python, но я думаю, вам нужно будет либо использовать другой цикл / подход, либо настроить пинг с сервера. Прямо сейчас вы блокируете on read , что не позволит вам просмотреть возможный тайм-аут или отправлять сообщения ping. Вы могли бы добавить еще один поток, который будет sleep(40) и отправлять ping , но это было бы грязным и расточительным взломом.