Кнопки в телеграм боте: выбор, возврат и поле имени

У меня в демо-боте есть кнопка «Ремонт ванной». По коду её обработчика видно — нажатие не добавляет в переписку пользовательское сообщение «Ремонт ванной». Вместо этого бот оставляет на месте карточку, вписывает в неё выбранную работу и спрашивает, когда мастеру позвонить. Небольшая разница, но чат от неё выглядит как разговор, а не как протокол нажатий.

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

⁂

В Telegram есть два похожих с виду механизма. Текстовая кнопка обычной reply-клавиатуры при нажатии отправляет свой текст как сообщение пользователя. Это прямо сказано в Bot API. Inline-кнопка живёт под сообщением бота и, по описанию Telegram, нового пользовательского сообщения в чат не посылает. Бот получает внутренний сигнал и решает, что сделать — заменить экран, открыть ссылку, показать уведомление.

В моём демо работает второй вариант. Начальное меню собрано из кнопок «Сбор заявок», «Запись на услуги», «Магазин и каталог» и ещё нескольких сценариев. Нажатие не цитирует название раздела в переписке — оно открывает нужный экран. Кнопка «Написать Владиславу» устроена иначе. Это ссылка, потому что её задача не выбрать состояние внутри демо, а открыть другой адрес.

Техническая мелочь, которую пользователь замечает только при ошибке разработчика, — после нажатия Telegram показывает индикатор ожидания, пока бот не ответит на callback-запрос. Поэтому обработчики в демо сначала подтверждают нажатие, даже когда отдельное уведомление не требуется. Иначе кнопка вроде бы сработала, экран уже сменился, а человек всё ещё видит вращение. Машина задумалась? Нет, просто ей забыли сказать «Спасибо, принято».

⁂

Сценарий заявки начинается с четырёх работ. После выбора «Ремонта ванной» прежняя карточка меняется — выбранное остаётся перед глазами, ниже появляются три срока звонка. После срока бот просит имя.

И тут кнопки заканчиваются.

Я не знаю, как зовут человека, который открыл бота, и не собираюсь угадывать. В демо имя вводится одним сообщением; код проверяет только, что в нём хотя бы два знака, и берёт не больше сорока. Можно было бы нарисовать кнопки «Ирина», «Сергей», «Другое», но получилась бы лишняя остановка перед тем же полем ввода. Два имени создавали бы вид выбора, а всем остальным всё равно пришлось бы печатать.

Так появляется простое правило. Кнопка хороша там, где варианты заранее известны и их немного — вид работы, срок звонка, статус заявки. Свободный текст нужен там, где ответ принадлежит человеку. Это имя, комментарий, адрес с подъездом, описание неисправности. Я не считаю, что весь бот обязан состоять из кнопок. Команды тоже остаются — `/start` открывает начало, `/menu` возвращает меню, `/cancel` может сбросить незавершённый ввод. Кнопки не отменяют команды, они снимают с человека необходимость помнить их в середине обычного пути.

После имени демо собирает карточку заявки. В ней стоят номер, выбранная работа, срок звонка, время поступления и ссылка на переписку с человеком; ниже появляется «Взять в работу», затем «Закрыть заявку». Устройство самой карточки я разбирал отдельно; здесь важен переход между состояниями. Кнопка не изображает разговор и не просит повторить уже известные данные. Она меняет одно понятное состояние, причём после закрытия следующей служебной ступени уже нет. Для владельца это короче, чем писать боту «заявка номер такая-то теперь в работе», а для кода — точнее, потому что за видимой фразой закреплено конкретное действие.

⁂

Путь назад я закладываю одновременно с путём вперёд. После выбора работы есть кнопка «Другая работа», после выбора услуги — «Другая услуга», после просмотра времени — «Другой день». В корзине кофейни можно вернуться в каталог. Это не украшение интерфейса. Человек мог промахнуться, передумать или просто проверить соседний вариант.

Особенно хорошо возврат виден в демо записи. Сначала человек выбирает услугу, потом один из ближайших рабочих дней, затем свободное время. Занятые часы не показываются. Но между показом списка и нажатием другой пользователь может занять тот же слот; тогда бот сообщает об этом и заново открывает оставшееся время. После отмены запись помечается отменённой, а час снова становится доступен. Кнопка назад здесь не признание ошибки программы, а нормальная дверь в помещении, где люди меняют решение.

В магазине та же мысль выглядит ещё нагляднее. «Плюс» и «минус» у капучино или круассана не производят по сообщению на каждое нажатие. Бот пересчитывает количество и сумму в той же карточке. Когда человек идёт к оформлению, рядом остаётся «Вернуться в каталог». Иначе одна забытая булочка заставила бы начинать заказ с нуля (кофейня такого драматизма не заслуживает).

Я смотрю и на подписи. Человеку нужен «Другой день», а программе достаточно внутренней метки, по которой она понимает, куда вернуться. Эти две вещи не обязаны звучать одинаково: надпись отвечает на вопрос пользователя, внутренний сигнал — на вопрос кода. Поэтому кнопку можно переименовать понятнее, не превращая весь сценарий в набор команд, видимых в чате. Telegram оставляет техническую часть за сообщением; человеку достаётся нормальная человеческая фраза.

⁂

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

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

У кнопки «Начать заново» в коде указан переход к началу сценария. Там снова тот же вопрос — «Какая работа нужна?»

Оцените статью

Комментарии

Загружаю комментарии…

Написать комментарий

Комментарии публикуются сразу после автоматической проверки на спам и рекламу. Ссылки в комментариях не кликабельны.