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__":