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

Вы создаёте ботов в телеграме? Даже если нет, полезно будет знать о некоторых моментах, касающихся разработки телеграм-ботов. Никакого кода не будет, только картинки и описание 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 сообщений в секунду (про каналы точно не могу сказать, я делаю только диалоговых ботов, но там сильно меньше). Если превысить лимит, бот перестанет получать запросы — попадёт в стоп-лист на некоторое время. Ограничение можно увеличить через техподдержку в случае необходимости (или свой сервер поднять).

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

0
18 комментариев
Написать комментарий...
mrMazai

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

Ответить
Развернуть ветку
mrMazai

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

Ответить
Развернуть ветку
Роман Анисимов
Автор

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

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

Ответить
Развернуть ветку
kor dan

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

Ответить
Развернуть ветку
Роман Анисимов
Автор

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

Ответить
Развернуть ветку
kor dan

Спасибо, я уже на степике нашёл как это сделать: https://stepik.org/lesson/871515/step/1?unit=875821

Ответить
Развернуть ветку

Комментарий удален модератором

Развернуть ветку
Георгий Моторин

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

Ответить
Развернуть ветку
Роман Анисимов
Автор

Поясните, реализацию какой конкретно фишки имеете в виду? Не понял..

Ответить
Развернуть ветку
Дополнительный месяц

А как сделать команду по нажатию на которую бот будет присылать фото ?

Ответить
Развернуть ветку
tim b

2-й пункт.
Почему не вариант удалять всё сообщение с кнопками и присылать новое? Как по мне когда сообщение и кнопки редактируются это выглядит убого, всё постоянно растягивается и сужается.

Ответить
Развернуть ветку
Роман Анисимов
Автор

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

Ответить
Развернуть ветку
Evgeniy

Вот действительно интересно, как удалить (а лучше обновить)
сообщение с инлайн кнопками после отправки фото или какого-то файла?

Ответить
Развернуть ветку
Роман Анисимов
Автор

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

Ответить
Развернуть ветку
kor dan

вроде через aiogram-dialog можно реализовать

Ответить
Развернуть ветку
Магомед Гаджиев

Спасибо за статью!
А случаем нет статьи как поднять свои сервак, чтобы обойти лимиты телеграма. Нужен сервис оповещений, которые могут сыпать по 50 сообщений в минуту.

Ответить
Развернуть ветку
Роман Анисимов
Автор

Такое нельзя сделать, все сообщения посылаются через серверы телеграма

Ответить
Развернуть ветку
Магомед Гаджиев

Неужели такую тех.задачу никто не решал)
А был опыт расширения лимита через поддержку ТГ?

Ответить
Развернуть ветку
Роман Анисимов
Автор

ТП не отвечают. Мне, по крайней мере

Ответить
Развернуть ветку
15 комментариев
Раскрывать всегда