diff --git a/evtg_publish.py b/evtg_publish.py index 59f704b..c8237dd 100644 --- a/evtg_publish.py +++ b/evtg_publish.py @@ -6,7 +6,7 @@ import time import html from datetime import datetime, timezone, timedelta from telegram import Bot, InlineKeyboardMarkup, InlineKeyboardButton -from telegram.error import TelegramError, RetryAfter +from telegram.error import TelegramError, RetryAfter, TimedOut from dotenv import load_dotenv from formatter import get_event_text @@ -133,12 +133,24 @@ async def tg_post_event(bot, event_data): # Формируем первоначальный текст initial_text = f"{base_text}\n\n{about}" if about else base_text - # Логируем текст для отладки - logger.info(f"Текст для публикации события номер {event_data['number']}: {initial_text}") + # Логируем детальную информацию о данных для публикации + logger.info(f"=== Детали публикации события номер {event_data['number']} ===") + logger.info(f"Длина initial_text: {len(initial_text)} символов") + logger.info(f"Длина base_text: {base_text_length} символов") + logger.info(f"Длина about: {len(about)} символов") + logger.info(f"Длина links_line_placeholder: {links_line_length} символов") + logger.info(f"Максимальная длина (max_length): {max_length} символов") + logger.info(f"Доступная длина для about: {available_length} символов") + logger.info(f"Есть изображение: {has_image}") + if has_image: + logger.info(f"URL изображения: {image_url}") + logger.info(f"Длина URL изображения: {len(image_url)} символов") + logger.info(f"Текст для публикации: {initial_text[:200]}..." if len(initial_text) > 200 else f"Текст для публикации: {initial_text}") # Публикация первоначального сообщения без ссылок if has_image: try: + logger.info(f"Попытка отправки фото для события {event_data['number']}: chat_id={CHANNEL_ID}, caption_length={len(initial_text)}, image_url_length={len(image_url)}") message = await bot.send_photo( chat_id=CHANNEL_ID, photo=image_url, @@ -146,6 +158,20 @@ async def tg_post_event(bot, event_data): parse_mode="HTML", disable_notification=PUBLISH_SILENTLY ) + logger.info(f"Фото успешно отправлено для события {event_data['number']}, message_id={message.message_id}") + except TimedOut as e: + logger.error(f"ТАЙМАУТ при отправке изображения для события номер {event_data['number']}") + logger.error(f"Полная диагностическая информация об ошибке TimedOut:") + logger.error(f" Тип ошибки: {type(e).__name__}") + logger.error(f" Сообщение: {str(e)}") + logger.error(f" Все атрибуты ошибки: {vars(e)}") + logger.error(f" Полное представление: {repr(e)}") + logger.error(f" Параметры запроса:") + logger.error(f" chat_id: {CHANNEL_ID}") + logger.error(f" image_url: {image_url}") + logger.error(f" caption_length: {len(initial_text)}") + logger.error(f" parse_mode: HTML") + raise except TelegramError as e: logger.warning(f"Не удалось отправить изображение для события номер {event_data['number']}: {e}. Отправляем текстовое сообщение.") logger.error(f"Полная информация об ошибке Telegram при отправке изображения для события {event_data['number']}:") @@ -153,6 +179,31 @@ async def tg_post_event(bot, event_data): logger.error(f" Сообщение: {str(e)}") logger.error(f" Все атрибуты ошибки: {vars(e)}") logger.error(f" Полное представление: {repr(e)}") + logger.info(f"Попытка отправки текстового сообщения вместо фото для события {event_data['number']}") + try: + message = await bot.send_message( + chat_id=CHANNEL_ID, + text=initial_text, + parse_mode="HTML", + disable_notification=PUBLISH_SILENTLY, + disable_web_page_preview=True # Отключаем предпросмотр ссылок + ) + logger.info(f"Текстовое сообщение успешно отправлено для события {event_data['number']}, message_id={message.message_id}") + except TimedOut as e: + logger.error(f"ТАЙМАУТ при отправке текстового сообщения для события номер {event_data['number']}") + logger.error(f"Полная диагностическая информация об ошибке TimedOut:") + logger.error(f" Тип ошибки: {type(e).__name__}") + logger.error(f" Сообщение: {str(e)}") + logger.error(f" Все атрибуты ошибки: {vars(e)}") + logger.error(f" Полное представление: {repr(e)}") + logger.error(f" Параметры запроса:") + logger.error(f" chat_id: {CHANNEL_ID}") + logger.error(f" text_length: {len(initial_text)}") + logger.error(f" parse_mode: HTML") + raise + else: + logger.info(f"Попытка отправки текстового сообщения для события {event_data['number']}: chat_id={CHANNEL_ID}, text_length={len(initial_text)}") + try: message = await bot.send_message( chat_id=CHANNEL_ID, text=initial_text, @@ -160,14 +211,19 @@ async def tg_post_event(bot, event_data): disable_notification=PUBLISH_SILENTLY, disable_web_page_preview=True # Отключаем предпросмотр ссылок ) - else: - message = await bot.send_message( - chat_id=CHANNEL_ID, - text=initial_text, - parse_mode="HTML", - disable_notification=PUBLISH_SILENTLY, - disable_web_page_preview=True # Отключаем предпросмотр ссылок - ) + logger.info(f"Текстовое сообщение успешно отправлено для события {event_data['number']}, message_id={message.message_id}") + except TimedOut as e: + logger.error(f"ТАЙМАУТ при отправке текстового сообщения для события номер {event_data['number']}") + logger.error(f"Полная диагностическая информация об ошибке TimedOut:") + logger.error(f" Тип ошибки: {type(e).__name__}") + logger.error(f" Сообщение: {str(e)}") + logger.error(f" Все атрибуты ошибки: {vars(e)}") + logger.error(f" Полное представление: {repr(e)}") + logger.error(f" Параметры запроса:") + logger.error(f" chat_id: {CHANNEL_ID}") + logger.error(f" text_length: {len(initial_text)}") + logger.error(f" parse_mode: HTML") + raise # Получаем ID сообщения для использования в ссылке подписки message_id = message.message_id @@ -182,6 +238,7 @@ async def tg_post_event(bot, event_data): await asyncio.sleep(2) # Редактируем сообщение, добавляя ссылки + logger.info(f"Попытка редактирования сообщения для события {event_data['number']}: message_id={message_id}, final_text_length={len(final_text)}") if has_image: try: await bot.edit_message_caption( @@ -190,6 +247,20 @@ async def tg_post_event(bot, event_data): caption=final_text, parse_mode="HTML" ) + logger.info(f"Подпись успешно отредактирована для события {event_data['number']}") + except TimedOut as e: + logger.error(f"ТАЙМАУТ при редактировании подписи для события номер {event_data['number']}") + logger.error(f"Полная диагностическая информация об ошибке TimedOut:") + logger.error(f" Тип ошибки: {type(e).__name__}") + logger.error(f" Сообщение: {str(e)}") + logger.error(f" Все атрибуты ошибки: {vars(e)}") + logger.error(f" Полное представление: {repr(e)}") + logger.error(f" Параметры запроса:") + logger.error(f" chat_id: {CHANNEL_ID}") + logger.error(f" message_id: {message_id}") + logger.error(f" caption_length: {len(final_text)}") + logger.error(f" parse_mode: HTML") + raise except TelegramError as e: logger.warning(f"Не удалось отредактировать подпись для события номер {event_data['number']}: {e}. Пробуем отредактировать текстовое сообщение.") logger.error(f"Полная информация об ошибке Telegram при редактировании подписи для события {event_data['number']}:") @@ -197,6 +268,31 @@ async def tg_post_event(bot, event_data): logger.error(f" Сообщение: {str(e)}") logger.error(f" Все атрибуты ошибки: {vars(e)}") logger.error(f" Полное представление: {repr(e)}") + logger.info(f"Попытка редактирования текста вместо подписи для события {event_data['number']}") + try: + await bot.edit_message_text( + chat_id=CHANNEL_ID, + message_id=message_id, + text=final_text, + parse_mode="HTML", + disable_web_page_preview=True # Отключаем предпросмотр ссылок + ) + logger.info(f"Текст успешно отредактирован для события {event_data['number']}") + except TimedOut as e: + logger.error(f"ТАЙМАУТ при редактировании текста для события номер {event_data['number']}") + logger.error(f"Полная диагностическая информация об ошибке TimedOut:") + logger.error(f" Тип ошибки: {type(e).__name__}") + logger.error(f" Сообщение: {str(e)}") + logger.error(f" Все атрибуты ошибки: {vars(e)}") + logger.error(f" Полное представление: {repr(e)}") + logger.error(f" Параметры запроса:") + logger.error(f" chat_id: {CHANNEL_ID}") + logger.error(f" message_id: {message_id}") + logger.error(f" text_length: {len(final_text)}") + logger.error(f" parse_mode: HTML") + raise + else: + try: await bot.edit_message_text( chat_id=CHANNEL_ID, message_id=message_id, @@ -204,14 +300,20 @@ async def tg_post_event(bot, event_data): parse_mode="HTML", disable_web_page_preview=True # Отключаем предпросмотр ссылок ) - else: - await bot.edit_message_text( - chat_id=CHANNEL_ID, - message_id=message_id, - text=final_text, - parse_mode="HTML", - disable_web_page_preview=True # Отключаем предпросмотр ссылок - ) + logger.info(f"Текст успешно отредактирован для события {event_data['number']}") + except TimedOut as e: + logger.error(f"ТАЙМАУТ при редактировании текста для события номер {event_data['number']}") + logger.error(f"Полная диагностическая информация об ошибке TimedOut:") + logger.error(f" Тип ошибки: {type(e).__name__}") + logger.error(f" Сообщение: {str(e)}") + logger.error(f" Все атрибуты ошибки: {vars(e)}") + logger.error(f" Полное представление: {repr(e)}") + logger.error(f" Параметры запроса:") + logger.error(f" chat_id: {CHANNEL_ID}") + logger.error(f" message_id: {message_id}") + logger.error(f" text_length: {len(final_text)}") + logger.error(f" parse_mode: HTML") + raise return message_id # Возвращаем только message_id @@ -225,6 +327,20 @@ async def tg_post_event(bot, event_data): logger.error(f" Все атрибуты ошибки: {vars(e)}") logger.error(f" Полное представление: {repr(e)}") raise # Пробрасываем исключение выше для обработки на уровне цикла + except TimedOut as e: + logger.error(f"ТАЙМАУТ при публикации события номер {event_data['number']}") + logger.error(f"Полная диагностическая информация об ошибке TimedOut:") + logger.error(f" Тип ошибки: {type(e).__name__}") + logger.error(f" Сообщение: {str(e)}") + logger.error(f" Все атрибуты ошибки: {vars(e)}") + logger.error(f" Полное представление: {repr(e)}") + logger.error(f" Контекст события:") + logger.error(f" number: {event_data.get('number')}") + logger.error(f" has_image: {bool(event_data.get('about_social_picture'))}") + logger.error(f" image_url_length: {len(event_data.get('about_social_picture', '') or '')}") + logger.error(f" initial_text_length: {len(initial_text) if 'initial_text' in locals() else 'N/A'}") + logger.error(f" final_text_length: {len(final_text) if 'final_text' in locals() else 'N/A'}") + return None except TelegramError as e: logger.error(f"Ошибка Telegram при публикации события номер {event_data['number']}: {e}") logger.error(f"Полная информация об ошибке Telegram для события {event_data['number']}:")