Перейти к содержимому
MAX

Как публиковать посты в канал MAX через Bot API: шесть мест, где пост ломается молча

Марина Погодина11 минут
Crumpled printed message with torn edges. Надпись: «Пост в MAX сломался молча», ниже — API вернул 200, разметка исчезла, картинка ушла отдельно.

Вы написали бота, отправили первый пост в канал MAX, открыли его с телефона и увидели не то, что писали. Ссылка превратилась в простые слова, жирный заголовок остался обычным текстом, а картинка ушла отдельным сообщением, под которым никто не комментирует.

Самое неприятное здесь: API ответил успехом. Telegram в такой же ситуации отказал бы во всём сообщении, и вы бы сразу поняли, что ошиблись. MAX отвечает кодом 200 и тихо публикует испорченный пост, поэтому брак первым замечает читатель.

MAX Bot API это HTTP-интерфейс мессенджера MAX для ботов: пост публикуется обычным POST, токен передаётся заголовком Authorization, ответы приходят в JSON. Ниже шесть мест, где пост в канал ломается молча.

Всё проверено 16.09.2026 по документации MAX для разработчиков и на своём канале: обзоры статей уходят туда ботом, обычные посты приезжают кросспостингом из Telegram.

Четыре последовательных шага публикации в MAX: передать токен заголовком авторизации, собрать текст с разметкой и полем формата, загрузить обложку и дождаться её обработки, отправить одно сообщение с вложениями.
Четыре шага, и на каждом есть место, где пост выходит не таким, каким его писали.

Что нужно до первого запроса: бот, токен и права в канале

Бот создаётся на платформе MAX для партнёров или в мини-приложении "MAX для бизнеса" внутри мессенджера, а создать его может только прошедший проверку резидент России: компания, ИП или самозанятый.

Токен становится доступен после того, как бот пройдёт модерацию, и его сразу кладут в переменную окружения: ключ, попавший в репозиторий, живёт там вечно, даже если вы удалите строку следующим коммитом.

Дальше бота нужно добавить в канал администратором с правом писать посты. Публикация идёт от имени канала, а бот выступает исполнителем, и без этого права запрос вернёт отказ. Отказ здесь честный, в отличие от остального, о чём пойдёт речь дальше.

Второе отличие канала от чата менее очевидное: пост в канал всегда уходит с уведомлением подписчикам. Поле notify, которое это уведомление включает, для канала нужно либо оставить включённым, либо не передавать вовсе. Молчаливых постов в канале не предусмотрено.

Куда слать запрос и как передавать токен

Здесь у MAX произошла смена, и на ней спотыкаются все, кто учился по статьям годичной давности. Токен раньше клали параметром прямо в адрес запроса, и документация теперь прямо говорит, что этот путь больше не поддерживается. Правильно так:

POST /messages?chat_id=[идентификатор канала], заголовки Authorization с токеном и Content-Type со значением application/json

Тело запроса: {"text": "[текст поста]", "format": "html", "attachments": [список вложений]}

Слово Bearer перед токеном ставить не нужно: с ним запрос возвращает 401 и жалобу на испорченный токен. Токен передаётся голым, и это стоит запомнить, потому что привычка писать Bearer приходит из других API.

Базовых адресов у MAX встречается два, и оба отвечают. Прежде чем строить на адресе расписание публикаций, проверьте его простым запросом сведений о боте и вынесите в настройки: адрес поставщика меняется чаще, чем хотелось бы, и зашитый в код он однажды уронит публикацию молча.

Заголовок удобнее адреса ещё и тем, что ключ перестаёт попадать в журналы. Если писать в лог адрес запроса целиком, вместе с ним туда уезжает токен, а журналы хранятся месяцами и попадают в резервные копии. У меня в журнал уходит только причина отказа и код ответа, без адреса.

Разметка включается отдельным полем

MAX принимает разметку в тексте сообщения, но только если в теле запроса стоит поле format со значением html. Без него теги молча остаются без действия, и ссылки в посте превращаются в обычные слова.

У меня в коде стоял комментарий, что MAX работает без разметки. Он был неверным, но выглядел как знание, поэтому я его и не перепроверяла. Поймала случайно, сравнив один и тот же пост в двух каналах: в Telegram ссылка была вшита в слова, а в MAX мой код, поверив комментарию, сам печатал адрес в скобках.

Отдельная ловушка ждёт тех, кто придёт со стороны Telegram и выберет разметку звёздочками. Она в MAX своя: курсив ставится одной звёздочкой, жирный двумя, и сверх привычного есть выделение цветом, которого в Telegram нет вовсе. Смешивать два формата в одном сообщении нельзя, и надёжнее держаться тегов.

Незнакомый тег превращается в буквы посреди поста

Вот та самая грабля, которая обходится дороже всего, потому что не выглядит поломкой. Если отправить тег, которого MAX не знает, сообщение уйдёт успешно. Тег останется в тексте как обычные символы, и читатель увидит угловые скобки посреди абзаца.

