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)
второй хендлер ловит нажатие кнопки и меняет фото
вся проблема в том, что когда выводится несколько отелей, список с фотками обновляется, соответственно полный набор фоток только у последнего отеля. У остальных только первая фотка от своего отеля, а остальные фото от последнего. Наведите, пожалуйста, на правильную мысль. Заранее благодарю