Бесплатный инструмент
Форматирование текста в Telegram, экранирование уже сделано
В сообщении есть цена, дефис и точка, а Bot API отвечает "can't parse entities". MarkdownV2 резервирует 18 символов, и в обычной фразе их обычно четыре или пять. Напишите сообщение здесь, выберите жирный, спойлер или блок кода и скопируйте вывод, где каждый такой символ уже экранирован.
Напишите сообщение
Выделите текст и примените стиль или наберите теги сами. Поле работает в HTML-синтаксисе Telegram, так что то, что вы правите, уже годится для одного из двух выводов. Предпросмотр это картинка сообщения, а не кнопка отправки: отсюда ничего не уходит из браузера.
Символов 198 из 4096
Больше 4096 символов. Telegram не примет это как одно сообщение, разбейте его или вынесите длинную часть в файл.
Telegram считает видимые символы, так что разметка ничего не стоит. Сущности и теги форматирования в лимит не входят.
Fixed: the CSV import dropped rows ending in a comma.
Reported by three of you on the same day.
Run
npm i -g entergram@2.4 to upgrade.The migration note is boring but mandatory.
MarkdownV2
*Release 2\.4 is out\.* Fixed: the CSV import dropped rows ending in a comma\. >Reported by three of you on the same day\. Run `npm i -g entergram@2.4` to upgrade\. The migration note is ||boring but mandatory||\.
Отправляйте с parse_mode=MarkdownV2. В обычном тексте экранирован каждый зарезервированный символ; внутри кода только обратная косая черта и обратный апостроф.
HTML
<b>Release 2.4 is out.</b> Fixed: the CSV import dropped rows ending in a comma. <blockquote>Reported by three of you on the same day.</blockquote> Run <code>npm i -g entergram@2.4</code> to upgrade. The migration note is <tg-spoiler>boring but mandatory</tg-spoiler>.
Отправляйте с parse_mode=HTML. Экранировать нужно меньше, поэтому большинство библиотек берут его по умолчанию.
Синтаксис в обоих parse mode
Telegram принимает три parse mode. Markdown устаревший и поддерживает четыре стиля; MarkdownV2 и HTML поддерживают все десять. В таблице MarkdownV2 и HTML стоят рядом.
| Стиль | MarkdownV2 | HTML |
|---|---|---|
| Жирный | *bold* | <b>bold</b> |
| Курсив | _italic_ | <i>italic</i> |
| Подчёркнутый | __underline__ | <u>underline</u> |
| Зачёркнутый | ~strike~ | <s>strike</s> |
| Спойлер | ||hidden|| | <tg-spoiler>hidden</tg-spoiler> |
| Код в строке | `code` | <code>code</code> |
| Блок кода | ```python code ``` | <pre><code class="language-python">code</code></pre> |
| Цитата | >quoted line | <blockquote>quoted</blockquote> |
| Ссылка в тексте | [text](https://example.com) | <a href="https://example.com">text</a> |
| Кастомный эмодзи |  | <tg-emoji emoji-id="5368324170671202286">👍</tg-emoji> |
Подчёркнутый и курсив нельзя просто вложить друг в друга в MarkdownV2, потому что __ и _ сталкиваются на границе. Когда нужны оба на одном отрезке текста, берите HTML.
Почему MarkdownV2 снова отклоняет ваше сообщение
MarkdownV2 резервирует восемнадцать символов, и вне кодовой сущности перед каждым из них обязана стоять обратная косая черта, даже там, где прочитать его как разметку невозможно. Список такой: _ * [ ] ( ) ~ ` > # + - = | { } . ! и сама обратная косая черта, потому что она и есть символ экранирования.
Два из них и подводят почти всех. Точка завершает большинство предложений. Дефис встречается в датах, диапазонах, флагах и составных словах. В заметке о релизе "Fixed: the 2.4-rc build" три зарезервированных символа на девять слов, и API отклоняет сообщение целиком, а не пропускает текст как есть.
Внутри сущности правила другие, и это вторая частая ошибка. В коде внутри строки и в блоке кода особыми остаются только обратная косая черта и обратный апостроф, так что экранирование остального вставит в ваш код видимые слеши. В скобках ссылки или кастомного эмодзи особыми остаются закрывающая скобка и обратная косая черта. Инструмент выше применяет нужное правило для каждого контекста, и это как раз то, чего не умеет поиск с заменой.
Если всё это не нравится, возьмите HTML. Он экранирует три символа, &, < и >, и вкладывается без двусмысленностей. Единственный довод за MarkdownV2 в том, что он лучше читается в системе контроля версий.
Лимит в 4096 символов считает текст, а не разметку
Текстовое сообщение Telegram вмещает 4096 символов. Форматирование передаётся сущностями рядом с текстом, а не внутри него, поэтому теги, звёздочки и слеши в выводе не считаются. Счётчик выше показывает видимую длину, и именно это число проверяет Telegram.
Рядом есть два лимита, которые стоит знать до того, как писать отправщик. Подпись к медиа вмещает 1024 символа, так что форматированное сообщение, которое само по себе проходит с запасом, будет отклонено, как только вы приложите картинку. Сообщение сверх лимита не обрезается: API возвращает ошибку и не отправляет ничего.
Вопросы
Это работает для постов в каналах и обычных чатов или только для ботов?
Таблица синтаксиса относится ко всему, что отправляется через Bot API или клиентскую библиотеку. Если вы печатаете в Telegram сами, у приложения есть своё меню форматирования и MarkdownV2 вы не увидите вовсе. Этот инструмент для случая, когда отправляет что-то другое и текст нужен уже отформатированным.
Какой parse mode выбрать?
HTML, если нет причин для другого. Он экранирует три символа вместо восемнадцати, предсказуемо вкладывается, а при ошибке обычно показывает видимый тег, а не теряет сообщение. MarkdownV2 лучше читается в исходном файле, и это честный довод в его пользу.
Почему сообщение отправилось, но без форматирования?
Почти всегда не указан parse_mode. Без него Telegram считает текст буквальным, и звёздочки с тегами выводятся как символы. Поставьте parse_mode в MarkdownV2 или HTML при отправке, в зависимости от того, какой вывод вы скопировали.
Можно ли вложить жирный в ссылку или курсив в жирный?
Да, в обоих parse mode, с одним исключением: подчёркнутый вместе с курсивом в MarkdownV2 требует обходного приёма, потому что разделители сталкиваются. Код в строке и блок кода не содержат внутри никаких других стилей ни в одном из режимов.
Что такое ID кастомного эмодзи и где его взять?
Это числовой ID премиум-эмодзи, и его считывают из сообщения, где эмодзи уже есть, а не из публичного каталога. Отправителю нужен Telegram Premium или нужно быть ботом, которому принадлежит набор стикеров. Все остальные увидят запасной символ, который вы обернули.
Загружается ли куда-нибудь то, что я здесь пишу?
Нет. Преобразование идёт в браузере, у страницы нет шага отправки, аккаунта и хранилища. Закрыли вкладку, и сообщения больше нет.
Что дальше
Тоже бесплатно: Telegram Group Finder , Telegram Lead Finder , Free QR Code Generator .
Если форматирование нужно для сообщения, которое вы отправите 200 людям
Экранированный текст это меньшая половина рассылки. Большая половина в том, чтобы отправить её с аккаунта, которому действительно отвечают, выдержать темп, при котором Telegram остаётся спокоен, и собрать ответы где-то кроме телефона. Эту часть берёт на себя Entergram: реальные личные аккаунты Telegram вместо бота, каждый через свой прокси, а ответы приходят в один интерфейс рядом с карточкой контакта.
Посмотреть, как устроены рассылки