Aiogram. Как проверить тип полученнокго контента
Я хочу написать телеграмм бота на python с использованием библиотеки aiogram. Мне нужно чтобы пользователь отправил боту фотографию. Вот кусок кода и функция которую я использую для получения и сохранения изображения.
from aiogram import types, Dispatcher
from create_app import dp, bot
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
import os, sys, pathlib
class FSMRegister(StatesGroup):
shop = State()
name = State()
position = State()
photo = State()
...
async def reg_photo(message : types.Message, state: FSMContext):
async with state.proxy() as data:
data['photo'] = message.photo[0].file_id
file_info = await bot.get_file(message.photo[0].file_id)
filename, file_extension = os.path.splitext(file_info.file_path)
await message.photo[-1].download('uploads/image' + file_extension)
async with state.proxy() as data:
await message.reply(str(data))
await state.finish()
def register_handlers_register( dp : Dispatcher ):
...
dp.register_message_handler(reg_photo, content_types=['photo'], state=FSMRegister.photo)
Но если пользователь отправляет вместо фотографии другой тип файла или текст то функция не срабатывает. Как мне сделать что-бы при возникновении такой ситуации бот в ответ отправлял сообщение о некорректности отправленных данных?
Ответы (2 шт):
Может когда-то кому-то пригодится. Добавил проверку на тип сообщения и вызвал еще раз функцию reg_photo в register_handlers_register без указания типа контента:
async def reg_photo(message : types.Message, state: FSMContext):
if message.content_type!='photo':
await message.answer('Отправьте, пожалуйста, свою фотографию')
return
async with state.proxy() as data:
....
def register_handlers_register( dp : Dispatcher ):
....
dp.register_message_handler(reg_photo, content_types=['photo'], state=FSMRegister.photo)
dp.register_message_handler(reg_photo, state=FSMRegister.photo)
Чтобы обрабатывать все типы сообщений укажите content_types=['any']
Потом надо просто проверять есть ли фотография в сообщении
async def reg_photo(message: types.Message, state: FSMContext):
if message.photo:
pass # Ваш код в случае если пользователь отправил фото
else:
await message.answer("Это не фото")
def register_handlers_register( dp : Dispatcher ):
dp.register_message_handler(reg_photo, content_types=['any'], state=FSMRegister.photo)