Пора делать нормальных телеграм-ботов

Вы создаёте ботов в телеграме? Даже если нет, полезно будет знать о некоторых моментах, касающихся разработки телеграм-ботов. Никакого кода не будет, только картинки и описание 5 распространённых ошибок, которые меня — заядлого педанта в области разработки простых интерфейсов — раздражают

Ботов, которых я буду рассматривать, я нашёл в поиске по vc.ru.

1. Кнопки, которые крепятся к сообщениям, и кнопки, которые крепятся к клавиатуре, должны выполнять те функции, для которых предназначены (негласно).

Пора делать нормальных телеграм-ботов

Суть кнопок, которые крепятся к клавиатуре (как на скриншоте) — быстрый ввод. Вместо того, чтобы заставлять пользователя вводить определённую фразу или слово, можно сделать специальную кнопку как раз в том месте, где располагается клавиатура. Из-за того, что во многих ботах ввод пользователя проверяется по точному совпадению отправленного им сообщения, такие кнопки сильно упрощают взаимодействие с ботом, организовывая эффективный диалог, который можно будет перечитать. Если же получающийся диалог не несёт смысла, значит кнопки используются неправильно — как в боте на скриншоте: в нём эти кнопки используются для организации навигации по боту. Одну часть этих кнопок можно заменить на команды, другую часть — на кнопки, крепящиеся к сообщению. Например, как организовано в официальном боте:

Пора делать нормальных телеграм-ботов

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

Пора делать нормальных телеграм-ботов

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

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

3. Нажатие на кнопки, крепящиеся к сообщению, нельзя оставлять без ответа.

В документации так и написано:

NOTE: After the user presses a callback button, Telegram clients will display a progress bar until you call answerCallbackQuery. It is, therefore, necessary to react by calling answerCallbackQuery even if no notification to the user is needed (e.g., without specifying any of the optional parameters).

Пора делать нормальных телеграм-ботов

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

4. Сообщения, предполагающие ожидание, не должны оставаться на виду после отправки результата пользователю.

Пора делать нормальных телеграм-ботов

Сообщения легко обновлять. Насколько я знаю, сообщение для редактирования и удаления доступно в течение 48 часов (для ботов), а значит в случае, если ответ явно требует долгого ожидания, лучше не оставлять сообщение, которое всем своим видом показывает, что обновится по получении ответа. Во-первых, если оно обновится, пользователь не получит уведомление. Во-вторых, если срок обновления и удаления истечёт, то сообщение останется висеть в чате, и ничего с ним не сделать. Поэтому не стоит отправлять сообщения, которые собираетесь обновлять через долгий срок. Но если срок предполагается короткий, то сообщение нужно, разумеется, обновить, а не присылать следующее, как на скриншоте выше. Либо (ради уведомлений конечно) написать такой текст, в котором не подразумевается, что он будет изменён («По окончании обработки мы пришлём результат в ответном сообщении», ну или типа того).

5. Не плените пользователей, не становитесь спамерами.

Раньше я делал в своих ботах отдельную команду, чтобы пользователи могли удалять свои данные из базы во избежание возможных массовых рассылок активным пользователям. Правда, командой пользовались редко, и проще было отслеживать пользователей, которые заблокировали бота. Поэтому уважайте своих пользователей и не делайте подозрительных действий для телеграма типа массовых рассылок. Тех, кто заблокировал бота, помечайте флагом в базе как недоступных. Если хотите сделать рассылку, отправляйте сообщения не всем пользователям, а только активным за последние n часов или суток (если их не так много). Максимум можно отправить 30 сообщений в секунду (про каналы точно не могу сказать, я делаю только диалоговых ботов, но там сильно меньше). Если превысить лимит, бот перестанет получать запросы — попадёт в стоп-лист на некоторое время. Ограничение можно увеличить через техподдержку в случае необходимости (или свой сервер поднять).

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

88
20 комментариев

Лучшее по ботам из того, что я в последнее время читал. Спасибо!

1
Ответить

Вопрос по тексту «Тех, кто заблокировал бота, помечайте флагом в базе как недоступных». Каким образом? При блокировке мы не получаем каких либо уведомлений же. Или я что то пропустил?

Ответить

Да, давненько появилось.

Приходит обыкновенное обновление статуса. Путь my_chat_member->new_chat_member->status (kicked - бот был заблокирован, member - бот был восстановлен).

1
Ответить

Если можно скиньте тутор или статью о том как можно сделать обновление текста кнопки при нажатии на нее в телеграмме.

Ответить

Например, можно поменять только кнопки: https://core.telegram.org/bots/api#editmessagereplymarkup. Чуть выше на странице будет обновление текста сообщения (и кнопки тоже тем же методом можно менять) и тп

1
Ответить

Оч крутая фишка описана во втором пункте, но я не совсем понимаю как это можно реализовать?

Ответить