Как отправлять картинки через 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 шт):
Как я понял вопрос, вам, в качестве обработки калбэков клавиатуры, сформированной функцией 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)
Решил своим способом
@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)