Как использовать метод sendChatAction в специально созданном роутере для бота Aiogram?

Какие варианты ChatAction-действий доступны для отправки (отображения) ботом согласно документации?
  • 10 февраля 2024 г. 20:48
Ответы на вопрос 2
В библиотеке aiogram для создания асинхронных телеграм-ботов на Python, метод `sendChatAction` используется для отправки уведомления о том, что бот "печатает" или выполняет какое-то другое действие. Для того чтобы использовать `sendChatAction` в специально созданном роутере (в aiogram 3.x dispatcher был заменен на router), вам нужно выполнить несколько шагов.

1. Создать роутер:
```python
from aiogram import Router

my_router = Router()
```

2. Добавить хэндлер с действием `sendChatAction`:
```python
from aiogram.types import Message, ChatActions
from aiogram import F

@my_router.message(F.chat.type == "supergroup") # Пример проверки на тип чата
async def some_handler(message: Message):
    await message.answer_chat_action(ChatActions.TYPING)

    # Далее ваш код, например, отправка сообщения пользователю
    await message.answer("Обрабатываю ваш запрос...")
```

Здесь `ChatActions.TYPING` означает, что бот "печатает" сообщение. `answer_chat_action` относится к методам `Message`, поэтому вызывается на объекте `message`.

В aiogram доступны следующие варианты для `ChatActions`:

- `TYPING` - бот "печатает" сообщение.
- `UPLOAD_PHOTO` - бот загружает фотографию.
- `UPLOAD_VIDEO` - бот загружает видео.
- `UPLOAD_AUDIO` - бот загружает аудио.
- `UPLOAD_DOCUMENT` - бот загружает документ.
- `FIND_LOCATION` - бот отправляет местоположение.
- `RECORD_VIDEO_NOTE` - бот записывает видеосообщение.
- `UPLOAD_VIDEO_NOTE` - бот загружает видеосообщение.
- `RECORD_VOICE` - бот записывает голосовое сообщение.
- `UPLOAD_VOICE` - бот загружает голосовое сообщение.
- `CHOOSING_STICKER` - бот выбирает стикер (не все версии API поддерживают).

Пример:
```python
await message.answer_chat_action(ChatActions.UPLOAD_DOCUMENT)
```

Таким образом, вы можете использовать любое из этих действий, чтобы показать пользователю, что бот совершает определенное действие прямо сейчас.

Пример использования `sendChatAction` напрямую, если вам нужно вызвать его не от имени объекта сообщения `message`, а от объекта бота `Bot`, который вы создали с помощью `Bot(token)`:

```python
from aiogram.types import ChatActions

await bot.send_chat_action(chat_id=message.chat.id, action=ChatActions.TYPING)
```
Здесь `chat_id` - это идентификатор чата, в который вы хотите отправить уведомление о действии.

Не забудьте импортировать все необходимые компоненты из `aiogram`. Помните также, что код должен выполняться в асинхронной среде.
Ну во-первых, bot незачем импортировать, он возвращается в каждый хэндлер как аргумент функции, достаточно исправить функцию на: 
Во-вторых: bot также находится почти в каждом объекте апдейта (types.Message, types.CallbackQuery и т.п.). Для этого вам нужно вызвать его следующим образом:
Похожие вопросы