Задать вопрос
@redbaron616

Постоянная ошибка: nextcord.errors.ConnectionClosed: Shard ID None WebSocket closed with 1000. Как решить?

Использую библиотеку nextcord, написал асинхронного бота с парсером (тоже асинхронным) и запустил в две задачи
Первые пару часов отрабатывает нормально, но после начинает давать сбои со следующей ошибкой:

File "/usr/local/lib/python3.8/dist-packages/nextcord/gateway.py", line 629, in poll_event
    raise ConnectionClosed(self.socket, shard_id=self.shard_id, code=code) from None
nextcord.errors.ConnectionClosed: Shard ID None WebSocket closed with 1000


Читал на разных форумах, пишут что может быть из-за парсера
Пытался решить на протяжении недели, ставил даже хендлеры, все равно сбивает бота.

Код запуска:
@bot.event
async def on_ready():
     # Thread(target=run_main).start()
     print('Thread started.')
     await bot.change_presence(
         status=nextcord.Status.online,
         activity=nextcord.Activity(type=nextcord.ActivityType.watching, name='Active Channels'))
     logger.info(msg='Бот запущен!')


if __name__ == '__main__':
    logging.basicConfig(level=logging.WARNING)
    bot.add_cog(Sharer(bot))

    bot.loop.create_task(main())
    asyncio.run(bot.run(token))


Код main функции парсера:

async def main():
    while True:
        tasks = await TasksDAO.find_all()

        for task in tasks:
            messages = await getter.get_messages(task.token, task.id_from)
            new_messages = await getter.filter_new_messages(task.last_message_id, messages)

            if new_messages == 0:  # Если нету last_message_id, обновляем
                messages = await getter.get_messages(task.token, task.id_from)
                await TasksDAO.change_last_message_id(messages[-1]['id'], task.id)  # обновляем id последнего сообщения
            elif new_messages:
                list_messages = [{message['content']: message['id']} for message in messages]
                new_list_messages = [{message['content']: message['id']} for message in new_messages]

                print(list_messages)
                print(new_list_messages)

                await TasksDAO.change_last_message_id(new_messages[-1]['id'], task.id)  # обновляем id последнего сообщения

                bot.dispatch('resending', task.id_to, new_messages, task.token, task.use_link, task.use_embed)


Парсер обращается к API дискорда через токен, получает новые сообщения с определенного канала, и сразу пересылает их в другой канал.
  • Вопрос задан
  • 63 просмотра
Подписаться Простой Комментировать
Решения вопроса 1
fenrir1121
@fenrir1121 Куратор тега discord.py
Начни с документации
Дискорд примерно раз в 2 часа отключает клиентов с целью балансировки нагрузки. Это нормальное поведение, обработка которого есть в самой библиотеке.
Если ваше соединение не восстанавливается, вероятно ваш бот не нравится дискорду.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы