Проблема с ИнлайнКлавиатурой модуля aiogram

Задумка: при команде /info бот присылает текст и инлайн кнопки.

  1. Код с кнопками:
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from keybords.callback_datas import edit_callback_data

info_keyboard = InlineKeyboardMarkup(row_width=2,
                                     inline_keyboard=[
                                         [
                                             InlineKeyboardButton(
                                                 text="Edit Name",
                                                 callback_data=edit_callback_data.new(edit_name="name")
                                             ),
                                             InlineKeyboardButton(
                                                 text="Edit Description",
                                                 callback_data=edit_callback_data.new(edit_name="dscrpt")
                                             )
                                         ],
                                         [
                                             InlineKeyboardButton(
                                                 text="Edit About",
                                                 callback_data=edit_callback_data.new(edit_name="about")
                                             ),
                                             InlineKeyboardButton(
                                                 text="Edit Botpic",
                                                 callback_data=edit_callback_data.new(edit_name="botpic")
                                             )
                                         ],
                                         [
                                             InlineKeyboardButton(
                                                 text="Edit Commands",
                                                 callback_data=edit_callback_data.new(edit_name="cmd")
                                             ),
                                             InlineKeyboardButton(
                                                 text="<-Back to Bot",
                                                 callback_data=edit_callback_data.new(edit_name="return_back")
                                             )
                                         ]
                                                    ]
                                    )
  1. Колбэк дата:
from aiogram.utils.callback_data import CallbackData

edit_callback_data = CallbackData("edit", "edit_name")
  1. Хэндлеры и регистрация хендлеров:
from aiogram import Dispatcher, types
from aiogram.types import CallbackQuery
from keybords.info_keyboard_buttons import info_keyboard
from keybords.callback_datas import edit_callback_data

async def bot_info(message: types.Message):
    await message.answer(text=r"Edit @Sberleadbot info.\nName: Бот для Заданий на Курсе Udemy\nDescription: ?\nAbout: ?\nBotpic: ? no botpic\nCommands: no commands yet",
                         reply_markup=info_keyboard)


async def bot_info_callback(call: CallbackQuery):
    await call.answer(cache_time=60)



def register_bot_info(dp: Dispatcher):
    dp.register_message_handler(bot_info, commands=["info"])
    dp.register_callback_query_handler(bot_info_callback, edit_callback_data.filter(edit_name=("name", "dscrpt", "about", "botpic", "cmd", "return_back")))

Регистрация хэндеров в самом боте сделана точно верно, проблема в коде выше.

После запуска и ввода /info в консоли выводит следующую ошибку:

future: <Task finished name='Task-15' coro=<Dispatcher._process_polling_updates() done, defined at C:\Users\Артём\AppData\Local\Programs\Python\Python310\lib\site-packages\aiogram\dispatcher\dispatcher.py:407> exception=BadRequest("Can't parse reply keyboard markup json object")>
Traceback (most recent call last):
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python310\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 415, in _process_polling_updates
    for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)):
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python310\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 235, in process_updates
    return await asyncio.gather(*tasks)
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python310\lib\site-packages\aiogram\dispatcher\handler.py", line 116, in notify
    response = await handler_obj.handler(*args, **partial_data)
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python310\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 256, in process_update
    return await self.message_handlers.notify(update.message)
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python310\lib\site-packages\aiogram\dispatcher\handler.py", line 116, in notify
    response = await handler_obj.handler(*args, **partial_data)
  File "C:\Users\Артём\Desktop\Programming\MyPython\Course of tbots\bot_with_buttons\handlers\bot_info.py", line 7, in bot_info
    await message.answer(text=r"Edit @Sberleadbot info.\nName: Бот для Заданий на Курсе Udemy\nDescription: ?\nAbout: ?\nBotpic: ? no botpic\nCommands: no commands yet",
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python310\lib\site-packages\aiogram\types\message.py", line 388, in answer
    return await self.bot.send_message(
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python310\lib\site-packages\aiogram\bot\bot.py", line 334, in send_message
    result = await self.request(api.Methods.SEND_MESSAGE, payload)
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python310\lib\site-packages\aiogram\bot\base.py", line 231, in request
    return await api.make_request(await self.get_session(), self.server, self.__token, method, data, files,
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python310\lib\site-packages\aiogram\bot\api.py", line 140, in make_request
    return check_result(method, response.content_type, response.status, await response.text())
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python310\lib\site-packages\aiogram\bot\api.py", line 115, in check_result
    exceptions.BadRequest.detect(description)
  File "C:\Users\Артём\AppData\Local\Programs\Python\Python310\lib\site-packages\aiogram\utils\exceptions.py", line 141, in detect
    raise cls(description)
aiogram.utils.exceptions.BadRequest: Can't parse reply keyboard markup json object

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

Автор решения: Дмитрий

До комментариев ещё не дорос, напишу в виде ответа.

Проблема в самой сборке клавиатуры. Сталкивался с похожей проблемой на ReplyKeyboardMarkup. Параметру 'keyboard=' не нравиться вид, в котором вы передали список кнопок.

Что бы убедиться, что проблема действительно в этом, можно каждую кнопку вынести в отдельную переменную и добавить любыми доступными способами.

info_keyboard = InlineKeyboardMarkup(row_width=2).add(b1). add(b2,b3)
b1 = InlineKeyboardButton(text="Edit Name", callback_data=edit_callback_data.new(edit_name="name")
# Полный список нужных кнопок

Можно воспользоваться генератором списков. Себе делал отдельную переменную со списком кнопок, и уже её передавал в параметр 'keyboard'. На ReplyKeyboardMarkup генератор работает следующим образом:

button_set = {'кнопка1', 'кнопка2', 'кнопка 3'}
button_list = [[KeyboardButton(button)] for button in button_set]
keyboard = ReplyKeyboardMarkup(keyboadr=button_list)

Вам нужно только понять как именно передать данные в генератор. Метод "проб и ошибок в помощь". Думаю у Вас всё получиться=).

Попробовал воспроизвести у себя, первый вариант точно работает. Вот код:

from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from aiogram.utils.callback_data import CallbackData

edit_callback_data = CallbackData("edit", "edit_name")

b1 = InlineKeyboardButton(text="Edit Name", callback_data=edit_callback_data.new(edit_name="name"))
b2 = InlineKeyboardButton(text="Edit Description", callback_data=edit_callback_data.new(edit_name="dscrpt"))
b3 = InlineKeyboardButton(text="Edit About", callback_data=edit_callback_data.new(edit_name="about"))
info_keyboard = InlineKeyboardMarkup(row_width=2,).add(b1,b2,b3)

Вот вывод клавиатуры в хендлере, в другом модуле:

'декораторов нет, есть отдельный регистратор функции'
async def start(message: types.Message):
    try:
        await bot.send_message(message.from_user.id,
                           'Для того, чтобы загрузить фотоотчёт, нажмите 
                            соответствующую кнопку на Вашем экране!',
                           reply_markup=client_kb.info_keyboard)
    except:
        await message.reply(f'Для общения с ботом перейдите по ссылке: \nhttps://t.me/Какой_то_bot \n и нажмите: "ЗАПУСТИТЬ"')

Вот что имеем на выходе: введите сюда описание изображения

Возможно поможет импорт клавиатуры и кнопок из aiogram.types, а не из telegram.

→ Ссылка