[ВОЛК] Multiple retries
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
2026-01-10 20:45:22 +03:00
parent 93930717a7
commit 720ba0ed36
+76 -38
View File
@@ -4,7 +4,7 @@ import asyncio
import traceback import traceback
from dotenv import load_dotenv from dotenv import load_dotenv
from telegram import Bot from telegram import Bot
from telegram.error import TelegramError from telegram.error import TelegramError, TimedOut
from telegram.request import HTTPXRequest from telegram.request import HTTPXRequest
# Загрузка переменных окружения # Загрузка переменных окружения
@@ -91,24 +91,46 @@ async def make_test_post_async():
logger.info(f"Публикация сообщения с изображением: {initial_text}") logger.info(f"Публикация сообщения с изображением: {initial_text}")
logger.info(f"Путь к изображению: {image_path}") logger.info(f"Путь к изображению: {image_path}")
try: # Повторные попытки публикации при таймауте (до 10 раз)
with open(image_path, 'rb') as photo_file: message = None
message = await bot.send_photo( message_id = None
chat_id=CHANNEL_ID, max_retries = 10
photo=photo_file, retry_interval = 5
caption=initial_text
) for attempt in range(1, max_retries + 1):
message_id = message.message_id try:
logger.info(f"Сообщение успешно опубликовано. Message ID: {message_id}") with open(image_path, 'rb') as photo_file:
except TelegramError as e: message = await bot.send_photo(
logger.error(f"Ошибка при публикации сообщения в Telegram: {type(e).__name__}: {e}") chat_id=CHANNEL_ID,
logger.error(f"Детали ошибки: {repr(e)}") photo=photo_file,
logger.error(f"Трассировка стека:\n{traceback.format_exc()}") caption=initial_text
return False )
except Exception as e: message_id = message.message_id
logger.error(f"Неожиданная ошибка при публикации сообщения: {type(e).__name__}: {e}") logger.info(f"Сообщение успешно опубликовано. Message ID: {message_id}")
logger.error(f"Детали ошибки: {repr(e)}") break # Успешная публикация, выходим из цикла
logger.error(f"Трассировка стека:\n{traceback.format_exc()}") except TimedOut as e:
if attempt < max_retries:
logger.warning(f"Таймаут при публикации сообщения (попытка {attempt}/{max_retries}). Повтор через {retry_interval} секунд...")
logger.warning(f"Детали таймаута: {type(e).__name__}: {e}")
await asyncio.sleep(retry_interval)
else:
logger.error(f"Таймаут при публикации сообщения после {max_retries} попыток")
logger.error(f"Детали ошибки: {type(e).__name__}: {e}")
logger.error(f"Трассировка стека:\n{traceback.format_exc()}")
return False
except TelegramError as e:
logger.error(f"Ошибка при публикации сообщения в Telegram: {type(e).__name__}: {e}")
logger.error(f"Детали ошибки: {repr(e)}")
logger.error(f"Трассировка стека:\n{traceback.format_exc()}")
return False
except Exception as e:
logger.error(f"Неожиданная ошибка при публикации сообщения: {type(e).__name__}: {e}")
logger.error(f"Детали ошибки: {repr(e)}")
logger.error(f"Трассировка стека:\n{traceback.format_exc()}")
return False
if message_id is None:
logger.error("Не удалось опубликовать сообщение после всех попыток")
return False return False
# Небольшая задержка перед редактированием # Небольшая задержка перед редактированием
@@ -118,25 +140,41 @@ async def make_test_post_async():
edited_text = f"{initial_text}\n\n\nИдентификатор сообщения - {message_id}" edited_text = f"{initial_text}\n\n\nИдентификатор сообщения - {message_id}"
logger.info(f"Редактирование сообщения, добавление Message ID: {message_id}") logger.info(f"Редактирование сообщения, добавление Message ID: {message_id}")
try: # Повторные попытки редактирования при таймауте (до 10 раз)
await bot.edit_message_caption( edit_success = False
chat_id=CHANNEL_ID, for attempt in range(1, max_retries + 1):
message_id=message_id, try:
caption=edited_text await bot.edit_message_caption(
) chat_id=CHANNEL_ID,
logger.info(f"Сообщение успешно отредактировано") message_id=message_id,
except TelegramError as e: caption=edited_text
logger.error(f"Ошибка при редактировании сообщения в Telegram: {type(e).__name__}: {e}") )
logger.error(f"Детали ошибки: {repr(e)}") logger.info(f"Сообщение успешно отредактировано")
logger.error(f"Трассировка стека:\n{traceback.format_exc()}") edit_success = True
# Сообщение уже опубликовано, поэтому считаем это частичным успехом break # Успешное редактирование, выходим из цикла
return True except TimedOut as e:
except Exception as e: if attempt < max_retries:
logger.error(f"Неожиданная ошибка при редактировании сообщения: {type(e).__name__}: {e}") logger.warning(f"Таймаут при редактировании сообщения (попытка {attempt}/{max_retries}). Повтор через {retry_interval} секунд...")
logger.error(f"Детали ошибки: {repr(e)}") logger.warning(f"Детали таймаута: {type(e).__name__}: {e}")
logger.error(f"Трассировка стека:\n{traceback.format_exc()}") await asyncio.sleep(retry_interval)
# Сообщение уже опубликовано, поэтому считаем это частичным успехом else:
return True logger.error(f"Таймаут при редактировании сообщения после {max_retries} попыток")
logger.error(f"Детали ошибки: {type(e).__name__}: {e}")
logger.error(f"Трассировка стека:\n{traceback.format_exc()}")
# Сообщение уже опубликовано, поэтому считаем это частичным успехом
return True
except TelegramError as e:
logger.error(f"Ошибка при редактировании сообщения в Telegram: {type(e).__name__}: {e}")
logger.error(f"Детали ошибки: {repr(e)}")
logger.error(f"Трассировка стека:\n{traceback.format_exc()}")
# Сообщение уже опубликовано, поэтому считаем это частичным успехом
return True
except Exception as e:
logger.error(f"Неожиданная ошибка при редактировании сообщения: {type(e).__name__}: {e}")
logger.error(f"Детали ошибки: {repr(e)}")
logger.error(f"Трассировка стека:\n{traceback.format_exc()}")
# Сообщение уже опубликовано, поэтому считаем это частичным успехом
return True
logger.info("Тестовое сообщение успешно опубликовано и отредактировано") logger.info("Тестовое сообщение успешно опубликовано и отредактировано")
return True return True