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

This commit is contained in:
2025-12-21 15:33:25 +03:00
parent d4770fbbac
commit cd5615779b
+135 -19
View File
@@ -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']}:")