Команды бота Telegram: меню, setMyCommands и BotFather
Как задать команды бота Telegram: формат команды, список в меню через /setcommands в BotFather или метод setMyCommands, области (scope), языки и параметр /start в ссылке.
Команда бота — это слово с косой чертой в начале, например /start: бот получает его как обычное сообщение и решает, что делать. Чтобы команды появились в подсказке и в меню рядом с полем ввода, их список нужно задать самому. Есть два способа: командой /setcommands в @BotFather или методом Bot API setMyCommands. Список лишь подсказывает людям, что можно ввести: обрабатывает команды программа бота.
Какой бывает команда
По документации Telegram, команда всегда начинается с / и содержит до 32 символов: латинские буквы, цифры и подчёркивания. Рекомендуются простые слова в нижнем регистре, например /next или /cancel. Лучше конкретные названия: /newrule понятнее, чем /new с вопросом «что именно?».
Приложения Telegram делают с командами три вещи:
- подсвечивают команду в сообщениях: нажатие на неё отправляет команду снова;
- показывают список подсказок с описаниями, когда человек вводит
/; - показывают кнопку меню рядом с полем ввода, в которой собраны все команды бота или часть из них.
Telegram просит поддержать три общие команды: /start (начало работы, туда же попадает параметр из ссылки), /help (справка) и /settings (настройки, если они есть).
Как задать список команд в BotFather
- Откройте чат с @BotFather и отправьте
/setcommands. - Выберите бота.
- Пришлите список: по одной команде в строке в виде
команда - описание.
Пример списка из трёх строк: start - Начать, help - Справка, settings - Настройки.
Все команды BotFather и интерактивное меню настроек /mybots описаны в статье как создать бота в ТГ.
setMyCommands: список команд из кода
Метод setMyCommands меняет список команд бота. Параметры:
commands— обязательный. Список объектовBotCommand, не больше 100 штук. У каждого естьcommand(от 1 до 32 символов: строчные латинские буквы, цифры и подчёркивания, без косой черты) иdescription(от 1 до 256 символов).scope— для кого действует список. По умолчанию этоBotCommandScopeDefault, то есть для всех.language_code— двухбуквенный код языка по ISO 639-1. Если он пуст, список применяется ко всем пользователям из этой области, для языка которых нет отдельного списка.
Пример запроса:
curl "https://api.telegram.org/bot<ТОКЕН>/setMyCommands" -H "Content-Type: application/json" -d '{"commands":[{"command":"start","description":"Начать"},{"command":"help","description":"Справка"}]}'
При успехе в ответе "result": true. Метод задаёт список целиком, поэтому передавайте все команды сразу. Прочитать текущий список можно методом getMyCommands, удалить — deleteMyCommands: после удаления людям снова покажут команды более широкой области.
Области и языки: разные команды разным людям
Команды можно показывать по-разному. Поддерживаются семь областей:
| Область | Для кого |
|---|---|
default | все, если для них нет более узкого списка |
all_private_chats | все личные чаты с ботом |
all_group_chats | все группы и супергруппы |
all_chat_administrators | администраторы всех групп |
chat | один конкретный чат (нужен chat_id) |
chat_administrators | администраторы одной группы (нужен chat_id) |
chat_member | один участник группы (нужны chat_id и user_id) |
Какой список увидит человек, Telegram определяет по порядку, и берётся первый заданный. В личном чате с ботом проверяются chat, затем all_private_chats, затем default. В группах — chat_member, chat_administrators (только для администраторов), chat, all_chat_administrators (только для администраторов), all_group_chats и default. На каждом шаге сначала ищется список с языком пользователя (language_code), потом без языка.
Отсюда практический вывод: список для all_private_chats перекроет default в личных чатах. А если вы задали список для одного языка, людям с этим языком покажут именно его, а не общий.
Как бот получает команду
Команда приходит в обычном обновлении message: в text лежит /start, а в entities есть сущность типа bot_command. В группах команду адресуют конкретному боту через @: /command@имя_бота. Если у бота включён режим приватности, в группе он увидит только команды, адресованные ему, и общие команды вроде /start, когда он последним писал в эту группу.
Список команд, заданный боту, ничего не проверяет. В обновлении нет информации об области команды, и прийти может даже команда, которой у бота нет. Telegram советует всегда проверять на своей стороне, что команда существует и что человеку её можно использовать.
Команда /start с параметром
Ссылка на бота открывает чат с ним: https://t.me/<имя_бота>. К ней можно добавить параметр start, и бот получит его вместе с командой:
- ссылка
https://t.me/your_bot?start=airplaneпришлёт боту/start airplane; - допустимы символы
A-Z,a-z,0-9,_и-, длина — до 64 символов; для двоичных и других данных Telegram советует кодировать их в base64url; - ссылка с параметром
startgroupпредлагает выбрать группу, куда добавить бота, и бот получает/start@your_bot spaceship.
На параметре start держатся и реферальные ссылки ботов: об этом в статье про реферальные ссылки.
Почему команды не видны в меню
- Список не задан. Пока вы не вызвали
setMyCommandsили/setcommands, подсказки нет. - Перекрыт более узкой областью. Список
all_private_chatsили список для языка пользователя важнее общего. ВызовитеgetMyCommandsс нужнымиscopeиlanguage_codeи посмотрите, что задано. - Команда не соответствует формату. Только строчные латинские буквы, цифры и подчёркивания, до 32 символов.
Если команда видна, но бот молчит, дело в коде: список команд лишь подсказка, а обработчик пишется отдельно. Как получать события, рассказано в статье про getUpdates и webhook, а ответ отправляется методом sendMessage.
Что дальше
Команды удобны, когда у бота есть чем заняться: например, принимать оплату. Как подключить платежи звёздами, читайте в статье оплата звёздами в боте. Описание API бота Shiba Bank — в документации API.
Частые вопросы
Как задать команды боту Telegram?
Отправьте @BotFather команду /setcommands, выберите бота и пришлите список строк команда - описание. Из кода то же делает метод setMyCommands.
Как добавить команды в меню бота через BotFather?
Команда /setcommands, затем выбор бота и список. Люди увидят команды как подсказки, когда введут /, и в кнопке меню рядом с полем ввода.
Сколько команд можно задать боту?
Метод setMyCommands принимает не больше 100 команд на одну область. Имя команды — от 1 до 32 символов, описание — от 1 до 256.
Можно ли показать разные команды разным людям?
Да. Для этого у setMyCommands есть параметры scope (область: все личные чаты, группы, администраторы, один чат или один участник) и language_code (язык).
Что такое telegram api commands?
Это методы Bot API для работы со списком команд: setMyCommands, getMyCommands и deleteMyCommands. Они описаны в документации Bot API.
Нужно ли обрабатывать команду, если она есть в списке?
Да. Список только подсказывает людям, что ввести. Бот получает команду как обычное сообщение, и отвечать на неё должна ваша программа.


