aiogram пагинатор обновляет только последнее сообщение

Подскажите, пожалуйста, как исправить пагинацию. Пишу бота для поиска отелей по ценовым категориям. Бот умеет парсить с API информацию об отеле и выводить информацию и фото в чат телеграм бота. Суть проблемы: Если несколько отелей, то список, в котором находятся фото, обновляется и с помощью инлайн кнопок листаются только фото последнего отеля функция получения фото

async def get_photo(hotel_id):
async with aiohttp.ClientSession() as session:
    url = "https://hotels4.p.rapidapi.com/properties/get-hotel-photos"

    querystring = {'id': hotel_id}
    async with session.get(url, headers=headers, params=querystring) as response:
        result = await response.json()
        photo = result.get('roomImages')[0].get('images')
        photo_list = list()
        main_photo = result.get('hotelImages')
        count = 0

        for i in main_photo:
            if count != 5:
                photo_url = i.get('baseUrl').replace('{size}', 'z')
                photo_list.append({'image_url': photo_url})
                count += 1
            else:
                break

        for i_photo in photo:
            photo_url = i_photo.get('baseUrl').replace('{size}', 'z')
            photo_list.append({'image_url': photo_url})

        return photo_list

она возвращает список с словарями в формате [{"image_url": "https://exp.cdn-hotels.com/hotels/37000000/36790000/36789900/36789845/d4aada11_z.jpg"},{"image_url": "https://exp.cdn-hotels.com/hotels/37000000/36790000/36789900/36789845/d4aada11_z.jpg"}]

Клавиатура

    def get_photo_keyboard(photo_dict: dict, page: int = 0) -> InlineKeyboardMarkup:
keyboard = InlineKeyboardMarkup(row_width=1)
has_next_page = len(photo_dict) > page + 1

if page != 0:
    keyboard.add(
        InlineKeyboardButton(
            text="< Назад",
            callback_data=photo_callback.new(page=page - 1)
        )
    )

keyboard.add(
    InlineKeyboardButton(
        text=f"• {page + 1}",
        callback_data="dont_click_me"
    )
)

if has_next_page:
    keyboard.add(
        InlineKeyboardButton(
            text="Вперёд >",
            callback_data=photo_callback.new(page=page + 1)
        )
    )

return keyboard

она с помощью фабрики колбеков переключает фотки

вот сама фабрика колбеков

    photo_callback = CallbackData("Photo", "page")

вот хендлеры, первый реагирует на кнопку "Да" при вопросе "Вывести фотографии?" и выдает ту самую инлайн клавиатуру с фотками

    @dp.callback_query_handler(lambda call: call.data == 'Да', state=LowPrice.photo)
    async def send_hotels_with_photo(callback: CallbackQuery, state: FSMContext):
        photo = callback.data
        await state.update_data(photo=photo)
        try:
           data = await state.get_data()
           await callback.message.answer('Приступаю к поиску ?')
           await callback.message.delete_reply_markup()
           id_city = data.get('id_city')
           days_quantity = (data['departure_date'] - data['arrival_date']).days
           hotels = await lowprice(data, id_city, days_quantity)
           for hotel in hotels:
               hotel_id = hotel[0]
               photo_dict = await get_photo(hotel_id)
               await state.update_data(days_quantity=days_quantity,
                                       hotels=hotels,
                                       images=photo_dict)
            photo_data = photo_dict[0]
            photo_keyboard = get_photo_keyboard(photo_dict)  # Page: 0
            a = await bot.send_photo(
                chat_id=callback.message.chat.id,
                photo=photo_data.get("image_url"),
                parse_mode="HTML",
                reply_markup=photo_keyboard
            )

            await callback.message.answer(f'Название отеля: {hotel[1]}'
                                          f'\nАдрес: {hotel[2]}'
                                          f'\nРасстояние до центра города: {hotel[3]}'
                                          f'\nРейтинг отеля: {hotel[4]} ⭐️'
                                          f'\nЦена за ночь: {hotel[5]} ₽'
                                          f'\nЦена за весь период: {hotel[6]} ₽'
                                          f'\nСсылка на номер: {hotel[7]}')

        except JSONDecodeError:
            await callback.message.answer('Не получилось найти данные по введенному городу, попробуйте снова.\n'
                                          'Для этого пропишите команду /lowprice')
            await state.finish()
        except TypeError:
            await callback.message.answer('В ходе поиска возникла ошибка, попробуйте снова.\n'
                                          'Для этого пропишите команду /lowprice')
            await state.finish()


    @dp.callback_query_handler(photo_callback.filter(), state='*')
    async def photo_page_handler(query: CallbackQuery, callback_data: dict, state: FSMContext):
        data = await state.get_data()
        photo_dict = data.get('images')
        page = int(callback_data.get("page"))
        photo_data = photo_dict[page]
        keyboard = get_photo_keyboard(photo_dict, page)

        photo = InputMedia(type="photo", media=photo_data.get("image_url"))
        await query.message.edit_media(photo, keyboard)
        await state.reset_state(with_data=False)

второй хендлер ловит нажатие кнопки и меняет фото

вся проблема в том, что когда выводится несколько отелей, список с фотками обновляется, соответственно полный набор фоток только у последнего отеля. У остальных только первая фотка от своего отеля, а остальные фото от последнего. Наведите, пожалуйста, на правильную мысль. Заранее благодарю


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