Telegram Bot ошибка aiogram.exceptions.TelegramBadRequest: Telegram server says - Bad Request: message is not modified
Допишу ответ исключения "указанное содержание нового сообщения и разметка ответа(reply_markup) в точности совпадают с текущим содержанием и разметкой ответа сообщения" Суть задачи, при нажатии на reply-кнопку обновить текущую клавиатуру reply_markup, если кол-во кнопок в ней изменилось. У меня есть метод tablesAsKeyboard(), который динамически создает reply-кнопки с именами таблиц из моей базы данных, которые я спарсил при помощи метода get_tables(). tablesAsKeyboard() я вызываю в методе-заголовке set_currentTable(), который помогает определить какую таблицу для просмотра/редактирования пользователь выбрал. Так же в боте есть функция создать новую таблицу... Дак вот, если пользователь не создавал новых таблиц, но нажал кнопку "Обновить список", то сервер телеграма выдает ошибку, что я пытаюсь заменить клавиатуру, которая уже актуальна, то есть смысла обновлять по идее нет, так как она точно такая же, поэтому я сделал дополнительную проверку if new_reply_markup != current_reply_markup:, дабы избежать этого исключения, но ошибка сохраняется, ПАМАГИТЕ), вот код:
## модуль data_query.py
@try_connect
def get_tables(curs: cursor) -> list:
curs.execute(""" SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public' """)
tablelist = curs.fetchall()
tables = [table[0] for table in tablelist]
return tables
## Модуль keyboard.py
async def tablesAsKeyboard():
tablesKeyboard = InlineKeyboardBuilder()
tables = get_tables()
for table in tables:
tablesKeyboard.add(InlineKeyboardButton(text=table, callback_data=f"{table}"))
tablesKeyboard.add(InlineKeyboardButton(text="Обновить список", callback_data="update_menu"))
return tablesKeyboard.adjust(2).as_markup()
## Модуль handler.py где я и вызываю reply клавиатуру
@router.message(F.text == "Редактировать таблицу")
async def update_table(message: Message, state: FSMContext):
await state.set_state(PostgresDBconnect.currentTable)
await message.answer("Список доступных таблиц:", reply_markup= await kb.tablesAsKeyboard())
@router.message(PostgresDBconnect.currentTable)
@router.callback_query(TableCallbackFilter(get_tables()))
async def set_currentTable(callback: CallbackQuery, state: FSMContext):
current_reply_markup = callback.message.reply_markup
if callback.data == "update_menu":
await state.update_data(currentTable = None)
new_reply_markup = await kb.tablesAsKeyboard()
if new_reply_markup != current_reply_markup:
await callback.message.edit_reply_markup(reply_markup=new_reply_markup)
await callback.answer("Список сущностей обновлён!")
else:
await callback.answer("Список сущностей не обновлён, так он еще актуален!")
else:
await state.update_data(currentTable = callback.data)
await callback.answer(f"Таблица {callback.data} выбрана!")
await state.clear()
```[![При нажатии на Обновить список, хочу обновить клавиатуру, если кол-во таблиц в бд изменилось][1]][1]
[1]: https://i.sstatic.net/M0LijZpB.png
Ответы (1 шт):
P.s. я часа 3 мучил gpt-бота и в итоге выяснил, что я сравнивал объекты разметок клавиатур, а не кнопки, далее тупил и сравнивал объекты кнопок, что тоже не помогло и в итоге извлек кортеж в виде ("текст_кнопки", "callback_data"). Вместо того, чтобы сравнивать объекты кнопок, что я делал неумышленно, сравнил их по содержимому, что изначально и планировал.
## в модуле keyboard.py объявил списковое включение, которое проходит по всем строкам разметки,
## при этом в каждой строке проходит по кнопке и собирает параметры text= и callback_data=
def extract_button_data(reply_markup):
return [
[(button.text, button.callback_data) for button in row]
for row in reply_markup.inline_keyboard
]
## Теперь метод-заголовок обновляющий список кнопок выглядит так:
@router.message(PostgresDBconnect.currentTable)
@router.callback_query(TableCallbackFilter(get_tables()))
async def set_currentTable(callback: CallbackQuery, state: FSMContext):
current_reply_markup = kb.extract_button_data(callback.message.reply_markup)
if callback.data == "update_menu":
await state.update_data(currentTable = None)
new_reply_markup = kb.extract_button_data(await kb.tablesAsKeyboard())
if new_reply_markup != current_reply_markup:
await callback.message.edit_reply_markup(reply_markup=new_reply_markup)
await callback.answer("Список сущностей обновлён!")
else:
await callback.answer("Список сущностей не обновлён, так он еще актуален!")
else:
await state.update_data(currentTable = callback.data)
await callback.answer(f"Таблица {callback.data} выбрана!")
await state.clear()