Markdown Telegram Bot: как используют разметку

HTML *Смартфоны Социальные сети и сообщества Типографика * Ожидает приглашения

Небольшой обзор того, как работает разметка в telegram, как в нем стилизовать текст при помощи markdown и html.

image

Сразу оговорюсь: в интернете множество статей про то, как делать отложенные посты, добавлять к ним кнопки и оформлять их с помощью @controllerbot и аналогов. Эта статья совсем о другом.

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

image
стилизация с помощью контекстного меню

В конце статьи также приведен список горячих клавиш.

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

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

Markdown в телеграм

Итак, заходим на официальный сайт телеграм, идем в стилизацию текста и видим поддерживаемую разметку:

стилизация с официального сайта telegram.org

Однако, если просто вставить всю указанную markdown разметку в телеграм, то мы получим следующее:

Не работает курсивное начертание. Вероятно, в telegram давно не обновляли эту страницу и некоторые правила поменялись, а некоторые добавились. В стандартной разметке markdown действительно для курсива используется одна “звездочка”, однако, в телеграм работает двойное подчеркивание. А с помощью || можно сделать скрытый текст, который появился относительно недавно. И вот мы получаем полный список полноценно работающих “команд”:

**сам ты жирный** __курсив__ `код` ~~перечеркнутый~~ ```блок кода``` ||скрытый текст||

Но что со ссылками? Ссылки в разметке markdown выглядят вот так:

