Объект NewMessageBody, которым MAX Bot API описывает текст сообщения, поддерживает два способа форматирования — Markdown и HTML. Четыре пары тегов в каждом повторяют привычную разметку: курсив, жирный, зачёркнутый, ссылка. А дальше начинаются расхождения: подчёркивание и выделение оформлены синтаксисом, которого в обычном Markdown нет, упоминание пользователя работает через служебную ссылку на несуществующий домен, моноширинный текст теряет переносы строк, а собственная таблица документации трижды повторяет один и тот же HTML-тег там, где должны стоять разные уровни заголовков. Разобрали таблицу построчно.
Markdown или HTML — выбор за полем format
Текст нового сообщения, ответа на callback-кнопку или отредактированного поста бот передаёт одним и тем же объектом — NewMessageBody. У него есть поле text (до 4000 символов) и необязательное поле format, у которого всего два допустимых значения: "markdown" и "html". Документация формулирует это так:
Текст сообщения в чат-боте можно улучшить с помощью базового форматирования.
Раздел «Форматирование», dev.max.ruПро само поле format объект NewMessageBody говорит отдельно:
Если установлен, текст сообщения будет форматирован данным способом.
Объект NewMessageBody, dev.max.ruЕсли поле не заполнить, текст уйдёт как есть — без разбора символов *, _ или тегов. Разметка начинает работать только тогда, когда бот сам объявляет её тип.
Два тега, которых нет в обычном Markdown
Курсив, жирный, зачёркнутый и ссылка в таблице документации выглядят ровно так, как их знает любой, кто хоть раз писал текст в Markdown: *emphasized*, **strong**, ~~strikethrough~~, [Inline URL](https://dev.max.ru/). А дальше платформа переходит на собственный синтаксис. Подчёркнутый текст оформляется парой плюсов: ++underline++. Выделенный — парой галочек: ^^выделенный^^. Ни один из этих двух знаков в обычном Markdown ничего не значит — их придумала сама MAX.
Забавная деталь нашлась не в синтаксисе, а в предпросмотре: чтобы показать, каким выделенный текст станет на вид, страница документации использует не современный <mark> (он приберёжен для HTML-режима), а тег <font color="red"> — тот самый, который спецификация HTML давно считает устаревшим.
<ins> или <u>, выделение — тегом <mark>. Но выбор формата — один на всё сообщение: смешать Markdown-плюсы и HTML-теги в одном тексте нельзя.Упоминание — это ссылка на несуществующий домен
Упомянуть пользователя в тексте бот тоже не может напрямую именем или числовым id в отдельном поле — только оформив обычную ссылку с необычным адресом. В Markdown это выглядит так: [Имя Фамилия](max://user/user_id), в HTML — так: <a href="max://user/user_id">Имя Фамилия</a>. Схема max:// не открывается в браузере — это служебный адрес, который понимает только сама платформа, а держит его та же синтаксическая конструкция, что и обычная ссылка на сайт.
Имя тоже нельзя взять произвольным — документация уточняет:
Вместо User mention указывайте полное имя пользователя из профиля в MAX, в том числе фамилию. Если фамилия отсутствует — только имя.
Раздел «Форматирование», dev.max.ruМоноширинный текст теряет переносы строк
Моноширинный текст в Markdown оформляется обратными кавычками — `code`. Обычно такой блок в текстовых форматах существует именно затем, чтобы сохранить исходные отступы и переносы: код, таблицы, вывод консоли. У MAX это правило перевёрнуто — рядом с тегом документация оставляет предупреждение:
Переводы строк внутри этого блока обрабатываются как пробелы.
Раздел «Форматирование», dev.max.ruТо есть многострочный фрагмент кода, вставленный в моноширинный блок бота, на экране получателя схлопнется в одну строку. Для многострочных примеров в сообщении бота такой тег не подходит вовсе — разбивать их приходится обычным текстом.
Опечатка выдаёт себя: шесть уровней, а тег один
В Markdown заголовок — это одна решётка: # заголовок. В HTML-режиме документация обещает выбор из шести уровней — <h1>…<h6>, как в обычном HTML. Но в самой таблице вместо шести разных тегов перечислены только четыре, а два места заняты повтором:
<h1>, <h2>, <h3>, <h4>, <h1>, <h1>
Раздел «Форматирование», dev.max.ru — тег h1 указан вместо h5 и h6Заметить опечатку в интерфейсе бота невозможно в принципе — документация тут же поясняет почему:
Теги всех уровней отображаются одинаково.
Раздел «Форматирование», dev.max.ruРаз все шесть уровней визуально неотличимы друг от друга, ошибка в перечне тегов не влияет ни на одного бота — она осталась бы незамеченной и в тексте этой самой таблицы, если бы её не читать посимвольно.
Кто на самом деле пользуется разметкой
Объектом NewMessageBody пользуются три метода API: отправка нового сообщения POST /messages, редактирование PUT /messages и ответ на callback-кнопку POST /answers. Но раздел про форматирование текста на страницах самих методов прямо раскрывают только две — POST и PUT /messages; страница POST /answers лишь ссылается на объект NewMessageBody, не пересказывая его поля.
Пользовательской справки MAX это не касается вовсе: ни слова «Markdown», ни слова «подчёркнутый» в её 192 статьях нет — она рассказывает о переписке, а не о том, как боты собирают текст. Вся разметка целиком — забота стороны, которая пишет код бота, будь то библиотека на Go или любая другая, независимо от того, как именно бот был создан.
Частые вопросы
Можно ли смешать Markdown и HTML в одном сообщении бота?
Нет. Поле format у объекта NewMessageBody принимает одно значение на всё сообщение — либо markdown, либо html. Смешать теги двух форматов в одном тексте нельзя, разбирается только выбранный.
Как подчеркнуть текст в сообщении бота MAX?
В Markdown — обернуть фрагмент двумя плюсами: ++текст++. В HTML — тегом <ins> или <u>. Обычный Markdown символа ++ для подчёркивания не знает — это добавила сама платформа.
Как боту упомянуть пользователя по имени?
Оформить ссылку со служебным адресом max://user/user_id вместо обычного URL: в Markdown — [Имя Фамилия](max://user/user_id), в HTML — <a href="max://user/user_id">. Имя нужно указывать полностью, с фамилией, если она есть в профиле.
Сохранятся ли переносы строк в моноширинном тексте бота?
Нет. Документация прямо предупреждает: переводы строк внутри блока `code` обрабатываются как пробелы, и многострочный фрагмент отобразится одной строкой.
Развиваете канал или бота в MAX?
Добавьте его в каталог MaxOfficial — читатели находят каналы через поиск и подборки, а статистика копится автоматически.
Добавить канал в каталог