Разделение тегов на три группы: MAX понимает жирный, курсив, подчёркивание, зачёркивание, ссылку, заголовки, цитату и выделение цветом; не понимает сворачиваемый текст и эмодзи Telegram; опасен любой другой тег, потому что он печатается в посте как видимые буквы.
Незнакомый тег не отвергается с ошибкой: он остаётся в посте и достаётся читателю.

У меня так чуть не уехало сворачивание длинного текста, которое отлично работает в Telegram и в MAX не существует. Спасла своя проверка перед отправкой: она сверяет теги готового текста со списком поддерживаемых и отказывается публиковать пост с чужим тегом.

Занимает такая проверка 8 строк, а ловит тот класс ошибок, который вы иначе увидите последним, глазами подписчика.

Сверяться со списком стоит перед каждым новым приёмом оформления, а заодно перед тем, как поверить цифрам из чужих статей. Пример: про кнопки пишут, что в ряду их помещается 7, и это правда для обычных кнопок. У кнопки-ссылки, которую чаще всего и ставят под постом, предел втрое меньше: 3 в ряду.

Обложка готова не в тот момент, когда загрузилась

Картинка грузится в два приёма: сначала вы просите у MAX адрес для загрузки, потом отправляете туда файл и получаете обратно токен картинки, которым её прикладывают к сообщению.

Дальше начинается интересное. Если отправить сообщение сразу после загрузки, MAX отвечает отказом вида attachment.not.ready: файл принят, обработка продолжается. На маленьких картинках это ловится через раз, на тяжёлых обложках воспроизводится стабильно.

Лечится повтором с паузой. У меня 4 попытки, между ними ожидание в 2, 4 и 8 секунд, и этого хватает даже для тяжёлых файлов. Важно отличать этот отказ от настоящей ошибки: повторять вслепую любой сбой нельзя, потому что дубль в канале увидят подписчики раньше, чем вы успеете его убрать.

И ещё одно, что экономит место в хранилище: загруженную картинку стоит запоминать её токеном. Повторная загрузка того же файла создаёт в MAX новую копию, и документация сама советует загружать часто используемые файлы заранее и переиспользовать токен.

Пределов длины два, и мешает обычно не тот, о котором думают

Собственный предел MAX равен 4000 знаков. Это заметно больше подписи под картинкой в Telegram, поэтому в MAX длинный пост спокойно уходит одним сообщением вместе с обложкой.

Две чаши весов: слева пост, укладывающийся в порог 1024 знака, приезжает в Telegram одним сообщением с подписью под картинкой; справа пост длиннее порога приезжает двумя сообщениями, и комментарии делятся между ними.
Telegram меряет подпись по видимому тексту, а переносчики часто по строке с тегами, и порог наступает раньше.

Ловушка появляется, когда канал в MAX связан с каналом в Telegram кросспостингом. Пост уходит в MAX одним сообщением, а приезжает в Telegram двумя: картинка отдельно, текст отдельно. Причина в том, что при переносе текст кладут подписью к картинке, а подпись там ограничена 1024 знаками.

Дальше начинается тонкость, из-за которой расчёты не сходятся. Сам Telegram меряет подпись по видимому тексту, и разметка в его счёт не идёт. А переносчики между площадками часто считают проще: берут строку целиком, вместе с тегами. Мой считает именно так, и порог наступает раньше, чем ожидаешь.

Разница заметная: одна ссылка, оформленная тегом, добавляет около 100 знаков, которых в посте не видно вовсе. Мой анонс с 1011 видимыми знаками имел 1120 знаков сырой строки и разъехался на два сообщения, хотя по правилу самого Telegram должен был уложиться в одно. Способы переноса я разбирала в статье про автопостинг в MAX.

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

Как приложить кнопку под пост

Кнопка в MAX передаётся вложением особого вида и кладётся в тот же список, что и картинка. Сначала в список попадает обложка, следом клавиатура с кнопками, и всё уходит одним сообщением, отдельного поля под кнопки в запросе нет.

Типов кнопок несколько, и для канала обычно нужен один: кнопка-ссылка. У неё, как сказано выше, предел 3 в ряду. Остальные типы, вроде запроса контакта или геопозиции, в канале смысла не имеют, они рассчитаны на диалог.

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

Пост можно поправить, но не так, как вы ожидаете

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

Поле format обязательно и здесь: без него запрос вернёт успех, а ссылки в обновлённом тексте молча превратятся в слова. Пост будет считаться исправленным, просто уже без ссылок. Это тот же молчаливый отказ, что и при первой публикации, и ловится он так же плохо.

Со вложениями правило тонкое и стоит того, чтобы его запомнить. По документации, если не передать список вложений вовсе, обложка и кнопка остаются на месте, а пустой список снимает все вложения разом.

Запросы отличаются одним полем, а последствия у них противоположные, поэтому, прежде чем править живой пост, проверьте правило на тестовом: ошибка здесь стоит обложки.

