Как настроить телеграм бота так, чтобы он выбирал случайную картинку из указанной папки и отправлял ее пользователю?

Как отправить случайное изображение пользователю при вызове второй функции, учитывая, что первая функция уже успешно сохраняет изображение? Код на aiogram 3.0 предоставлен ниже:

```python
@dp.message(Command('kitty'))
async def start(message: types.Message):
    await message.answer('отправь картинку котика:')

@dp.message()
async def get_img(message: types.document):
    file_info = await bot.get_file(message.document.file_id)
    downloaded_file = await bot.download_file(file_info.file_path)
    file_name = 'img_' + str(random.randint(1, 100)) + '.jpg'
    file_path = os.path.join(folder_path, file_name)
    with open(file_path, 'wb') as file:
        file.write(downloaded_file.getvalue())
    await message.answer('котик успешно сохранен!')

@dp.message(Command('photo'))
async def photo(message: types.Message):
    image_files = os.listdir(folder_path)
    random_image = random.choice(image_files)
    with open(os.path.join(folder_path, random_image), 'rb') as photo:
        await message.reply_photo(photo)
```

Появляется ошибка: "AttributeError: 'NoneType' object has no attribute 'file_id'" в функции `get_img`, несмотря на ее корректную работу. Как исправить эту ошибку и отправить случайное изображение пользователю?
  • 22 сентября 2023 г. 11:37
Ответы на вопрос 1
Ошибка "AttributeError: 'NoneType' object has no attribute 'file_id'" возникает потому, что вы используете декоратор `@dp.message()` вместо `@dp.message(content_types=types.ContentType.DOCUMENT)`, чтобы ограничить тип контента только документами. Функция `get_img` принимает только сообщения с документами, поэтому вам необходимо изменить декоратор в соответствии с этим.

Вот исправленный код:

```python
@dp.message(Command('kitty'))
async def start(message: types.Message):
    await message.answer('отправь картинку котика:')

@dp.message(content_types=types.ContentType.DOCUMENT) # измененный декоратор
async def get_img(message: types.Message):
    file_info = await bot.get_file(message.document.file_id)
    downloaded_file = await bot.download_file(file_info.file_path)
    file_name = 'img_' + str(random.randint(1, 100)) + '.jpg'
    file_path = os.path.join(folder_path, file_name)
    with open(file_path, 'wb') as file:
        file.write(downloaded_file.getvalue())
    await message.answer('котик успешно сохранен!')

@dp.message(Command('photo'))
async def photo(message: types.Message):
    image_files = os.listdir(folder_path)
    random_image = random.choice(image_files)
    with open(os.path.join(folder_path, random_image), 'rb') as photo:
        await message.reply_photo(photo)
```

Теперь ошибка должна быть исправлена, и код должен работать корректно. Функция `get_img` сохраняет изображение, а функция `photo` отправляет случайное изображение пользователю при вызове команды `/photo`.
Похожие вопросы