Действительно богатые сообщения в Telegram-ботах: разбираем Rich Messages

от автора

Всем привет!

Очень долгое время разработчики Telegram-ботов довольствовались двумя способами форматирования сообщений: HTML и Markdown. Оба этих способа делали одно и то же: добавляли простое форматирование в обычный текст.

Например, можно было сделать: <b>Жирный текст</b> в HTML или Жирный текст в Markdown

Помимо этого, были курсив, подчеркивание, зачеркивание, код, ссылки и спойлеры:

<i>Курсив</i> или Курсив <u>Подчеркнутый текст</u> или Подчеркнутый текст <s>Зачеркнутый текст</s> или ~Зачеркнутый текст~ <code>print("Какой-то код")</code> или print("какой-то код") и так далее.

Для большинства задач этого было достаточно, но в какой-то момент обычного HTML и Markdown может не хватать.

Специально для статьи я опубликовал бота с Preview Rich Messages. Помимо того, что вы сможете увидеть как выглядит само сообщение, бот отправит и его HTML-шаблон (зачем нужен шаблон — узнаете дальше по статье) https://t.me/amvera_rich_messages_preview_bot

Визуализация возможностей Rich Messages

Визуализация возможностей Rich Messages

Например (что является очень частым сценарием), если ваш бот — нейро-ассистент, который привык присылать сложные сообщения с математическими формулами, вложениями, списками, таблицами и тому подобное.

В недавнем обновлении Telegram Bot API 10.1 эту проблему решили!

Что нового в Bot API 10.1

В Bot API 10.1 Telegram добавил Rich Messages. Если коротко, это новый формат сообщений, который позволяет отправлять более сложную структуру: заголовки, таблицы, списки, раскрывающиеся блоки, цитаты, формулы и даже медиа-вложения практически в любом месте сообщения!

Грубо говоря, сейчас вы можете отправлять сообщение, которое больше похоже на небольшой документ.

Классы и методы

Обычный sendMessage никуда не делся и можно сказать не модифицировался. С Rich Messages все более уникально: для него есть отдельные методы и классы.

  • InputRichMessage — rich-сообщение, которое бот отправляет;

  • RichMessage — rich-сообщение, которое бот получает;

  • sendRichMessage — метод для отправки rich-сообщения;

  • sendRichMessageDraft — метод для отправки черновика (ниже разберем);

  • rich_message в объекте Message;

  • rich_message в editMessageText;

  • отдельные rich-блоки и тексты.

Примерно так теперь может выглядеть обычное сообщение от бота:

Пример отображения сообщения от бота

Пример отображения сообщения от бота

В коде же это выглядит примерно так (показано на примере aiogram>=3.29.1):

import asyncioimport osfrom aiogram import Bot, Dispatcherfrom aiogram.filters import Command, CommandStartfrom aiogram.types import Messagefrom aiogram.types.input_rich_message import InputRichMessageBOT_TOKEN = os.getenv("BOT_TOKEN")dp = Dispatcher()### Изначально Rich Messages должен быть в формате HTMLORDER_RICH_HTML = """<h1>Заказ #1842</h1><p>  Статус: <mark>готов к выдаче</mark></p><table bordered striped>  <caption>Состав заказа</caption>  <tr>    <th>Позиция</th>    <th>Кол-во</th>    <th>Сумма</th>  </tr>  <tr>    <td>Пицца Маргарита</td>    <td>2</td>    <td>1200 ₽</td>  </tr>  <tr>    <td>Кола</td>    <td>1</td>    <td>150 ₽</td>  </tr></table><details>  <summary>Что дальше?</summary>  <p>    Курьер заберет заказ после подтверждения.    Если адрес изменился, лучше написать в поддержку до передачи заказа.  </p></details>"""@dp.message(CommandStart())async def start_handler(message: Message):    # Берем текст в формате HTML как Rich Message     rich_message = InputRichMessage(html=ORDER_RICH_HTML)     # И отправляем его через answer_rich    await message.answer_rich(rich_message=rich_message)async def main():    bot = Bot(token=BOT_TOKEN)    await dp.start_polling(bot)if __name__ == "__main__":    asyncio.run(main())

Что еще может быть в Rich Messages

На примере выше мы использовали заголовок, таблицу и раскрывающийся блок, но на этом возможности Rich Messages не заканчиваются:

  • Заголовки;

  • Списки;

  • Таблицы;

  • Цитаты;

  • Формулы;

  • Footnotes (сноски);

  • Медиа-блоки внутри сообщения;

  • Коллажи;

  • Слайдшоу;

  • Карты.

Все это вы можете увидеть в специальном Preview боте, который я подготовил для статьи: https://t.me/amvera_rich_messages_preview_bot

Возможности демо-бота

Возможности демо-бота

Я решил, что дополнительно будет полезно присылать HTML-шаблоны отправленных сообщений. Так вы можете просто скопировать нужную вам часть и использовать ее в своем коде.

Черновики для AI-ботов

Как я уже писал выше, в обновлении добавили черновики — sendRichMessageDraft.

Он нужен не для обычной отправки сообщения, а для временного черновика. Например, если бот генерирует длинное сообщение LLM, можно показывать пользователю временный результат в реальном времени.

Черновик является временным превью примерно на 30 секунд. Когда финальный ответ будет готов, его все равно нужно будет отправить обычным sendRichMessage.

Ограничения

И хочется немного сказать про ограничения этого метода.

Для обычного бота этих лимитов будет более чем достаточно:

  1. Rich Messages поддерживает до 32768 UTF-8 символов;

  2. До 500 блоков;

  3. До 16 уровней вложенности;

  4. До 50 медиа-вложений;

  5. До 20 колонок в таблице.

Вся информация взята с документации

Итог

В этой статье я постарался показать, что такое Rich Messages и как их можно использовать в своем боте. Эта статья больше обзорная, но если вы захотите разработать своего бота с Rich Messages, надеюсь, она вам поможет.

ссылка на оригинал статьи https://habr.com/ru/articles/1055670/