Устойчивый цикл LongPoll: переподключение при обрыве сети
Обрыв longpoll-соединения (RemoteDisconnected) больше не роняет бота — цикл ловит сетевые ошибки, ждёт и переподключается. Ошибка обработки одного сообщения тоже не останавливает работу. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -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__":
|
||||
|
||||
Reference in New Issue
Block a user