Проблема с машиной состояний aiogram
Мне нужно в одной из стадий принять от пользователя фотографию (не фото профиля, просто фотку, которую он отправит) и сохранить её id, но при отправке фотографии боту, он просто никак не реагирует на неё
Код для примера:
from aiogram import types
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
class UserState(StatesGroup):
name = State()
photo = State()
@dp.message_handler(commands=['reg'])
async def user_register(message: types.Message):
await message.answer("Введите своё имя")
await UserState.name.set()
@dp.message_handler(state=UserState.name)
async def get_username(message: types.Message, state: FSMContext):
await state.update_data(username=message.text)
await message.answer("Отлично! Теперь Отправте фото")
await UserState.next()
@dp.message_handler(state=UserState.photo)
async def get_photo(message: types.Message, state: FSMContext):
print(message.content_type) #text но только когда это текст, если фото, ничего не происходит
# код дальше ещё не написан
await state.finish()
ещё я думал сделать так:
@dp.message_handler(state=Add_ad.waiting_for_picture, content_types = ['photo'])
async def name_entered(message: types.Message, state: FSMContext):
print(message.content_type) # photo
await state.finish()
тогда всё работает нормально, как должно, но текст будет полностью игнорироваться и нельзя его отловить и написать типо "пришлите фотографию"
Ответы (1 шт):
Если Вам нужно в одном хендлере "ловить" разные типы сообщений, то можно указать нужное Вам, в виде списка типов:
content_types=['photo', 'text']
Получить id фотографии (картинки) можно следующим образом:
photo_id = message.photo[0].file_id
Вообще, для удобства и лучшего понимания можно вывести само сообщение, которое поймал хендлер, обычным print-ом. Там много интересного можно увидеть.
Ну и, если нужно, чтобы хендлер реагировал по разному, на разные типы сообщения, можно задать условия.
@dp.message_handler(content_types=['photo', 'text'], state='нужное состояние')
async def get_photo_text(message: types.Message, state=FSMContext)
if message.content_type == 'photo':
"запускаем код, сохраняем id и т. д."
await bot.send_message(message.from_user.id, 'Прикольная фотка')
elif message.content_type == 'text':
'выполняем другой код'
await state.finish()
Вся необходимая информация есть в документации, хотя пользоваться ей, это отдельный навык). Я вот пока скилл не набил. https://core.telegram.org/bots/api#available-methods
Надеюсь что дал тот ответ, который был нужен.