Как устроены личные диалоги с Телеграм-ботами
Научить вашего бота отвечать в личных диалогах — это хорошая идея.
Даже если вы разрабатываете бота только для групп или каналов, приветствие в личных сообщениях будет полезным. Так люди, которые заинтересовались ботом и открыли его профиль, получат в ответ полезную информацию, а не молчание. В приветственное сообщение можно вставить ссылку "Добавить в группу" с помощью глубоких ссылок для групп.
Начало личного диалога
Бот не сможет отправлять сообщения пользователю, пока тот не инициировал диалог. Как только диалог начат, бот может отправлять сообщения в любое время. Обратите внимание, что боты не могут отправлять сообщения другим ботам.
Команда /start
Вот как обычно начинается личный диалог:
Пользователь открывает бота по ссылке или через поиск в приложении. Затем он видит вступительный текст и кнопку "Начать".
Когда пользователь нажимает на кнопку, отправляется команда /start
, означающая начало личного чата. Бот может ответить на эту команду приветствием или инструкциями по использованию.
@dp.message(CommandStart())
async def handle_start(message: Message):
await message.answer('Привет!')
Как и любой другой чат, диалог с ботом появляется в списке недавних чатов пользователя.
WARNING
Команда /start
не обязательно означает, что это первое взаимодействие пользователя с ботом. Важно убедиться, что ваш бот обрабатывает ситуации, когда пользователь отправляет /start
после того, как он уже инициировал диалог ранее.
Более того, первое сообщение от пользователя может не содержать команду /start
. Через Telegram API пользователь может начать диалог с любого сообщения. Вряд ли у вашего бота будут такие ненормальные пользователи, но лучше проверьте, что такое действие не кладёт вашего бота.
Дополнительный ввод
Чтобы сообщение /start
содержало дополнительную информацию, используйте диплинки.
Альтернативные способы начать диалог
Иногда бот может отправлять сообщения пользователю, даже если тот не начинал диалог явно. Это происходит в одном из следующих случаев:
- пользователь оставил заявку на вступление к группе или каналу, где бот управляет запросами на вступление;
- пользователь авторизовался через бота на сайте с Telegram Login Widget.
В таких случаях приложение Telegram показывает пользователю объяснение, по какой причине бот может писать.
Остановка диалога
Пользователь может остановить диалог, заблокировав бота. Тогда бот не сможет отправлять личные сообщения пользователю, пока не будет разблокирован.
Как проверить, может ли бот писать пользователю
Если вам нужно определить, заблокировал ли пользователь вашего бота, вы можете сделать следующее.
Попробуйте показать статус "Бот печатает..." в диалоге. Если серверы Telegram возвращают ошибку, это означает, что бот не может отправлять сообщения пользователю — так что либо пользователь заблокировал бота, либо диалог никогда не начинался.
Это действие имеет минимальное ограничение по частоте, поэтому так можно делать часто.
try:
await bot.send_chat_action(chat, 'typing')
except TelegramForbiddenError:
print("Не могу отправлять сообщения")