И главное, что делают не сразу: сохраняйте идентификатор отправленного сообщения. Он приходит в ответе на отправку, а без него пост для правки придётся искать среди остальных.

Комментарии через API есть, а опросов нет

Комментариями под постом можно управлять программно: их читают, добавляют, правят и удаляют обычными запросами, и в документации под это есть отдельный раздел. В Telegram такого нет вовсе, там комментарии живут в связанной группе обсуждения, и добраться до них ботом гораздо сложнее.

Автоответы на типовые вопросы под постом, сбор обратной связи и модерация без ручного дежурства делаются штатными средствами. Как это выглядит со стороны читателя, я показывала в разборе про комментарии, кнопки и опросы в MAX.

А вот отправить опрос запросом от бота нечем: такого метода в интерфейсе для ботов нет, сколько его ни искать. Опросы в канале MAX живут в мини-приложениях, то есть во встроенных окнах внутри мессенджера, и собираются там. Про то, как их формулировать, чтобы на них отвечали, у меня есть отдельный разбор.

Чего API не умеет: список, который экономит день

  • Отправить опрос запросом от бота нечем: опросы в канале собираются в мини-приложении внутри мессенджера.
  • Сворачивания длинного текста в MAX нет вовсе, поэтому пост выйдет целиком, каким бы длинным он ни был.
  • Набор эмодзи у мессенджера свой, и теги Telegram для них уедут в пост видимыми буквами.
  • Бесшумно опубликовать в канал не получится: уведомление подписчикам уходит обязательно.
  • Ряд из семи кнопок-ссылок собрать не выйдет, у этого типа предел втрое меньше.

Ограничения выглядят скучно, но именно они экономят время, которое иначе уходит на попытки сделать то, чего в интерфейсе нет вовсе.

Чек-лист перед первой публикацией в канал

  1. Бот добавлен в канал администратором с правом писать посты, и это проверено живой отправкой, потому что галочка в настройках ничего не доказывает.
  2. Токен уходит заголовком Authorization без слова Bearer, а старый способ через адрес запроса из кода убран.
  3. Базовый адрес API проверен запросом сведений о боте и вынесен в настройки.
  4. В теле запроса стоит поле format, и это проверено на посте со ссылкой внутри слов.
  5. Перед отправкой теги сверяются со списком поддерживаемых, и чужой тег останавливает публикацию.
  6. Отказ attachment.not.ready отличается от прочих ошибок и повторяется с растущей паузой.
  7. Длина текста укладывается в 4000 знаков; при кросспостинге в Telegram сырая строка с тегами укладывается в 1024.
  8. Идентификатор отправленного сообщения сохраняется сразу: без него пост для правки потом придётся искать.
  9. У публикации есть ключ, по которому повтор отправки не создаёт второй пост в канале.

Девять пунктов закрывают то, на чём спотыкаются почти все, кто публикует в MAX программно. Список не заменяет чтение документации, но избавляет от поиска, при котором каждый пункт находится своим способом и своей испорченной публикацией.

Если разбираться самостоятельно некогда, я собираю это под ключ: боты, комментарии, кнопки и опросы в MAX. В канале PROMAREN я показываю, что из этого работает на живых каналах, а что оказалось красивой теорией.

Частые вопросы про публикацию в канал MAX

Почему пост опубликовался, но выглядит неправильно?

Почти всегда причина в том, что в запросе не указано поле format или использован тег, которого MAX не знает. В обоих случаях API отвечает успехом, поэтому проверять надо сам пост глазами, желательно с телефона: код ответа тут ничего не доказывает.

Как передаётся токен бота в MAX Bot API?

Заголовком Authorization, без слова Bearer перед значением. Передачу токена параметром в адресе запроса документация больше не поддерживает, хотя старые примеры в сети до сих пор показывают именно её.

Почему пост приехал в Telegram двумя сообщениями?

Потому что при кросспостинге текст кладётся подписью к картинке, а подпись в Telegram ограничена 1024 знаками. Многие переносчики считают этот предел по сырой строке вместе с тегами, поэтому порог наступает раньше, чем показывает видимая длина.

Можно ли отредактировать уже опубликованный пост?

Да, и по времени это не ограничено, в отличие от личной переписки. Главное помнить про поле format, без которого ссылки в обновлённом тексте превратятся в слова, и про то, что пустой список вложений снимает с поста обложку и кнопку.

Можно ли отправить опрос через API?

Нет, отправка опроса ботом в MAX не предусмотрена: опросы в канале живут в мини-приложениях внутри мессенджера. Зато комментариями под постом можно управлять программно, и это закрывает большую часть задач, ради которых обычно заводят опрос.

Что можно проверить прямо сейчас

Откройте последний пост своего канала в MAX с телефона и посмотрите на три вещи: вшита ли ссылка в слова, стоит ли кнопка под постом и пришёл ли текст вместе с картинкой одним сообщением. Если хотя бы одно не так, вы уже знаете, в каком из шести мест искать причину.

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