(ссылка)[https://smth.com]

Однако, по умолчанию они не работают (только в telegram x для android)

На официальном сайте указан инлайн-бот @bold – с помощью него можно вдохнуть жизнь в ссылку, однако, при этом, бот оставит свой след на нашем сообщении:

пример использования @bold

Можно использовать его и для оформления текста, чтобы потом скопировать и отправить куда нам нужно уже без подписи бота.

В этом боте работает свой вариант markdown:

Все-таки для ссылки я бы использовал контекстное меню или горячие клавиши – это гораздо удобнее.

Как там HTML?

В целом, html-разметка тоже работает, но уже с другим инлайн-ботом. Нужно всего лишь написать:

@Sean_bot html

И далее нужный нам текст с поддерживаемыми html-тегами. Вот их полный список:

@Sean_Bot html Сам жирный Курсив код перечеркнутый подчеркнутый код Сайт

Этот бот работает с markdown, точно также как @bold, нужно лишь добавить “md”:

Горячие клавиши

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

Для windows:

Чтобы делать красивые публикации в мессенджерах, важно знать, как выделить текст, вставить ссылку, маркированные списки. В Telegram text formatting проводится с помощью Markdown. Редактор предназначен для удобного и аккуратного планирования постов при ведении канала.

Содержание

Что такое Markdown

Чтобы задавать правильную форму заметке, не нужно использовать программы Word или Pages, занимающие много места. Существуют удобные и компактные редакторы, которые применяются при написании текстов в обычных документах формата TXT. К ним относится Маркдаун.

Это язык текстовой разметки, разработанный Джоном Грубером, который занимается писательской деятель-ностью, ведет собственный блог.

MarkdownTelegram разметка позволяет сделать таблицу, вставить ссылку или цитаты, выделить текст жирным или курсивом.

Markdown.

Этот вопрос актуальный для многих писателей, блогеров, журналистов. Чтобы писать облегченным языком програм-мирования, требуется изучить, какие символы за что отвечают.

Примеры использования

Сфера применения разметки:

  • Организация заметок. «Маркдаун» на Desktop сумеет заменить Evernote, OneNote.
  • Создание черновика. Можно написать черновой вариант поста с использованием специальных знаков, а потом быстро разместить его в блоге. Готовый вариант будет сразу отредактированным, что намного удобнее, чем копирование из Word.
  • Написание списка задач. В «Маркдаун» легко делать перечни предстоящих дел, заданий.
  • Редактирование сообщений в мессенджерах. Многие программы поддерживают этот язык текстовой разметки. Так, существует Markdown Telegram bot, с помощью которого удается сделать текст красивее.

Расширения

Чтобы расширить синтаксис Markdown, можно использовать специальные приложения. Для добавления дополнительных функций разрешается задействовать MultiMarkdown (C), Maruku (Ruby), Markout (Java) и прочие.

Конвертеры

Для преобразования из HTML в «Маркдаун» используется html2text.py, Make.text и другие. Также существует библиотека, поддерживающая несколько диалектов редактора – Pandoc. Для других форматов применяется odt2txt и word_markdown_macro.

Какие ресурсы используют

Лучший вариант для Markdown – Atom, который характеризуется гибкостью, универсальностью, удобством. Редактор работает в Windows, macOS, Linux. Пользователям Android и iOS также доступен простой язык программирования.

Markdown и Телеграм

Telegram поддерживает html и Markdown. Каждый вариант обладает своими преимуществами. Рекомендуется выбирать тот язык программирования, который более удобный при конкретных обстоятельствах. Использовать одновременно «Маркдаун» и html невозможно.

Когда и зачем нужно применение

Разметку используют при необходимости отформатировать текст. Обычно «Маркдаун» задействуют люди или сообщества, которые ведут в Telegram собственный канал. Благодаря специальным символам удается сделать публикацию структурированной, аккуратной, красивой.

Плюсы и минусы

Положительные стороны использования Telegram Markdown:

  • Простота применения. Все опции осваиваются за 10 минут.
  • Много инструментов. Можно вставить текстовую ссылку, выделить отдельные слова и предложения жирным или курсивом.
Редактирование текста.

Минусы «Маркдауна»:

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

Возможности

Чтобы bot в Телеграмм APK заработал, в начале публикации требуется прописать «md:true». Дальше ставится пробел, после чего печатается текст. Чтобы сделать окончательный вариант публикации привлекательным для широкой аудитории, требуется следовать инструкции и использовать особые знаки.

Как преобразовать сообщение с помощью Markdown:

  • Для выделения текста полужирным его помещают между двух звездочек: *text*.
  • Чтобы прописать сообщение курсивом, используется нижнее подчеркивание: _ text _.
  • Для создания зачеркнутого текста требуется поместить его в тильды: ~text ~.
  • При поддержке GFM можно сделать простую таблицу, используя знаки | и -, которые обозначают границы (в HTML для этого задействуют тег
  • Когда требуется вставлять ссылку в текстовом виде, применяются следующие знаки: [Text ссылки](Ссылка).
  • Для создания code используется гравис.
  • Чтобы отметить целый блок кода, понадобится 3 грависа.

Выводы

Форматировать текст в Телеграмме можно с помощью html и Markdown. Благодаря разметке удается изменить общий вид текста – выделить отдельные его части курсивом, добавить ссылки, таблицы, маркированные списки и прочее. Чтобы воспользоваться ботом API, требуется изучить, какие знаки обеспечивают ту или иную функцию.

Детальная информация видна на видео:

Давно заметил, что некоторые авторы телеграм-каналов умеют делать посты с форматированием (жирным шрифтом, курсивом). API это позволяет, но документация Telegram для людей по этому поводу молчит, упоминая лишь инлайн-бота @bold, который никуда не годится.

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

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

Рассказывает Михаил Калашников

Содержание

Настройка

1. Добавьте себе в контакты двух ботов: @ControllerBot и @ChannelsStatBot

Скопируйте их имена в строку поиска, чтобы не перепутать, есть похожие. Нажмите на начать (/start) в каждом из них, в первом выберите русский язык.

2. Добавьте обоих ботов в администраторы своего телеграм-канала. В веб-клиенте для этого нужно либо нажать в правой колонке на название канала или на иконку “>” , либо в левой колонке вызвать контекстное меню правой кнопкой и выбрать «Профиль». В профиле нажимайте на количество администраторов и добавляйте ботов (опять копируйте имена, по умолчанию Telegram предлагает живых людей).

3. Подключаем статистику. Для этого идем в бота @ChannelsStatBot и пишем или кликаем на команду /addchannel. После этого нужно переслать этому боту сообщение из своего канала.

Все, канал подключен. Используйте команду /stats, чтобы смотреть число подписчиков по дням. Бот присылает текстовые данные и график картинкой.

4. Идем в @ControllerBot, выбираем в меню “1. Каналы”, а потом “1. Добавить канал”. Пересылаем ему сообщение из канала, чтобы подключить.

Ура, теперь можно пользоваться разметкой и отложенными постами, используя функции “3. Отправить пост” и “4. Отложенные посты”.

Разметка

Telegram поддерживает два формата разметки: HTML и Markdown. Выбирайте тот, который удобнее, менять можно по ходу, но оба сразу нельзя.

Markdown

*полужирный*

_курсив_

[текст ссылки](http://example.com/url)

HTML

полужирный < /b>

курсив < /i>

текст ссылки< /a>

В обоих случаях должно получаться так:

Бот постит в канал не сразу, а когда вы выбираете “4. Разместить”. Редактировать то, что вы отсылаете боту, нельзя, только удалить. Если вы ему напишете несколько сообщений, он потом несколько и запостит. Обязательно поэтому пользуйтесь предпросмотром.

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

Бонус: главное оружие публичного интеллектуала перечеркнутый текст Telegram полноценно не поддерживает, но можно его имитировать с помощью вот такого сервиса (через Unicode). Теоретически на каких-то клиентах может не работать, но сам таких не встречал.

Отложенные посты

Отложенные посты пишутся так же, только по кнопке “4. Отложенные посты”. Отложенная публикация учитывает ваш часовой пояс (но не пояс читателей, само собой). Еще не опубликованные посты можно успеть удалить.

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

Предоставлено SendPulse

Для начала нужно понять что представляет из себя этот фрукт.

Markdown (маркдаун) — облегченный язык разметки, созданный с целью написания максимально читаемого и удобного для правки текста, но пригодного для преобразования в языки для продвинутых публикаций (HTML, Rich Text и др.).

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

Если вы до сих пор не знаете, как размечать ваши сообщения, то вот схема:

(В данный момент официальные телеграм-клиенты поддерживает все виды markdown`а, кроме гиперссылок. Их вы можете вставлять посредством ботов.)

__курсив__ = курсив

**полужирный** = полужирный

`моноширинный` = моноширинный

“`блок кода“` = блок кода (несколько строк)

[гиперссылка](http://t.me/botoblog) = гиперссылка

Также телеграм поддерживает html-разметку:

курсив = курсив

полужирный = полужирный

моноширинный = моноширинный

блок кода

= блок кода (несколько строк)

гиперссылка = гиперссылка

Боты также могут использовать маркдауны, но для этого нужно передать соответствующую конфигурацию при отправке сообщения. А именно: параметр parse_mode должен быть установлен на “HTML” или “Markdown“. И для разметки в боте нужно использовать лишь по одному символу по бокам вместо двух, как для обычных пользователей. (Пример: *текст*)

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

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

Это называется web preview. Благодаря этой функции вы можете делать длинный пост с картинкой/гифкой/видео. Как вы знаете, заливая картинку, вы можете написать лишь небольшой текст под ней, но мы же будем прикреплять картинку снизу и радоваться длиннопостам. Возможно, вы слышали такой способ, но там рассказывали, что ссылку можно вставить в точку, чтобы не заметили. Но согласитесь, так тоже некрасиво. Поэтому мы всунем ссылку в невидимый символ, который не отображается, т.е. и ссылки не видно, но и превью у нас есть. Вставлять специальные символы можно при помощи зажатия клавиши alt и затем последовательно набранных цифровых клавиш. В нашем случае это alt+255. Этот символ обязательно должен находиться перед другими ссылками, так как превью прикрепляется по первой из них. Таким образом мы получаем тест без гиперссылок и с превью.

Чтобы вставить картинку/гифку/видео – вам просто нужно залить ее куда-либо, чтобы у вас была прямая ссылка на файл , и вставить эту ссылку в разметку:

Так же вы можете использовать бота @bold для разметки, так как обычный пользователь не во всех клиентах может делать гиперссылки. Просто в диалоге пишете @bold и тест. Можете просто написать и выбрать вид разметки или же самому прописать и нажать “custom markdown”. Проблема бота в том, что он не может сделать ссылку в символе с кодом 255. Возможно, для этого нужно поискать другой символ. В своих ботах этот метод работает спокойно прекрасно.

Канал @botoblog

В этой главе мы разберёмся, как применять различные типы форматирования к сообщениям и работать с медиафайлами.

Текст¶

Обработка текстовых сообщений — это, пожалуй, одно из важнейших действий у большинства ботов. Текстом можно выразить практически что угодно и при этом подавать информацию хочется красиво. В распоряжении у разработчика имеется три способа разметки текста: HTML, Markdown и MarkdownV2. Наиболее продвинутыми из них считаются HTML и MarkdownV2, «классический» маркдаун оставлен для обеспечения обратной совместимости и поддерживает меньше возможностей.

За выбор форматирования при отправке сообщений отвечает аргумент parse_mode, например:

 from aiogram import types  # где-то в функции... await message.answer("Hello, world!", parse_mode=types.ParseMode.HTML) # Вместо Enum-а можно задать parse_mode в виде обычной строки: await message.answer("Hello, *world*!", parse_mode="MarkdownV2") 

Если в боте повсеместно используется определённое форматирование, то каждый раз указывать аргумент parse_mode довольно накладно. К счастью, в aiogram можно передать необходимый тип прямо в объект Bot, а если в каком-то конкретном случае нужно обойтись без этих ваших разметок, то просто укажите parse_mode="" (пустая строка):

 bot = Bot(token="123:abcxyz", parse_mode=types.ParseMode.HTML)  # где-то в функции... await message.answer("Сообщение с HTML-разметкой") await message.answer("Сообщение без какой-либо разметки", parse_mode="") 

Существует и более «программный» или даже «динамический» способ формирования сообщения. Для этого нужно импортировать модуль markdown из aiogram.utils, который, несмотря на название, поддерживает и HTML тоже. Далее вызовите функцию text(), в которую передайте произвольное число таких же вызовов функции text(). Тип форматирования определяется названием функции, а буква “h” в начале означает HTML, т.е. функция hbold() обрамляет переданный ей текст как жирный в HTML-разметке (текст). Аргумент sep определяет разделитель между кусками текста. В общем, смотрите на код и скриншот ниже. Стоит ли использовать такой способ создания текста — решать вам:

 import aiogram.utils.markdown as fmt  # где-то в функции... await message.answer(         fmt.text(             fmt.text(fmt.hunderline("Яблоки"), ", вес 1 кг."),             fmt.text("Старая цена:", fmt.hstrikethrough(50), "рублей"),             fmt.text("Новая цена:", fmt.hbold(25), "рублей"),             sep="n"         ), parse_mode="HTML"     ) 

Помимо отправки с форматированием, Aiogram позволяет извлекать входящий текст как простое содержимое (plain text), как HTML и как Markdown. Сравнить можно на скриншоте ниже. Это удобно использовать, например, если вы хотите вернуть отправителю его сообщение с небольшими изменениями:

 @dp.message_handler() async def any_text_message(message: types.Message):     await message.answer(message.text)     await message.answer(message.md_text)     await message.answer(message.html_text)     # Дополняем исходный текст:     await message.answer(         f"Ваш текст:nn{message.html_text}", parse_mode="HTML"     ) 

Всё бы ничего, но с использованием форматирования есть проблема: не в меру хитрые пользователи могут использовать спец. символы в именах или сообщениях, ломая бота. Впрочем, в aiogram существуют методы экранирования таких символов: escape_md() и quote_html(). Либо можно использовать упомянутые выше методы (h)bold, (h)italic и прочие:

 @dp.message_handler() async def any_text_message2(message: types.Message):     await message.answer(f"Привет,  {fmt.quote_html(message.text)} ", parse_mode=types.ParseMode.HTML)     # А можно и так:     await message.answer(fmt.text("Привет,", fmt.hbold(message.text)), parse_mode=types.ParseMode.HTML) 

Подробнее о различных способах форматирования и поддерживаемых тегах можно узнать в документации Bot API.

Медиафайлы¶

Помимо обычных текстовых сообщений Telegram позволяет обмениваться медиафайлами различных типов: фото, видео, гифки, геолокации, стикеры и т.д. У большинства медиафайлов есть свойства file_id и file_unique_id. Первый можно использовать для повторной отправки одного и того же медиафайла много раз, причём отправка будет мгновенной, т.к. сам файл уже лежит на серверах Telegram. Это самый предпочтительный способ. К примеру, следующий код заставит бота моментально ответить пользователю той же гифкой, что была прислана:

 @dp.message_handler(content_types=[types.ContentType.ANIMATION]) async def echo_document(message: types.Message):     await message.reply_animation(message.animation.file_id) 

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

Кстати, про скачивание: aiogram предлагает удобный вспомогательный метод download() для загрузки небольших файлов на сервер, где запущен бот:

 @dp.message_handler(content_types=[types.ContentType.DOCUMENT]) async def download_doc(message: types.Message):     # Скачивание в каталог с ботом с созданием подкаталогов по типу файла     await message.document.download()   # Типы содержимого тоже можно указывать по-разному. @dp.message_handler(content_types=["photo"]) async def download_photo(message: types.Message):     # Убедитесь, что каталог /tmp/somedir существует!     await message.photo[-1].download(destination="/tmp/somedir/") 

Работа с изображениями

Обратите внимание на конструкцию message.photo[-1]. Когда пользователь присылает боту изображение, Telegram присылает не один объект, а целый массив с разными размерами одного и того же изображения, отсортированными по возрастанию. В общем случае нас будет интересовать изображение наибольшего размера, стоящее последним (индекс «минус один»).

Скачивание больших файлов

Боты, использующие Telegram Bot API, могут скачивать файлы размером не более 20 мегабайт. Если вы планируете скачивать/заливать большие файлы, лучше рассмотрите библиотеки, взаимодействующие с Telegram Client API, а не с Telegram Bot API, например, Telethon. Немногие знают, но Client API могут использовать не только обычные аккаунты, но ещё и боты.

А начиная с Bot API версии 5.0, можно использовать собственный сервер Bot API для работы с большими файлами.

Бонус¶

Бывают ситуации, когда хочется отправить длинное сообщение с картинкой, но лимит на подписи к медиафайлам составляет всего 1024 символа против 4096 у обычного текстового, а вставлять внизу ссылку на медиа — выглядит некрасиво. Более того, когда Telegram делает предпросмотр ссылок, он берёт первую из них и считывает метатеги, в результате сообщение может отправиться не с тем превью, которое хочется увидеть. Для решения этой проблемы ещё много лет назад придумали подход со «скрытыми ссылками» в HTML-разметке. Суть в том, что можно поместить ссылку в пробел нулевой ширины и вставить всю эту конструкцию в начало сообщения. Для наблюдателя в сообщении никаких ссылок нет, а сервер Telegram всё видит и честно добавляет предпросмотр. Разработчики aiogram для этого даже сделали специальный вспомогательный метод hide_link():

 import aiogram.utils.markdown as fmt  @dp.message_handler(commands="test4") async def with_hidden_link(message: types.Message):     await message.answer(         f"{fmt.hide_link('https://telegram.org/blog/video-calls/ru')}Кто бы мог подумать, что "         f"в 2020 году в Telegram появятся видеозвонки!nnОбычные голосовые вызовы "         f"возникли в Telegram лишь в 2017, заметно позже своих конкурентов. А спустя три года, "         f"когда огромное количество людей на планете приучились работать из дома из-за эпидемии "         f"коронавируса, команда Павла Дурова не растерялась и сделала качественные "         f"видеозвонки на WebRTC!nnP.S. а ещё ходят слухи про демонстрацию своего экрана :)",         parse_mode=types.ParseMode.HTML) 

На этом всё. До следующих глав! Ставьте лайки, подписывайтесь, прожимайте колокольчик

Оцените статью
Рейтинг автора
4,8
Материал подготовил
Егор Новиков
Наш эксперт
Написано статей
127
А как считаете Вы?
Напишите в комментариях, что вы думаете – согласны
ли со статьей или есть что добавить?
Добавить комментарий