Как при нажатии на кнопку изменить текущее сообщение aiogram
Есть список карточек с кроликами (порода, цена и фото) и при нажатии на инлайн-кнопку 'показать' выводились все карточки. Я хочу сделать так, чтобы при нажатии на инлайн-кнопку 'показать' присылалось первая карточка и инлайн-кнопка 'следующий', при нажатии сообщение бы изменялось(не присылалось новое!) и так далее.
Вот как сейчас реализован вывод всех карточек. В 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)
Источник: Stack Overflow на русском