From 80c95d6edc388068c8d000c944e236eab442c677 Mon Sep 17 00:00:00 2001 From: Kenik Date: Sun, 21 Jun 2026 21:58:21 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D1=81=D1=82=D0=BE=D0=B9=D1=87=D0=B8?= =?UTF-8?q?=D0=B2=D1=8B=D0=B9=20=D1=86=D0=B8=D0=BA=D0=BB=20LongPoll:=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B8=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=80=D1=8B=D0=B2=D0=B5=20=D1=81=D0=B5=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Обрыв longpoll-соединения (RemoteDisconnected) больше не роняет бота — цикл ловит сетевые ошибки, ждёт и переподключается. Ошибка обработки одного сообщения тоже не останавливает работу. Co-Authored-By: Claude Opus 4.8 --- bot.py | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/bot.py b/bot.py index 1149b5d..762f484 100644 --- a/bot.py +++ b/bot.py @@ -1972,12 +1972,32 @@ class VKBotApplication: return logger.info("Бот успешно запущен в режиме прослушивания LongPoll...") - for event in self.longpoll.listen(): - if event.type == VkBotEventType.MESSAGE_NEW: - message_obj = event.obj.message - user_id = message_obj["from_id"] - text = message_obj["text"] - self.handle_message(user_id, text) + # Устойчивый цикл: обрыв longpoll-соединения (обычное дело) не должен ронять бота. + while True: + try: + for event in self.longpoll.listen(): + if event.type == VkBotEventType.MESSAGE_NEW: + message_obj = event.obj.message + user_id = message_obj["from_id"] + text = message_obj["text"] + try: + self.handle_message(user_id, text) + except Exception as e: + # Ошибка обработки одного сообщения не должна останавливать бота + logger.error(f"Ошибка обработки сообщения от {user_id}: {e}") + except KeyboardInterrupt: + logger.info("Остановка бота по запросу (Ctrl+C).") + break + except Exception as e: + # Сетевой обрыв/протухшая сессия longpoll — ждём и переподключаемся + logger.warning(f"Обрыв LongPoll ({e}). Переподключение через 3 с…") + time.sleep(3) + try: + self.longpoll = VkBotLongPoll(self.vk_session, config.GROUP_ID) + logger.info("LongPoll переподключён.") + except Exception as e2: + logger.error(f"Не удалось переподключить LongPoll: {e2}") + time.sleep(5) if __name__ == "__main__":