python273 / vk_api

Модуль для создания скриптов для ВКонтакте | vk.com API wrapper
https://pypi.org/project/vk-api/
Apache License 2.0
1.33k stars 321 forks source link

Keyboard didn`t work in messages.send() #353

Closed Jeeeeeeeeeja closed 4 years ago

Jeeeeeeeeeja commented 4 years ago

Trying to send keyboard, there is an error 'vk_api.exceptions.ApiError: [100] One of the parameters specified was missing or invalid: keyboard contains incorrect JSON' even if I send empty one. image image I found nothing about this error in the internet and documentation. Also I tried, to send keyboard from examples, the same error.

Окружение

vk_api: 11.8.0

API: 5.103

Пример

bot = vk_api.VkApi(token=TOKEN)
longpoll = VkBotLongPoll(bot, GROUP_ID)
vk = bot.get_api()
empty_keyboard = {"buttons": [], "one_time": True}
vk.messages.send(peer_id=peerid,
                 keyboard=empty_keyboard,
                 message='test',
                 random_id=rd.randint(0, 10000000))
edwardgushchin commented 4 years ago

Если мне не изменяет память, клавиатуру нужно пропускать через json.dumps

Jeeeeeeeeeja commented 4 years ago

Я пробовал и через keyboard = VkKeyboard(), там если память не изменяет, уже само всё пропускается, такая же проблема. Возможно это из-за ранее созданной клавиатуры, в которой я случайно поставил флаг "one_time": True, но как её тогда удалить?

edwardgushchin commented 4 years ago

Возможно это из-за ранее созданной клавиатуры, в которой я случайно поставил флаг "one_time"

Нет, проблема точно не в этом. Сейчас пересмотрел свой код, вот пару советов:

  1. Заменить двойные кавычки на одинарные
  2. Переместить блок с кнопками после ключа 'one_time'
  3. Все таки нужно keyboard оборачивать в json.dumps, это важно
  4. На будущее, в payload можно засунуть все что угодно, туда json тоже дополнительно нужно оборачивать в json.dumps.

Попробуйте следующий код:

empty_keyboard = {'one_time': False, 'buttons': []}
vk.messages.send(peer_id=peerid,
    keyboard=json.dumps(empty_keyboard),
    message='test',
    random_id=rd.randint(0, 10000000)
)

но как её тогда удалить?

Удалить никак, только отправить пустую клавиатуру.

Jeeeeeeeeeja commented 4 years ago

Ну я через longpoll работаю, а payload это для callback api вроде, сейчас попробую ваше решение и отпишу

Jeeeeeeeeeja commented 4 years ago

Да, надо было оборачивать. Спасибо огромное за помощь!