diff --git a/test_tg_poster.py b/test_tg_poster.py index 029380e..f485be8 100644 --- a/test_tg_poster.py +++ b/test_tg_poster.py @@ -4,7 +4,7 @@ import asyncio import traceback from dotenv import load_dotenv from telegram import Bot -from telegram.error import TelegramError +from telegram.error import TelegramError, TimedOut from telegram.request import HTTPXRequest # Загрузка переменных окружения @@ -91,24 +91,46 @@ async def make_test_post_async(): logger.info(f"Публикация сообщения с изображением: {initial_text}") logger.info(f"Путь к изображению: {image_path}") - try: - with open(image_path, 'rb') as photo_file: - message = await bot.send_photo( - chat_id=CHANNEL_ID, - photo=photo_file, - caption=initial_text - ) - message_id = message.message_id - logger.info(f"Сообщение успешно опубликовано. Message ID: {message_id}") - 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()}") + # Повторные попытки публикации при таймауте (до 10 раз) + message = None + message_id = None + max_retries = 10 + retry_interval = 5 + + for attempt in range(1, max_retries + 1): + try: + with open(image_path, 'rb') as photo_file: + message = await bot.send_photo( + chat_id=CHANNEL_ID, + photo=photo_file, + caption=initial_text + ) + message_id = message.message_id + logger.info(f"Сообщение успешно опубликовано. Message ID: {message_id}") + break # Успешная публикация, выходим из цикла + 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 # Небольшая задержка перед редактированием @@ -118,25 +140,41 @@ async def make_test_post_async(): edited_text = f"{initial_text}\n\n\nИдентификатор сообщения - {message_id}" logger.info(f"Редактирование сообщения, добавление Message ID: {message_id}") - try: - await bot.edit_message_caption( - chat_id=CHANNEL_ID, - message_id=message_id, - caption=edited_text - ) - logger.info(f"Сообщение успешно отредактировано") - 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 + # Повторные попытки редактирования при таймауте (до 10 раз) + edit_success = False + for attempt in range(1, max_retries + 1): + try: + await bot.edit_message_caption( + chat_id=CHANNEL_ID, + message_id=message_id, + caption=edited_text + ) + logger.info(f"Сообщение успешно отредактировано") + edit_success = True + break # Успешное редактирование, выходим из цикла + 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 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("Тестовое сообщение успешно опубликовано и отредактировано") return True