Telegram позволяет форматировать сообщения с помощью ограниченного набора HTML тегов, что значительно расширяет возможности оформления текста без необходимости использования встроенного редактора. В отличие от Markdown, HTML поддерживает более точечное управление стилями, включая жирный, курсив, ссылки и даже встроенные теги для кода.
Для корректного отображения форматирования важно использовать только разрешённые Telegram HTML теги, среди которых <b>, <i>, <u>, <s>, <code>, <pre>, <a>. Любые другие теги будут проигнорированы или вызовут ошибку при отправке. Обязательно следить за корректной вложенностью и закрытием тегов, чтобы избежать искажений в сообщении.
При формировании сообщений с HTML стоит уделить внимание экранированию специальных символов, таких как <, > и &, чтобы не нарушить синтаксис разметки. Также рекомендуется использовать метод sendMessage с параметром parse_mode=»HTML» для правильной интерпретации тега API Telegram.
Какие HTML теги разрешены в Telegram-сообщениях
Telegram поддерживает ограниченное количество HTML-тегов при отправке сообщений через ботов или с использованием Telegram API. Ниже приведён список допустимых тегов и их особенности.
<b>
– делает текст жирным. Эквивалентен тегу<strong>
, но предпочтительнее использовать именно<b>
.<i>
– выделяет текст курсивом. Аналог тега<em>
, но он не поддерживается.<u>
– подчёркивает текст. Один из немногих поддерживаемых тегов форматирования, добавленный позже других.<s>
– зачёркивает текст. Полезен для исправлений или акцентов на изменениях.<code>
– отображает текст моноширинным шрифтом. Используется для однострочных фрагментов кода.<pre>
– блок кода с сохранением отступов и форматирования. Часто используется вместе с<code>
.<a href="URL">
– добавляет ссылку. Поддерживается только если указан атрибутhref
с корректным URL. Внутренние якоря, mailto-ссылки и JavaScript-запросы игнорируются.
Использование любых других HTML-тегов приведёт к игнорированию или удалению этих элементов без предупреждения. Атрибуты, за исключением href
у тега <a>
, не поддерживаются. Вложенность тегов допустима, но не всегда корректно обрабатывается, особенно при сложной структуре.
Для надёжной разметки используйте только перечисленные теги, предварительно проверяя результат через parse_mode=HTML
. Это гарантирует корректное отображение сообщения у всех получателей.
Особенности форматирования текста с помощью HTML в Telegram
Telegram поддерживает ограниченный набор HTML-тегов для форматирования сообщений через ботов и при отправке сообщений с использованием Telegram API. Ключевые теги: <b>
(жирный), <i>
(курсив), <u>
(подчёркнутый), <s>
(зачёркнутый), <code>
(моноширинный текст), <pre>
(блок кода), <a href="">
(гиперссылка).
Теги должны быть правильно вложены. Неверное вложение приведёт к ошибке при отправке или игнорированию форматирования. Например, конструкция <b><i>Текст</b></i>
вызовет ошибку. Корректный вариант: <b><i>Текст</i></b>
.
Telegram автоматически удаляет небезопасные атрибуты и теги, такие как <script>
, <style>
, <iframe>
, поэтому попытки внедрения произвольного HTML не имеют смысла. Также не поддерживаются вложенные теги внутри <code>
и <pre>
.
Для вставки ссылок допустим только тег <a>
с обязательным атрибутом href
. Ссылки без текста отображаются некорректно или не принимаются API. Пример допустимого варианта: <a href="https://example.com">Перейти</a>
.
Нельзя использовать HTML для вставки изображений или изменения цвета текста. Telegram игнорирует такие попытки даже при корректной HTML-разметке.
Объём форматируемого текста ограничен: общий размер HTML-разметки (включая теги) не должен превышать 4096 символов. Нарушение этого ограничения приведёт к ошибке API.
В <pre>
можно указывать язык программирования через атрибут language
, например: <pre language="python">print("Hello")</pre>
. Это влияет на подсветку синтаксиса в Telegram Desktop и Web, но не поддерживается в мобильных клиентах.
Как правильно использовать тег <a> для ссылок в сообщениях
Telegram поддерживает тег <a> только в режиме HTML при отправке сообщений через ботов или через API. В обычных пользовательских сообщениях данный тег не работает. Чтобы ссылка была активной, необходимо задать как минимум два атрибута: href
и содержимое тега.
Пример корректного использования: <a href="https://example.com">Открыть сайт</a>
. Такая запись отобразит кликабельный текст «Открыть сайт», ведущий на указанный URL. Нельзя использовать вложенные теги внутри <a>, Telegram их игнорирует.
Ссылки должны начинаться с http://
или https://
, иначе они будут проигнорированы. Протокол tg://
также поддерживается для внутренних переходов внутри Telegram (например, tg://resolve?domain=channelname
).
Атрибуты target
, rel
и другие – не поддерживаются. Весь тег должен быть валиден и корректно экранирован, особенно если сообщение отправляется через JSON. Например, внутри JSON необходимо использовать двойное экранирование: "<a href=\\\"https://example.com\\\">ссылка</a>"
.
Максимально допустимая длина одного HTML-сообщения – 4096 символов. Учитывайте это при генерации ссылок, особенно если они содержат параметры или UTM-метки. Старайтесь избегать слишком длинных URL, чтобы не выйти за лимит.
Ссылки в <a> не маскируются Telegram автоматически. Убедитесь, что текст ссылки соответствует содержанию, чтобы избежать блокировок из-за подозрительной активности.
Ограничения на вложенность HTML тегов в Telegram
Telegram поддерживает ограниченное подмножество HTML-тегов в форматировании сообщений через ботов и при использовании Telegram API. При этом вложенность тегов строго ограничена. Попытка вложить один допустимый тег в другой может привести к игнорированию форматирования или удалению вложенного содержимого.
Нельзя вкладывать теги <em> и <strong> друг в друга. Например, <strong>жирный и <em>курсив</em></strong>
не отобразится корректно. Telegram применит только внешнее форматирование или проигнорирует вложенное.
Тег <a>
не допускает вложенных форматирующих тегов. Конструкция вида <a href="..."><strong>ссылка</strong></a>
не будет обработана – ссылка останется обычным текстом без форматирования.
Вложенность одинаковых тегов, например <strong><strong>текст</strong></strong>
, также не поддерживается и приводит к ошибке разбора.
Рекомендация: Используйте простые конструкции без вложенности. Каждый HTML-тег должен быть самостоятельным и не включать другие теги внутри себя. Это гарантирует корректное отображение форматирования на всех клиентах Telegram.
Примеры безопасного использования HTML для выделения текста
В Telegram допустимо использование ограниченного набора HTML-тегов. Неправильное или избыточное форматирование может привести к игнорированию разметки или некорректному отображению сообщения. Ниже приведены конкретные примеры корректного и безопасного применения HTML-тегов для выделения текста:
- Жирное выделение: тег
<b>
применим для акцента на ключевых словах. Пример:<b>Внимание:</b> Срок до 25 мая
. - Курсив: используйте тег
<i>
для подчёркивания дополнительных деталей. Пример:<i>Только для новых пользователей</i>
. Моноширинный текст:
применяется тег<code>
. Полезно для отображения команд или параметров. Пример:<code>/start</code>
.- Подчёркивание: тег
<u>
разрешён, но используйте его умеренно, чтобы не перегружать сообщение. Пример:<u>Важно: не закрывайте приложение</u>
.
Не используйте вложенные теги одного типа (например, <b><b>текст</b></b>
) – Telegram их игнорирует. Избегайте тегов, не входящих в белый список (например, <div>
, <span>
, <a>
с href).
Для совместимости проверяйте сообщение в тестовом чате перед публикацией. Также учитывайте, что HTML-теги обрабатываются только при использовании метода sendMessage
с параметром parse_mode=HTML
.
Как обрабатывать ошибки при некорректном HTML в Telegram-сообщениях
Telegram Bot API принимает ограниченное подмножество HTML-тегов, таких как <b>, <i>, <a>, <code>, <pre> и некоторых других. Использование неподдерживаемых или некорректно вложенных тегов приводит к ошибке 400: Bad Request с сообщением «Can’t parse entities».
Для обработки таких ошибок необходимо реализовать валидацию HTML до отправки сообщения. Не полагайтесь на try-catch без предварительной проверки – это замедлит выполнение и не гарантирует предсказуемость.
Рекомендуется использовать специализированные библиотеки для парсинга и очистки HTML. Например, в Python – BeautifulSoup с фильтрацией по whitelist тегов. Пример фильтра:
allowed_tags = {'b', 'i', 'a', 'code', 'pre'}
cleaned_html = ''.join(str(tag) for tag in soup.find_all() if tag.name in allowed_tags)
Обязательно проверяйте наличие обязательных атрибутов. Для тега <a> должен быть задан атрибут href. Telegram отклонит тег без него.
Также важно экранировать символы <, > и & в тексте, не заключённом в теги. Используйте html.escape() или аналогичный метод в выбранном языке.
Если вы отправляете HTML-сообщения динамически, обязательно добавляйте логирование оригинального текста и ошибки Telegram. Это ускорит отладку. Пример сообщения об ошибке:
logging.error(f"Telegram HTML error: {e}. Message: {message_text}")
Наконец, при наличии пользовательского ввода – всегда фильтруйте и валидируйте его. Никогда не вставляйте сырой HTML напрямую в сообщение.
Инструменты и библиотеки для генерации HTML-сообщений в Telegram-ботах
Telegram поддерживает ограниченное подмножество HTML-тегов в сообщениях ботов, и для их генерации важно использовать инструменты, обеспечивающие корректную валидацию и экранирование. Ниже представлены наиболее эффективные библиотеки и подходы, позволяющие управлять HTML-форматированием сообщений.
1. Python: библиотека Telebot (pyTelegramBotAPI)
В Telebot достаточно передать параметр parse_mode="HTML"
при отправке сообщений:
bot.send_message(chat_id, '<b>Жирный текст</b>', parse_mode="HTML")
Для автоматизации генерации можно использовать встроенные шаблоны Python (например, string.Template
или Jinja2
) и комбинировать их с фильтрами экранирования.
2. Node.js: Telegraf
В Telegraf также применяется parse_mode: 'HTML'
при вызове метода ctx.reply
. Для генерации HTML рекомендуются шаблонизаторы ejs
или nunjucks
с предварительной очисткой данных от неэкранированных символов:
ctx.reply('<i>Курс обновлён</i>', { parse_mode: 'HTML' })
3. PHP: библиотека php-telegram-bot
Поддерживает HTML с автоматической валидацией. Для безопасной генерации HTML используйте встроенные средства фильтрации (htmlspecialchars
) и шаблоны через sprintf
или Twig
:
$telegram->sendMessage(['chat_id' => $chat_id, 'text' => '<code>Инструкция</code>', 'parse_mode' => 'HTML']);
4. Универсальные утилиты для генерации HTML
html-escape | Мини-библиотека для экранирования HTML-символов (доступна в Python, Node.js и других языках). |
Jinja2 (Python) | Позволяет безопасно вставлять переменные в HTML-шаблоны и автоматически экранирует нежелательные теги. |
nunjucks (Node.js) | Рендерит шаблоны с поддержкой безопасной вставки HTML, аналогично Jinja2. |
Twig (PHP) | Контролирует доступные HTML-теги и исключает XSS-риски. |
Telegram поддерживает только следующие HTML-теги: <b>
, <strong>
, <i>
, <em>
, <u>
, <s>
, <del>
, <span class="tg-spoiler">
, <a href>
, <code>
, <pre>
. Все остальные теги будут проигнорированы. При формировании сообщений необходимо учитывать эти ограничения, чтобы избежать ошибок парсинга или потери форматирования.