[ВОЛК] ловим причину таймаута телеграм
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
2025-12-21 15:33:25 +03:00
parent d4770fbbac
commit cd5615779b
+119 -3
View File
@@ -6,7 +6,7 @@ import time
import html import html
from datetime import datetime, timezone, timedelta from datetime import datetime, timezone, timedelta
from telegram import Bot, InlineKeyboardMarkup, InlineKeyboardButton 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 dotenv import load_dotenv
from formatter import get_event_text 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 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: if has_image:
try: 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( message = await bot.send_photo(
chat_id=CHANNEL_ID, chat_id=CHANNEL_ID,
photo=image_url, photo=image_url,
@@ -146,6 +158,20 @@ async def tg_post_event(bot, event_data):
parse_mode="HTML", parse_mode="HTML",
disable_notification=PUBLISH_SILENTLY 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: except TelegramError as e:
logger.warning(f"Не удалось отправить изображение для события номер {event_data['number']}: {e}. Отправляем текстовое сообщение.") logger.warning(f"Не удалось отправить изображение для события номер {event_data['number']}: {e}. Отправляем текстовое сообщение.")
logger.error(f"Полная информация об ошибке Telegram при отправке изображения для события {event_data['number']}:") logger.error(f"Полная информация об ошибке Telegram при отправке изображения для события {event_data['number']}:")
@@ -153,6 +179,8 @@ async def tg_post_event(bot, event_data):
logger.error(f" Сообщение: {str(e)}") logger.error(f" Сообщение: {str(e)}")
logger.error(f" Все атрибуты ошибки: {vars(e)}") logger.error(f" Все атрибуты ошибки: {vars(e)}")
logger.error(f" Полное представление: {repr(e)}") logger.error(f" Полное представление: {repr(e)}")
logger.info(f"Попытка отправки текстового сообщения вместо фото для события {event_data['number']}")
try:
message = await bot.send_message( message = await bot.send_message(
chat_id=CHANNEL_ID, chat_id=CHANNEL_ID,
text=initial_text, text=initial_text,
@@ -160,7 +188,22 @@ async def tg_post_event(bot, event_data):
disable_notification=PUBLISH_SILENTLY, disable_notification=PUBLISH_SILENTLY,
disable_web_page_preview=True # Отключаем предпросмотр ссылок 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: else:
logger.info(f"Попытка отправки текстового сообщения для события {event_data['number']}: chat_id={CHANNEL_ID}, text_length={len(initial_text)}")
try:
message = await bot.send_message( message = await bot.send_message(
chat_id=CHANNEL_ID, chat_id=CHANNEL_ID,
text=initial_text, text=initial_text,
@@ -168,6 +211,19 @@ async def tg_post_event(bot, event_data):
disable_notification=PUBLISH_SILENTLY, disable_notification=PUBLISH_SILENTLY,
disable_web_page_preview=True # Отключаем предпросмотр ссылок 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 сообщения для использования в ссылке подписки # Получаем ID сообщения для использования в ссылке подписки
message_id = message.message_id message_id = message.message_id
@@ -182,6 +238,7 @@ async def tg_post_event(bot, event_data):
await asyncio.sleep(2) await asyncio.sleep(2)
# Редактируем сообщение, добавляя ссылки # Редактируем сообщение, добавляя ссылки
logger.info(f"Попытка редактирования сообщения для события {event_data['number']}: message_id={message_id}, final_text_length={len(final_text)}")
if has_image: if has_image:
try: try:
await bot.edit_message_caption( await bot.edit_message_caption(
@@ -190,6 +247,20 @@ async def tg_post_event(bot, event_data):
caption=final_text, caption=final_text,
parse_mode="HTML" 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: except TelegramError as e:
logger.warning(f"Не удалось отредактировать подпись для события номер {event_data['number']}: {e}. Пробуем отредактировать текстовое сообщение.") logger.warning(f"Не удалось отредактировать подпись для события номер {event_data['number']}: {e}. Пробуем отредактировать текстовое сообщение.")
logger.error(f"Полная информация об ошибке Telegram при редактировании подписи для события {event_data['number']}:") logger.error(f"Полная информация об ошибке Telegram при редактировании подписи для события {event_data['number']}:")
@@ -197,6 +268,8 @@ async def tg_post_event(bot, event_data):
logger.error(f" Сообщение: {str(e)}") logger.error(f" Сообщение: {str(e)}")
logger.error(f" Все атрибуты ошибки: {vars(e)}") logger.error(f" Все атрибуты ошибки: {vars(e)}")
logger.error(f" Полное представление: {repr(e)}") logger.error(f" Полное представление: {repr(e)}")
logger.info(f"Попытка редактирования текста вместо подписи для события {event_data['number']}")
try:
await bot.edit_message_text( await bot.edit_message_text(
chat_id=CHANNEL_ID, chat_id=CHANNEL_ID,
message_id=message_id, message_id=message_id,
@@ -204,7 +277,22 @@ async def tg_post_event(bot, event_data):
parse_mode="HTML", parse_mode="HTML",
disable_web_page_preview=True # Отключаем предпросмотр ссылок 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: else:
try:
await bot.edit_message_text( await bot.edit_message_text(
chat_id=CHANNEL_ID, chat_id=CHANNEL_ID,
message_id=message_id, message_id=message_id,
@@ -212,6 +300,20 @@ async def tg_post_event(bot, event_data):
parse_mode="HTML", parse_mode="HTML",
disable_web_page_preview=True # Отключаем предпросмотр ссылок 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 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" Все атрибуты ошибки: {vars(e)}")
logger.error(f" Полное представление: {repr(e)}") logger.error(f" Полное представление: {repr(e)}")
raise # Пробрасываем исключение выше для обработки на уровне цикла 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: except TelegramError as e:
logger.error(f"Ошибка Telegram при публикации события номер {event_data['number']}: {e}") logger.error(f"Ошибка Telegram при публикации события номер {event_data['number']}: {e}")
logger.error(f"Полная информация об ошибке Telegram для события {event_data['number']}:") logger.error(f"Полная информация об ошибке Telegram для события {event_data['number']}:")