Как отправлять картинки через callback

Может, кто-нибудь сможет для примера написать код как это реализовать с одной картинкой. У меня есть код, который генерирует картинки по полученным данным с сайта. У каждой картинки свое название, которое соответствует id, полученному с сайта (всегда разный id). id = название картинки, id - ключ из словаря key_id

key_id - словарь, содержащий id: name. Ключи 'id'. Эти ключи я хочу поставить в file_path = f"ПУТЬ/{uid}/{key}.png", чтобы отправлять по callback картинку с соответствующим ей ключом

callback_data установлена в соответствии с ключами из словаря key_id

@router.message(
        StateFilter(Reg.name)
)
async def character_card(message: Message,
                           state: FSMContext,
) -> None:        
await state.update_data(name=message.text)
await state.set_state(None)
ata = await state.get_data()
uid = data["name"]
async with starrailcard.Card(save=True) as card: # Генератор картинок
            try:
                await card.set_lang("ru")
                data1 = await card.create(uid=uid, style=2, force_update=True) # Генератор картинок
                key_id = data1.get_charter()
                kb = get_some_kb(key_id) # Создание кнопок
                await message.answer("", reply_markup=kb) #Кнопки , по нажатию которых должен отправляться callback
                for key in key_id.keys(): # Здесь просто для примера код, как я отправляю сразу все 8 картинок
                    file_path = f"ПУТЬ_К_КАРТИНКЕ/{uid}/{key}.png"
                    await message.answer(photo=FSInputFile(path=file_path))


def get_some_kb(some_dict: dict) -> InlineKeyboardMarkup: # Создание кнопок
                kb = InlineKeyboardBuilder()
                for key, value in some_dict.items():
                    kb.button(text=value, callback_data=f"{key}", 
                              url=None,
                              web_app=None, 
                              login_url=None, 
                              switch_inline_query=None, 
                              switch_inline_query_current_chat=None,
                              switch_inline_query_chosen_chat=None,
                              callback_game=None,
                              pay=None
                              )
                kb.adjust(2)
                return kb.as_markup() 

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

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

Как я понял вопрос, вам, в качестве обработки калбэков клавиатуры, сформированной функцией get_some_kb, нужно присылать пользователю картинку, и вопрос в том, как, получив в хэндлер callback, типа CallbackQuery, ответить на него сообщением.

У типа CallbackQuery есть поле message, которое хранит в себе сообщение, к которому была прикреплена клавиатура. Чтобы ответить на callback картинкой можно воспользоваться следующим кодом:

@router.message(
    StateFilter(None)
)
async def send_generated_image(callback: CallbackQuery, state: FSMContext) -> None:
    data = callback.data # Получаем данные нажатой кнопки
    # Генерируем изображение на основе полученных данных ...
    photo_file = types.FSInputFile('path\to\image.png')
    await callback.message.answer_photo(photo=photo_file)
→ Ссылка
Автор решения: Torrtozzo

Решил своим способом

@router.callback_query(
    StateFilter(Reg.name)
)
async def send_img(call: CallbackQuery, state: FSMContext) -> None:
    await state.set_state(None)
    data = await state.get_data()

    uid = data["name"]
    data2 = call.data
    print(data2) # Это просто знать какую картинку запросил юзер
    photo_file = FSInputFile(path=f"ПУТЬ{uid}/{call.data}.png")
    await call.message.answer_photo(photo=photo_file)
→ Ссылка