Как определить тип (типизацию) отправленного сообщения в aiogram?

Как правильно определить тип файла отправленного пользователем в данном коде?
  • 13 октября 2023 г. 15:49
Ответы на вопрос 2
Для определения типа отправленного сообщения в aiogram можно использовать атрибут `content_type` объекта `Message`. Вот пример кода:

```python
from aiogram.dispatcher.filters import ContentTypeFilter
from aiogram import Bot, Dispatcher, types, executor

# инициализация бота и диспетчера
bot = Bot(token='TOKEN')
dp = Dispatcher(bot)

# обработчик команды /start
@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    await message.reply("Привет! Пришли мне что-нибудь.")

# обработчик всех отправленных сообщений
@dp.message_handler(content_types=ContentTypeFilter())
async def handle_message(message: types.Message):
    content_type = message.content_type
    if content_type == types.ContentType.TEXT:
        await message.reply("Ты прислал мне текстовое сообщение!")
    elif content_type == types.ContentType.PHOTO:
        await message.reply("Ты прислал мне фото!")
    elif content_type == types.ContentType.VIDEO:
        await message.reply("Ты прислал мне видео!")
    else:
        await message.reply("Ты прислал мне что-то, но я не знаю что это.")

# запуск бота
if __name__ == '__main__':
    executor.start_polling(dp)
```

В этом примере определение типа выполняется в обработчике всех отправленных сообщений. При получении сообщения бот будет проверять его тип (`content_type`) и отправлять пользователю ответ в зависимости от типа сообщения.

Чтобы определить тип файла, отправленного пользователем, можно воспользоваться атрибутом `message.document.mime_type`. Например:

```python
@dp.message_handler(content_types=types.ContentType.DOCUMENT)
async def handle_document_message(message: types.Message):
    mime_type = message.document.mime_type
    if mime_type == 'application/pdf':
        await message.reply("Ты прислал мне PDF-файл!")
    elif mime_type == 'image/jpeg':
        await message.reply("Ты прислал мне JPEG-изображение!")
    else:
        await message.reply("Ты прислал файл, но я не знаю его тип.")
```

В этом примере обработчик будет вызываться только для сообщений с типом `DOCUMENT`. Далее будет проверяться тип файла и отправляться соответствующий ответ.
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage

logging.basicConfig(level=logging.INFO)

API_TOKEN = 'токен'
bot = Bot(token=API_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)

# Обработчик для видео
@dp.message_handler(content_types=['video'])
async def video(message):
    await message.answer('Вы отправили видео')

# Обработчик для голосовых сообщений
@dp.message_handler(content_types=['voice'])
async def voice(message):
    await message.answer('Вы отправили голосовое сообщение')

if __name__ == '__main__':
    from aiogram import executor
    executor.start_polling(dp, skip_updates=True)
Похожие вопросы