Пора делать нормальных телеграм-ботов
Вы создаёте ботов в телеграме? Даже если нет, полезно будет знать о некоторых моментах, касающихся разработки телеграм-ботов. Никакого кода не будет, только картинки и описание 5 распространённых ошибок, которые меня — заядлого педанта в области разработки простых интерфейсов — раздражают
Ботов, которых я буду рассматривать, я нашёл в поиске по vc.ru.
1. Кнопки, которые крепятся к сообщениям, и кнопки, которые крепятся к клавиатуре, должны выполнять те функции, для которых предназначены (негласно).
Суть кнопок, которые крепятся к клавиатуре (как на скриншоте) — быстрый ввод. Вместо того, чтобы заставлять пользователя вводить определённую фразу или слово, можно сделать специальную кнопку как раз в том месте, где располагается клавиатура. Из-за того, что во многих ботах ввод пользователя проверяется по точному совпадению отправленного им сообщения, такие кнопки сильно упрощают взаимодействие с ботом, организовывая эффективный диалог, который можно будет перечитать. Если же получающийся диалог не несёт смысла, значит кнопки используются неправильно — как в боте на скриншоте: в нём эти кнопки используются для организации навигации по боту. Одну часть этих кнопок можно заменить на команды, другую часть — на кнопки, крепящиеся к сообщению. Например, как организовано в официальном боте:
2. Кнопки, крепящиеся к сообщению, засоряют чат не меньше встраиваемых в клавиатуру кнопок из предыдущего пункта.
Эти кнопки нужны как раз для визуального взаимодействия с ботом. Суть их в том, чтобы предоставить возможность взаимодействовать с ботом как с приложением. По нажатии на кнопку ожидаешь, что текст в сообщении обновится, меню перестроится, и будет хорошо, но внезапно становится больно от когнитивного диссонанса, возникающего после появления нового сообщения с новыми кнопками вместо обновления предыдущего. Иногда кнопки предыдущего сообщения удаляются, и присылаются новые, а предыдущее сообщение так и висит полуполоманное с двоеточием на конце и без продолжения в виде клавиатуры. Удалять предыдущее сообщение — тоже не вариант. Сообщение и клавиатуру нужно обновлять, и никак иначе.
3. Нажатие на кнопки, крепящиеся к сообщению, нельзя оставлять без ответа.
В документации так и написано:
В течение 30 секунд будет висеть индикатор ожидания реакции от бота на нажатие. В некоторых случаях серверы телеграма повторно отправляют запрос, если ответа не последовало. Это, наверное, самая часто встречающаяся проблема из тех, которые сильно бросаются в глаза. Об этом явно указано в документации, но почему-то разработчики усердно продолжают игнорировать эту пометку и раздражают пользователей индикаторами ожидания.
4. Сообщения, предполагающие ожидание, не должны оставаться на виду после отправки результата пользователю.
Сообщения легко обновлять. Насколько я знаю, сообщение для редактирования и удаления доступно в течение 48 часов (для ботов), а значит в случае, если ответ явно требует долгого ожидания, лучше не оставлять сообщение, которое всем своим видом показывает, что обновится по получении ответа. Во-первых, если оно обновится, пользователь не получит уведомление. Во-вторых, если срок обновления и удаления истечёт, то сообщение останется висеть в чате, и ничего с ним не сделать. Поэтому не стоит отправлять сообщения, которые собираетесь обновлять через долгий срок. Но если срок предполагается короткий, то сообщение нужно, разумеется, обновить, а не присылать следующее, как на скриншоте выше. Либо (ради уведомлений конечно) написать такой текст, в котором не подразумевается, что он будет изменён («По окончании обработки мы пришлём результат в ответном сообщении», ну или типа того).
5. Не плените пользователей, не становитесь спамерами.
Раньше я делал в своих ботах отдельную команду, чтобы пользователи могли удалять свои данные из базы во избежание возможных массовых рассылок активным пользователям. Правда, командой пользовались редко, и проще было отслеживать пользователей, которые заблокировали бота. Поэтому уважайте своих пользователей и не делайте подозрительных действий для телеграма типа массовых рассылок. Тех, кто заблокировал бота, помечайте флагом в базе как недоступных. Если хотите сделать рассылку, отправляйте сообщения не всем пользователям, а только активным за последние n часов или суток (если их не так много). Максимум можно отправить 30 сообщений в секунду (про каналы точно не могу сказать, я делаю только диалоговых ботов, но там сильно меньше). Если превысить лимит, бот перестанет получать запросы — попадёт в стоп-лист на некоторое время. Ограничение можно увеличить через техподдержку в случае необходимости (или свой сервер поднять).
Было трудно найти ботов, в которых именно описанные ошибки, потому что почти в каждом встречаются все сразу, и акцентировать внимание на чём-то определённом не получилось бы. Я буду продолжать эту и подобные темы в следующих статьях, поэтому если есть боты на проверку, предлагайте — так будет даже проще.
Лучшее по ботам из того, что я в последнее время читал. Спасибо!
Вопрос по тексту «Тех, кто заблокировал бота, помечайте флагом в базе как недоступных». Каким образом? При блокировке мы не получаем каких либо уведомлений же. Или я что то пропустил?
Да, давненько появилось.
Приходит обыкновенное обновление статуса. Путь my_chat_member->new_chat_member->status (kicked - бот был заблокирован, member - бот был восстановлен).
Если можно скиньте тутор или статью о том как можно сделать обновление текста кнопки при нажатии на нее в телеграмме.
Например, можно поменять только кнопки: https://core.telegram.org/bots/api#editmessagereplymarkup. Чуть выше на странице будет обновление текста сообщения (и кнопки тоже тем же методом можно менять) и тп
Спасибо, я уже на степике нашёл как это сделать: https://stepik.org/lesson/871515/step/1?unit=875821
Комментарий удален модератором
Оч крутая фишка описана во втором пункте, но я не совсем понимаю как это можно реализовать?
Поясните, реализацию какой конкретно фишки имеете в виду? Не понял..
А как сделать команду по нажатию на которую бот будет присылать фото ?
2-й пункт.
Почему не вариант удалять всё сообщение с кнопками и присылать новое? Как по мне когда сообщение и кнопки редактируются это выглядит убого, всё постоянно растягивается и сужается.
Ради оптимизации, в основном. Удаление - это дополнительный запрос, а если ботом будут пользоваться много людей, то телеграм начнёт тормозить ответы. К тому же, когда сообщение удаляется, а затем присылается новое - чат всё равно скачет.
Вот действительно интересно, как удалить (а лучше обновить)
сообщение с инлайн кнопками после отправки фото или какого-то файла?
Можно попробовать editMessageMedia, например. Я обычно не обновляю отдельно элементы подобными методами, ибо не приходилось, поэтому точно как это работает, сказать не могу
вроде через aiogram-dialog можно реализовать
Спасибо за статью!
А случаем нет статьи как поднять свои сервак, чтобы обойти лимиты телеграма. Нужен сервис оповещений, которые могут сыпать по 50 сообщений в минуту.
Такое нельзя сделать, все сообщения посылаются через серверы телеграма
Неужели такую тех.задачу никто не решал)
А был опыт расширения лимита через поддержку ТГ?
ТП не отвечают. Мне, по крайней мере