Не работает код для клавиатуры vk-api python

Здравствyйте, я нашёл в интернете код через который можно в лс группы вконтакте добавить клавиатуру. Почему то этот код запускается без ошибок но в лс бота после отправки сообщения с текстом 'клавиатура' клавиатура не появляется.

import vk_api
import time
import json

token = "токен"

vk = vk_api.VkApi(token=token)

vk._auth_token()


def get_button(label, color, payload=""):
    return {
        "action": {
            "type": "text",
            "payload": json.dumps(payload),
            "label": label
        },
        "color": color
    }


keyboard = {
    "one_time": False,
    "buttons": [

    get_button(label="Кнопка 1", color="positive"),        
    get_button(label="Кнопка 2", color="negative"),        
    get_button(label="Кнопка 3", color="primary"),        
    get_button(label="Кнопка 4", color="default")        

    ]
}

keyboard = json.dumps(keyboard, ensure_ascii=False).encode('utf-8')  
keyboard = str(keyboard.decode('utf-8'))

while True:
    try:
        messages = vk.method("messages.getConversations", {"offset": 0, "count": 20})
        if messages["count"] >= 1:
            id = messages["items"][0]["last_message"]["from_id"]
            body = messages["items"][0]["last_message"]["text"]
            if body == "привет":
                vk.method("messages.send", {"peer_id": id, "message": "Привет друг"})
            elif body == "клавиатура":
                vk.method("messages.send", {"peer_id": id, "message": "Выберите кнопку!", "keyboard": keyboard})
            elif body == "Кнопка 1":
                vk.method("messages.send", {"peer_id": id, "message": body})
            elif body == "Кнопка 2":
                vk.method("messages.send", {"peer_id": id, "message": body})
            elif body == "Кнопка 3":
                vk.method("messages.send", {"peer_id": id, "message": body})                                            
            elif body == "Кнопка 4":
                vk.method("messages.send", {"peer_id": id, "message": body}) 
            elif body == "Начать":
                vk.method("messages.send", {"peer_id": id, "message": "Начнем"}) 
            else:
                vk.method("messages.send", {"peer_id": id, "message": "Не понял тебя!"})
        time.sleep(0.5)
    except Exception as E:
        time.sleep(1)

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

Автор решения: Rufat

Возможно поможет замена строки:

body = messages["items"][0]["last_message"]["text"]

на следующую:

body = messages["items"][0]["last_message"]["text"].lower()
→ Ссылка
Автор решения: Михаил Муругов

В библиотеке vk_api уже есть методы, позволяющие работать с клавиатурой. Не изобретайте велосипед

from vk_api.keyboard import VkKeyboard, VkKeyboardColor

keyboard = VkKeyboard(one_time=False)
keyboard.add_button(label="Кнопка 1", color=VkKeyboardColor.POSITIVE)  # Зелёный цвет
keyboard.add_line()  # Следующие кнопки будут под этой
keyboard.add_button(label="Кнопка 2", color=VkKeyboardColor.PRIMARY)  # Синий цвет
keyboard.add_button(label="Кнопка 3", color=VkKeyboardColor.DEFAULT)  # Белый цвет

# ...

vk.method("messages.send",
    {
        "peer_id": id,
        "message": "Выберите кнопку!",
        "keyboard": keyboard.get_keyboard()  # Возвращает JSON нашей клавиатуры
    }
)


Если хотите по-своему, то:

  • Во-первых, замените значение параметра payload по умолчанию на None, потому что пустая строка и None это разные вещи.
def get_button(label, color, payload=None):
  • Во-вторых, поле buttons должно содержать список списков, где список первого уровня это ряды, а списки второго уровня это кнопки в ряду.
keyboard = {
    "one_time": False,
    "buttons": [
        [  # Эти кнопки будут в первом ряду
            get_button(label="Кнопка 1", color="positive"),        
            get_button(label="Кнопка 2", color="negative"),        
            get_button(label="Кнопка 3", color="primary")
        ],
        [  # Эта кнопка будет во втором ряду
            get_button(label="Кнопка 4", color="default")        
        ]
    ]
}
→ Ссылка