Почему вылетают ошибки при попытке отправить фото через бота

По идеи при срабатывании тригерного слова в чат должна вылетать картинка, но вместо этого в терминал падают ошибки. Весь остальной код работает. Если заменить answer_photo на message.reply(pic) то в чат отправляется путь к картинке.

Код:

from aiogram import types
from aiogram.filters import BaseFilter
import os
from bot.bot_template.logging.logger import logger
from dotenv import load_dotenv
from aiogram.types import InputFile   


# Загрузка переменных окружения
load_dotenv(r"C:\PythonProject\python_beginners_course-main\Itproger\bot\keys\mat")
bad_word = os.getenv("slova") 
 
file_path = r"C:\PythonProject\python_beginners_course-main\Itproger\bot\bot_template\filters\howdareu.png" ##ошибка тут?
pic = file_path  ### тут?

class MatFilter(BaseFilter):
    async def __call__(self, message: types.Message) -> bool:
        if message.text:
            for word in message.text.split():
                if word.lower() in bad_word:
                    # Открываем файл и создаем объект InputFile
                    await message.answer("Ругаться не хорошо!")
                    logger.info(f"Фильтр сработал: пользователь {message.from_user.id} написал '{message.text}'") 
                    photo = InputFile(file_path)### тут??
                    await message.answer_photo(photo=photo) # тут??
                    return True
        return False

Ошибка:

File "C:\PythonProject\python_beginners_course-main\Itproger\bot\bot_template\filters\filters.py", line 24, in __call__
  photo = InputFile(file_path)
          ^^^^^^^^^^^^^^^^^^^^
TypeError: Can't instantiate abstract class InputFile without an implementation for abstract method 'read'

Ответы (1 шт):

Автор решения: mrgervant

Замените InputFile на FSInputFile - это специальный подкласс для загрузки из файловой системы (документация):

from aiogram.types import FSInputFile

###
    photo = FSInputFile(file_path)
    await message.answer_photo(photo=photo)
###

Помимо FSInputFile есть и другие подклассы:

  • BufferedInputFile - для загрузки из буфера (в виде байтов)
  • URLInputFile - для загрузки с сервера по URL-адресу картинки
→ Ссылка