Как при нажатии на кнопку изменить текущее сообщение aiogram

Рейтинг: 1Ответов: 0Опубликовано: 10.02.2023

Есть список карточек с кроликами (порода, цена и фото) и при нажатии на инлайн-кнопку 'показать' выводились все карточки. Я хочу сделать так, чтобы при нажатии на инлайн-кнопку 'показать' присылалось первая карточка и инлайн-кнопка 'следующий', при нажатии сообщение бы изменялось(не присылалось новое!) и так далее.

Вот как сейчас реализован вывод всех карточек. В data лежат именованные кортежи с инфой

from aiogram import Bot, Dispatcher, executor, types
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher.filters import Text


bot = Bot(token='')
dp = Dispatcher(bot, storage=storage)

key = InlineKeyboardMarkup().add(InlineKeyboardButton('rabbits', callback_data='breed'))

async def empty(message: types.Message):
    await bot.send_message(message.from_user.id, 'asd', reply_markup=key)


async def show_rabbit(call: types.CallbackQuery):
    data = [['price0', 'name0', 'url_img'0], ['price1', 'name1', 'url_img1']]  # Эти данные парсятся, когда выбирается порода

    await bot.send_photo(
        call.from_user.id,
        'https://tsarskiykrolik.com/wp-content/uploads/2023/02/bel-600x600.jpg',
        f'{data[0][0]}'
        f'{data[0][1]}',
        reply_markup=InlineKeyboardMarkup().add(InlineKeyboardButton('Следующий', callback_data='?'))
    )




if __name__ == '__main__':
    dp.register_message_handler(empty)
    dp.register_callback_query_handler(show_rabbit, Text(startswith=('breed')))
    executor.start_polling(dp)

Подскажите пожалуйста, версия aiogram 2.x. При нажатии инлайн кнопки сообщение должно меняться с данных с условным постфиксом 0, на постфикс 1(фотка тоже должна изменяться)

Я реализовал что-то подобное, но список p в реальной ситуации парсится и я не знаю где его можно сохранить

from aiogram import Bot, Dispatcher, executor, types
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton, InputMediaPhoto
from aiogram.contrib.fsm_storage.memory import MemoryStorage


bot = Bot(token='')
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)


@dp.message_handler(commands=['test'])
async def test_edit(message: types.Message):
    await bot.send_photo(
        message.from_user.id,
        'https://avatars.mds.yandex.net/i?id=a707b920e4b006e4c9dfcd6cf9e121d79191634c-7764851-images-thumbs&n=13',
        'text1',
        reply_markup=InlineKeyboardMarkup().add(InlineKeyboardButton('next', callback_data='next'))
    )


s = [1, 2, 3, 4, 5]
p = ['https://tsarskiykrolik.com/wp-content/uploads/2022/11/rubin-600x600.jpg',
     'https://i.pinimg.com/736x/28/f4/af/28f4afa16adca54153c600a0ea5f63af.jpg']
i = 0


@dp.callback_query_handler()
async def test_call(call: types.CallbackQuery):
    global i

    await bot.edit_message_media(
        chat_id=call.message.chat.id,
        message_id=call.message.message_id,
        media=InputMediaPhoto(media=p[i])

    )

    await bot.edit_message_caption(
        caption=f'{s[i]}',
        chat_id=call.message.chat.id,
        message_id=call.message.message_id,
        reply_markup=InlineKeyboardMarkup().add(InlineKeyboardButton('next1', callback_data='next'))
    )
    i += 1
    await call.answer()

if __name__ == '__main__':
    executor.start_polling(dp)

Ответы

Ответов пока нет.