Устойчивый цикл LongPoll: переподключение при обрыве сети

Обрыв longpoll-соединения (RemoteDisconnected) больше не роняет бота —
цикл ловит сетевые ошибки, ждёт и переподключается. Ошибка обработки
одного сообщения тоже не останавливает работу.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Kenik
2026-06-21 21:58:21 +03:00
parent 79cc1ba38d
commit 80c95d6edc
+26 -6
View File
@@ -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__":