Здравствуйте.
Впервые пишу бота на питоне и появилась такая проблема:
Бот хорошо и быстро отвечает текстом на команду/кнопку, но когда я пытаюсь перейти на какой-то из своих товаров (фото+текст), то появляется задержка на 6-15 секунд. Фото в формате jpg (от 5мб до 10мб), пытался (для теста) конвертировать в webp (вес до 250байт) - ситуация абсолютно не изменилась и бот все также долго выдаёт сообщение, где фото+текст.
Какие есть варианты решения такой проблемы?
# Просмотр товара
@dp.callback_query(F.data.startswith("product_"))
async def show_product_detail(callback: types.CallbackQuery):
try:
product_id = int(callback.data.split("_")[1])
product = products[product_id]
kb = types.InlineKeyboardMarkup(inline_keyboard=[
[
types.InlineKeyboardButton(text="❤️ В избранное", callback_data=f"fav_{product_id}"),
types.InlineKeyboardButton(text=" Купить", callback_data=f"buy_{product_id}")
],
[types.InlineKeyboardButton(text="◀️ Назад", callback_data="back_products")]
])
photo_path = os.path.join(BASE_DIR, "images", product['photo'])
caption = (
f"<b>{product['name']}</b>\n\n"
f" <s>{product['old_price']}₽</s> → {product['price']}₽\n"
f" {product['short_desc']}\n\n"
f"<b>Что ты получишь:</b>\n"
f"{product['details']}"
)
if os.path.exists(photo_path):
try:
await callback.message.answer_photo(
photo=types.FSInputFile(photo_path),
caption=caption,
reply_markup=kb,
parse_mode="HTML"
)
except Exception as e:
logger.error(f"Ошибка при отправке фото: {e}")
await callback.message.answer(
caption + "\n\n⚠️ Не удалось загрузить изображение",
reply_markup=kb,
parse_mode="HTML"
)
else:
logger.error(f"Файл не найден: {photo_path}")
await callback.message.answer(
caption + "\n\n⚠️ Изображение временно недоступно",
reply_markup=kb,
parse_mode="HTML"
)
await callback.answer()
except TelegramRetryAfter as e:
await asyncio.sleep(e.retry_after)
return await show_product_detail(callback)
except Exception as e:
logger.error(f"Error in show_product_detail: {e}")
await callback.answer("Произошла ошибка, попробуйте позже")
# Просмотр услуги
@dp.callback_query(F.data.startswith("service_"))
async def show_service_detail(callback: types.CallbackQuery):
try:
service_id = int(callback.data.split("_")[1])
service = services[service_id]
kb = types.InlineKeyboardMarkup(inline_keyboard=[
[types.InlineKeyboardButton(text="✍️ Заказать", callback_data=f"order_{service_id}")],
[types.InlineKeyboardButton(text="◀️ Назад", callback_data="back_services")]
])
caption = (
f"<b>{service['name']}</b>\n\n"
f" <s>{service['old_price']}₽/1k</s> → {service['price_per_1k']}₽/1k\n"
f" {service['short_desc']}\n"
f" Минимум: {service['min_symbols']} симв.\n\n"
f"<b>Что ты получишь:</b>\n"
f"{service['details']}"
)
photo_path = os.path.join(BASE_DIR, "images", service['photo'])
if os.path.exists(photo_path):
try:
await callback.message.answer_photo(
photo=types.FSInputFile(photo_path),
caption=caption,
reply_markup=kb,
parse_mode="HTML"
)
except Exception as e:
logger.error(f"Ошибка при отправке фото: {e}")
await callback.message.answer(
caption + "\n\n⚠️ Не удалось загрузить изображение",
reply_markup=kb,
parse_mode="HTML"
)
else:
logger.error(f"Файл не найден: {photo_path}")
await callback.message.answer(
caption + "\n\n⚠️ Изображение временно недоступно",
reply_markup=kb,
parse_mode="HTML"
)
await callback.answer()
except TelegramRetryAfter as e:
await asyncio.sleep(e.retry_after)
return await show_service_detail(callback)
except Exception as e:
logger.error(f"Error in show_service_detail: {e}")
await callback.answer("Произошла ошибка, попробуйте позже")