aiogram.utils.exceptions.BadRequest: Can't parse reply keyboard markup json object

Честно говоря, даже не знаю как задать данный вопрос так, чтобы меня не закидали здесь помидорами. Тут были уже аналогичные вопросы, но они не были подробны и соответственно ответа я никакого не нашёл для себя. Я учусь писать телеграмм бота на Python с помощью фреймворка aiogram. Всё шло вроде нормально, но потом я столкнулся с проблемой, когда хотел создать кнопки в боте. Кода многовато для поста, поэтому покажу пока только его часть. Если кому-то понадобится больше подробностей в случае если что-то будет неясно - залью остальную часть и скину ссылку. Скрипт в функциях клиентской части я пока убрал, кроме первой функции, поскольку там много кода для этого сообщения, и это к делу не относится. Бот разрабатывается в виртуальной среде venv.

Код 1 (создание кнопок)

from aiogram.types import ReplyKeyboardMarkup, KeyboardButton, ReplyKeyboardRemove

button_one = KeyboardButton('/start')
button_two = KeyboardButton('/help')
button_three = KeyboardButton('/weather')
button_four = KeyboardButton('/opening_hours')

keyboard_client = ReplyKeyboardMarkup()

keyboard_client.add(button_one).add(button_two).add(button_three).add(button_four)

Код 2 (клиентская часть, выводит сообщения для пользователя при введении определённых команд):

from aiogram import types, Dispatcher
from create_bot import disp, svbot
# create_bot - файл со скриптом создания бота (svbot = Bot(token=os.getenv('TOKEN')) disp = Dispatcher(svbot)
from keyboard import client_keyboard
# keyboard - папка со скриптами кнопок

import datetime
import requests
import time

async def start (m: types.Message):
    await m.answer(type(client_keyboard.keyboard_client))
    await m.answer(client_keyboard.keyboard_client)
    await svbot.send_message(m.from_user.id, 'Ну чё, поехали?', reply_markup=client_keyboard)



async def dnipro_weather(dw: types.Message):
    # выводит сообщение о сегодняшней погоде


async def help(messaga: types.Message):
    # помощь


async def open_close(m: types.Message):
    # показывает сообщение о часах работы магазина/заведения


def reg_handlers_client(disp: Dispatcher):
    disp.register_message_handler(start, commands=['start'])
    disp.register_message_handler(help, commands=['help'])
    disp.register_message_handler(dnipro_weather, commands=['weather'])
    disp.register_message_handler(open_close, commands=['opening_hours'])

Проблема состоит в атрибуте reply_markup=client_keyboard в первой функции. По идее с помощью этого атрибута должны были создаться кнопки в боте. Но вместо этого я получаю ошибку:

Task exception was never retrieved
future: <Task finished name='Task-9' coro=<Dispatcher._process_polling_updates() done, defined at C:\OpenServer\domains\bots.ant\venv\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:\OpenServer\domains\bots.ant\venv\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:\OpenServer\domains\bots.ant\venv\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 235, in process_updates
return await asyncio.gather(*tasks)
  File "C:\OpenServer\domains\bots.ant\venv\lib\site-packages\aiogram\dispatcher\handler.py", line 116, in notify
response = await handler_obj.handler(*args, **partial_data)
  File "C:\OpenServer\domains\bots.ant\venv\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 256, in process_update
return await self.message_handlers.notify(update.message)
  File "C:\OpenServer\domains\bots.ant\venv\lib\site-packages\aiogram\dispatcher\handler.py", line 116, in notify
response = await handler_obj.handler(*args, **partial_data)
  File "C:\OpenServer\domains\bots.ant\handlers\client.py", line 14, in start
await svbot.send_message(m.from_user.id, 'Ну чё, поехали?', reply_markup=client_keyboard)
  File "C:\OpenServer\domains\bots.ant\venv\lib\site-packages\aiogram\bot\bot.py", line 334, in send_message
result = await self.request(api.Methods.SEND_MESSAGE, payload)
  File "C:\OpenServer\domains\bots.ant\venv\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:\OpenServer\domains\bots.ant\venv\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:\OpenServer\domains\bots.ant\venv\lib\site-packages\aiogram\bot\api.py", line 115, in check_result
exceptions.BadRequest.detect(description)
  File "C:\OpenServer\domains\bots.ant\venv\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

Прочитав это, и полистав интернет, я понял, что должен был распарситься JSON объект, присвоенный переменной keyboard_client, который является основой для создания тех самых кнопок. Вот эта ошибка "Can't parse reply keyboard markup json object" - ума не приложу, почему она выскакивает. JSON объект, который должен парситься, выглядит так:

{"keyboard": [[{"text": "/start"}], [{"text": "/help"}], [{"text": "/weather"}], [{"text": "/opening_hours"}]]}

Вопрос: почему этот объект не парсится? В чём может быть проблема? Подскажите пожалуйста, потому что я даже не знаю, что тут можно попробовать.


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

Автор решения: Сергей Солдатов

Можно сократить код

button_one = KeyboardButton('/start')
button_two = KeyboardButton('/help')
button_three = KeyboardButton('/weather')
button_four = KeyboardButton('/opening_hours')

keyboard_client = ReplyKeyboardMarkup()

keyboard_client.add(button_one).add(button_two).add(button_three).add(button_four)


@dp.message_handler(Command('start'))
async def start (m: types.Message):
    await m.answer('Ну чё, поехали?', reply_markup=keyboard_client)


@dp.message_handler(Command('weather'))
async def dnipro_weather(m: types.Message):
    await m.answer('Ты в попал в хендлер dnipro_weather')

@dp.message_handler(Command('help'))
async def help(m: types.Message):
    await m.answer('Ты в попал в хендлер help')


@dp.message_handler(Command('opening_hours'))
async def open_close(m: types.Message):
    # показывает сообщение о часах работы магазина/заведения
    await m.answer('Ты в попал в хендлер open_close')
→ Ссылка
Автор решения: Feakso_dev

иногда может быть такое, когда забыли поставить ()

Вместо ("Hello World",reply_markup=config.get_rate)

Надо ("Hello World",reply_markup=config.get_rate())

→ Ссылка