Устойчивый цикл 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
|
return
|
||||||
|
|
||||||
logger.info("Бот успешно запущен в режиме прослушивания LongPoll...")
|
logger.info("Бот успешно запущен в режиме прослушивания LongPoll...")
|
||||||
for event in self.longpoll.listen():
|
# Устойчивый цикл: обрыв longpoll-соединения (обычное дело) не должен ронять бота.
|
||||||
if event.type == VkBotEventType.MESSAGE_NEW:
|
while True:
|
||||||
message_obj = event.obj.message
|
try:
|
||||||
user_id = message_obj["from_id"]
|
for event in self.longpoll.listen():
|
||||||
text = message_obj["text"]
|
if event.type == VkBotEventType.MESSAGE_NEW:
|
||||||
self.handle_message(user_id, text)
|
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__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Reference in New Issue
Block a user