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