Как сделать кнопки в боте в ВК

Использовать callback

Мой первый пост. Будет кратко, емко и надеюсь актуально.

9го июля ВК выкатил callback кнопки для чат-ботов. Телеграм напрягся сделал это в 199. давно. Самая популярная библиотека для разработки чат-ботов под ВК на Python — vk_api (от разработчика python273). Ввиду того, что свежие правки в нее вносятся медленно, я взял на себя смелость сделать форк, дополнить его и описать небольшой пример использования.

Что сделано относительно исходной v11.80?

  1. Обновлены ограничения по клавиатуре (в соответствии с изменениями в API):
    • не более 5 кнопок в строке (было 4);
    • не более 10 и 6 строк для стандартного и inline представления соответственно (было 10 и там, и там);
    • Default кнопка переименована в Secondary.
    • Добавлены callback-кнопки:
      • новый тип события «message_event» (клик по кнопке);
      • новый метод «создать callback кнопку»;
      • добавлен example (анимация работы и код будут приведены ниже).

      [ВК чат-бот] Как создать кнопки в чат-боте ВКонтакте

      Виды callback кнопок

      У сallback кнопок 3 встроенных действия по клику (+ редактирование сообщения):

      1. show_snackbar — показать всплывающее сообщение (исчезает через 10 сек);
      2. open_link — открыть URL ссылку;
      3. open_app — открыть ВК приложение;
      4. можно настроить редактирование текущего сообщения, дабы по клику можно было изменять клавиатуру + текст в текущем сообщении.

      Как установить модифицированную библиотеку?

      pip install git+https://github.com/chebotarevmichael/vk_api

      Инструкция по настройке группы

      image

      Если вы никогда не создавали свой бот, то это будет полезно. Все остальные могут пропустить этот раздел.

      Код примера по частям

      Импорты. Думаю, с ними все понятно.

      from vk_api import VkApi from vk_api.utils import get_random_id from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType from vk_api.keyboard import VkKeyboard, VkKeyboardColor import json

      Настройка и запуск бота. Указываем идентификатор и longpoll-токен группы.
      Для использования кнопки «открыть ВК приложение» указываем идентификатор приложения и его владельца.

      # Общие GROUP_ID = ‘100. 500’ GROUP_TOKEN = ‘df2148cc7c664. токен_группы. df2148cc7c6642242531fad399’ API_VERSION = ‘5.120’ # для callback-кнопки «открыть приложение» APP_ID = 100500 # id IFrame приложения OWNER_ID = 123456 # id владельца приложения # виды callback-кнопок CALLBACK_TYPES = (‘show_snackbar’, ‘open_link’, ‘open_app’) # Запускаем бот vk_session = VkApi(token=GROUP_TOKEN, api_version=API_VERSION) vk = vk_session.get_api() longpoll = VkBotLongPoll(vk_session, group_id=GROUP_ID)

      Создаем два меню

      В первом меню — все 4 упомянутых выше действия кнопок.

      Полный гайд по кнопкам в вк


      Во втором — только кнопка «назад», возвращающая предыдущее меню.

      .

      # Настройки для обоих клавиатур settings = dict(one_time=False, inline=True) # №1. Клавиатура с 3 кнопками: «показать всплывающее сообщение», «открыть URL» и изменить меню (свой собственный тип) keyboard_1 = VkKeyboard(**settings) # pop-up кнопка keyboard_1.add_callback_button(label=’Покажи pop-up сообщение’, color=VkKeyboardColor.SECONDARY, payload=) keyboard_1.add_line() # кнопка с URL keyboard_1.add_callback_button(label=’Откртыть Url’, color=VkKeyboardColor.POSITIVE, payload=) keyboard_1.add_line() # кнопка по открытию ВК-приложения keyboard_1.add_callback_button(label=’Открыть приложение’, color=VkKeyboardColor.NEGATIVE, payload=) keyboard_1.add_line() # кнопка переключения на 2ое меню keyboard_1.add_callback_button(label=’Добавить красного ‘, color=VkKeyboardColor.PRIMARY, payload=) # №2.

      Клавиатура с одной красной callback-кнопкой. Нажатие изменяет меню на предыдущее. keyboard_2 = VkKeyboard(**settings) # кнопка переключения назад, на 1ое меню. keyboard_2.add_callback_button(‘Назад’, color=VkKeyboardColor.NEGATIVE, payload=)

      Запускаем long poll

      Запускаем действо. Если пользователь присылает текстовое сообщение — выдаем первое меню.

      Если это событие «клик по callback кнопке» — выполняем определенное действие (одно из 3+1 действий, упомянутых выше).

      f_toggle: bool = False for event in longpoll.listen(): # отправляем меню 1го вида на любое текстовое сообщение от пользователя if event.type == VkBotEventType.MESSAGE_NEW: if event.obj.message[‘text’] != »: if event.from_user: # Если клиент пользователя не поддерживает callback-кнопки, # нажатие на них будет отправлять текстовые # сообщения. Т.е. они будут работать как обычные inline кнопки. if ‘callback’ not in event.obj.client_info[‘button_actions’]: print(f’Клиент не поддерж. callback’) vk.messages.send( user_id=event.obj.message[‘from_id’], random_id=get_random_id(), peer_id=event.obj.message[‘from_id’], keyboard=keyboard_1.get_keyboard(), message=event.obj.message[‘text’]) # обрабатываем клики по callback кнопкам elif event.type == VkBotEventType.MESSAGE_EVENT: # если это одно из 3х встроенных действий: if event.object.payload.get(‘type’) in CALLBACK_TYPES: # отправляем серверу указания как какую из кнопок обработать.

      Это заложено в # payload каждой callback-кнопки при ее создании. # Но можно сделать иначе: в payload положить свои собственные # идентификаторы кнопок, а здесь по ним определить # какой запрос надо послать. Реализован первый вариант. r = vk.messages.sendMessageEventAnswer( event_id=event.object.event_id, user_id=event.object.user_id, peer_id=event.object.peer_id, event_data=json.dumps(event.object.payload)) # если это наша «кастомная» (т.е. без встроенного действия) кнопка, то мы можем # выполнить edit сообщения и изменить его меню.

      Но при желании мы могли бы # на этот клик открыть ссылку/приложение или показать pop-up. (см.анимацию ниже) elif event.object.payload.get(‘type’) == ‘my_own_100500_type_edit’: last_id = vk.messages.edit( peer_id=event.obj.peer_id, message=’ola’, conversation_message_id=event.obj.conversation_message_id, keyboard=(keyboard_1 if f_toggle else keyboard_2).get_keyboard()) f_toggle = not f_toggle if __name__ == ‘__main__’: print()

      Как выглядит процесс

      Заключение

      Тот факт, что callback-кнопки наконец-то появились в ВК — радует. И пусть пока они работают только под мобильными приложениями, а в браузере — не поддерживают. Пусть в браузере inline-кнопки все еще не выравнивается по ширине. Все же их наличие хоть в каком-то виде — искренне радует меня, как разработчика коммерческого телеграмм-бота.

      Теперь появилась возможность реализовать ВК-интерфейс для своего телеграм-бота, где в разы больше жителей РФ, т.е целевой аудитории. Этот факт заставляет мириться со всеми перечисленными неудобствами и минусами, и идти к горе, раз она не хочет идти к Магомеду. На скриншоте ниже реализация одного и того же интерфейса через callback-кнопки: справа в Телеграм, и слева — ВКонтакте.

      .

      Надеюсь, кому-то этот краткий обзор поможет начать использовать callback кнопки в своих ботах. Pull-request автору библиотеки отправлен.

      p.s. изменения влиты основной код.

      Источник: habr.com

      Как создать бота Вконтакте с кнопками (keyboard)

      В этой статье мы рассмотрим как просто и быстро создать кнопки для управления ботом. Кнопки упрощают использование бота и делают управление им удобнее, чем писать текстовые команды.
      Требования:
      PHP +5.6
      VK API v5.126

      Статья обновлена до последней версии API 5.126 на сегодняшний день.

      Мы будем использовать библиотеку для работы с API VK, скачать ее можете ниже
      simplevk-master.rar

      Загружаем папку с файлами на сервер, туда же где будем создавать файл, для работы бота нужен будет сервер, для начала можете использовать бесплатный, на сайте есть статья как запустить вк бота на бесплатном хостинге

      Создаем файл с названием bot.php в том же месте, где лежит наша библиотека и начинаем писать следующий код.

      setConfirm(ACCESS_KEY); // ТУТ НАШИ КНОПКИ === $btn_1 = $vk->buttonText(‘Кнопка 1’, ‘green’, [‘command’ => ‘btn_1’]); $btn_2 = $vk->buttonText(‘Кнопка 2’, ‘blue’, [‘command’ => ‘btn_2’]); $btn_3 = $vk->buttonText(‘Кнопка 3’, ‘red’, [‘command’ => ‘btn_3’]); $btn_4 = $vk->buttonText(‘Кнопка 4’, ‘white’, [‘command’ => ‘btn_4’]); // =================== $vk->initVars($peer_id, $message, $payload, $vk_id, $type, $data); // Инициализация переменных. Проще говоря библиотека сама создает нужные переменные, а в качестве примера ниже привели как бы пришлось писать переменные без инициализапции // ====== Наши переменные ============ //$peer_id = $data->object->peer_id;// Узнаем ID пользователя, кто написал нам //$message = $data->object->text; // Само сообщение от пользователя // ====== *************** ============

      Этот код мы писали ранее, в статье как создать простого бота вк, там же мы рассматривали как его подключать к сообществу.

      Теперь создаем переменные кнопок, в этой статье их будет всего 4, но по этим примерам, Вы с легкостью сможете добавить еще. В коде выше они уже есть

      $btn_1 = $vk->buttonText(‘Кнопка 1’, ‘green’, [‘command’ => ‘btn_1’]); $btn_2 = $vk->buttonText(‘Кнопка 2’, ‘blue’, [‘command’ => ‘btn_2’]); $btn_3 = $vk->buttonText(‘Кнопка 3’, ‘red’, [‘command’ => ‘btn_3’]); $btn_4 = $vk->buttonText(‘Кнопка 4’, ‘white’, [‘command’ => ‘btn_4’]);

      Рассмотрим их подробнее.
      $btn_1 — Название переменной, далее вызываем функцию из библиотеки и пишем параметры = $vk->buttonText(‘Кнопка 1’, ‘green’, [‘command’ => ‘btn_1’]); btn_1 название кнопки, «Кнопка 1» любой текст в кнопке, может повторятся, «green» цвет кнопки, всего доступно 4 варианта:
      green — Зеленый
      blue — Синий
      red — Красный
      white — Белый
      Теперь давайте вызовем кнопки и посмотрим как они смотрятся. Создаем проверку события на новое сообщение:

      if ($data->type == ‘message_new’) < // Создаем проверку на новое сообщение и вызываем кнопки $vk->sendButton($peer_id, «Вот список кнопок, выбирайте :-)», [[$btn_1, $btn_2, $btn_3, $btn_4]]); >

      Проверим работу в Вконтакте

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

      В код добавим переменную которая содержит текст сообщения и будем проверять, если это слово Начать, то покажем кнопки, все другое игнорируется.

      if ($data->type == ‘message_new’) < // Создаем проверку на новое сообщение и вызываем кнопки if ($message == ‘Начать’) < $vk->sendButton($peer_id, «Вот список кнопок, выбирайте :-)», [[$btn_1, $btn_2, $btn_3, $btn_4]]); > >

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

      if ($data->type == ‘message_new’) < // Создаем проверку на новое сообщение и вызываем кнопки if ($message == ‘Начать’) < $vk->sendButton($peer_id, «Вот список кнопок, выбирайте :-)», [[$btn_1, $btn_2, $btn_3, $btn_4]]); > if (isset($data->object->payload)) < //получаем payload $payload = json_decode($data->object->payload, True); > else < $payload = null; >$payload = $payload[‘command’]; // Теперь пишем действия с кнопками if ($payload == ‘btn_1’) $vk->sendMessage($peer_id, «Вы выбрали первую кнопку, любой ответ на это событие»); if ($payload == ‘btn_2’) $vk->sendMessage($peer_id, «Вы выбрали вторую кнопку, любой ответ на это событие»); if ($payload == ‘btn_3’) $vk->sendMessage($peer_id, «Вы выбрали третью кнопку, любой ответ на это событие»); if ($payload == ‘btn_4’) $vk->sendMessage($peer_id, «Вы выбрали четвертую кнопку, любой ответ на это событие»); if ($message == ‘Отключить’) $vk->sendButton($peer_id, «Кнопки скрыты, снова вызвать их, отправьте Начать, Ваш ID $vk_id», [[]]); >

      Сразу же сделали и скрытие кнопок по команде Отключить, кнопок может быть сколько угодно, отображать на странице за раз можно 10 кнопок, используя кнопки можно сделать переход в разные разделы и быстрое обращение к боту, исходник с библиотекой можете скачать в самом низу.
      Для того что бы выставить кнопки столбцом, а не в ряд, нужно:
      Заменить:

      $vk->sendButton($peer_id, «Вот список кнопок, выбирайте :-)», [[$btn_1, $btn_2, $btn_3, $btn_4]]);
      $vk->sendButton($peer_id, «Вот список кнопок, выбирайте :-)», [[$btn_1], [$btn_2], [$btn_3], [$btn_4]]);

      Получаем вот такой вариант:

      Вид кнопок может быть разным, что бы разместить 1 кнопку в столбец, 2 и 3 в строку, а 4 тоже в столбец, нужно взять в квадратные скобки 2 и 3 кнопки

      $vk->sendButton($peer_id, «Вот список кнопок, выбирайте :-)», [[$btn_1, [$btn_2, $btn_3], $btn_4]]);


      Я думаю с этим все понятно, дальше быстро пробежимся по запуску бота, не смотря на то, что на сайте уже есть статья на эту тему.
      Созданные файлы мы загружаем на хостинг, советую выделить для этого 100 рублей, цена 1 пачки сигарет, ну или 2 шоколадки 🙂 покупаем готовый хостинг, если не нужна база данных в будущем, то стоимость падает в 2 раза, до 40 рублей
      hostline
      Это стоимость на HostLine.ru

      Переходим в ISPManager прямо из личного кабинета

      Далее выбираем наш сайт, HostLine создает автоматически домен 3 уровня, и переходим в каталог

      И закачиваем наши 2 файла

      Теперь перейдя по нашему домену, в моем случае это http://vh328199.hostline.su/bot.php, если домен не отвечает, нужно немного подождать, пока ваш провайдер не начнет его видеть, обычно это занимает не более 24 часов.

      Теперь эту ссылку вставляем в настройки VK API самой группы

      И не забывайте включить Тип событий на входящие сообщения

      На этом все, задавайте свои вопросы в комментарии, обязательно ответим на них.
      keyboard_bot.rar

      Новость отредактировал: Сергей Котов — 23-03-2021, 18:03
      Причина: Статья обновлена до последней версии API 5.126 на момент редактирования.

      • Сергей Котов
      • 01.04.2019
      • 37 026
      • 50
      • 11

      Источник: kotoff.net

      В VK добавили Callback кнопки для ботов

      В VK добавили Callback кнопки для ботов

      2020-07-25 в 12:44, admin , рубрики: api, callback api, callback клавиатура, callback кнопки, python, Вконтакте API

      Использовать callback

      .

      Доброго времени суток, уважаемые жителя Хабра)
      Мой первый пост. Будет кратко, емко и надеюсь актуально.

      9го июля ВК выкатил callback кнопки для чат-ботов. Телеграм напрягся сделал это в 199. давно. Самая популярная библиотека для разработки чат-ботов под ВК на Python — vk_api (от разработчика python273). Ввиду того, что свежие правки в нее вносятся медленно, я взял на себя смелось сделать форк, дополнить его и описать небольшой пример использования.

      Что сделано относительно исходной v11.80?

      1. Обновлены ограничения по клавиатуре (в соответствии с изменениями в API):
        • не более 5 кнопок в строке (было 4);
        • не более 10 и 6 строк для стандартного и inline представления соответственно (было 10 и там, и там);
        • Default кнопка переименована в Secondary.
        • новый тип события «message_event» (клик по кнопке);
        • новый метод «создать callback кнопку»;
        • добавлен example (анимация работы и код будут приведены ниже).

        Виды callback кнопок

        У сallback кнопок 3 встроенных действия по клику (+ редактирование сообщения):

        1. show_snackbar — показать всплывающее сообщение (исчезает через 10 сек);
        2. open_link — открыть URL ссылку;
        3. open_app — открыть ВК приложение;
        4. можно настроить редактирование текущего сообщения, дабы по клику можно было изменять клавиатуру + текст в текущем сообщении.

        Как установить модифицированную библиотеку?

        pip install git+https://github.com/chebotarevmichael/vk_api

        Код примера по частям

        Импорты. Думаю, с ними все понятно.

        from vk_api import VkApi from vk_api.utils import get_random_id from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType from vk_api.keyboard import VkKeyboard, VkKeyboardColor import json

        Настройка и запуск бота. Указываем идентификатор и longpoll-токен группы.
        Для использования кнопки «открыть ВК приложение» указываем идентификатор приложения и его владельца.

        # Общие GROUP_ID = ‘100. 500’ GROUP_TOKEN = ‘df2148cc7c664. токен_группы. df2148cc7c6642242531fad399’ API_VERSION = ‘5.120’ # для callback-кнопки «открыть приложение» APP_ID = 100500 # id IFrame приложения OWNER_ID = 123456 # id владельца приложения # виды callback-кнопок CALLBACK_TYPES = (‘show_snackbar’, ‘open_link’, ‘open_app’) # Запускаем бот vk_session = VkApi(token=GROUP_TOKEN, api_version=API_VERSION) vk = vk_session.get_api() longpoll = VkBotLongPoll(vk_session, group_id=GROUP_ID)

        Создаем два меню.
        В первом меню — все 4 упомянутых выше действия кнопок.
        Во втором — только кнопка «назад», возвращающая предыдущее меню.

        В VK добавили Callback кнопки для ботов - 2

        .

        # Настройки для обоих клавиатур settings = dict(one_time=False, inline=True) # №1. Клавиатура с 3 кнопками: «показать всплывающее сообщение», «открыть URL» и изменить меню (свой собственный тип) keyboard_1 = VkKeyboard(**settings) # pop-up кнопка keyboard_1.add_callback_button(label=’Покажи pop-up сообщение’, color=VkKeyboardColor.SECONDARY, payload=) keyboard_1.add_line() # кнопка с URL keyboard_1.add_callback_button(label=’Откртыть Url’, color=VkKeyboardColor.POSITIVE, payload=) keyboard_1.add_line() # кнопка по открытию ВК-приложения keyboard_1.add_callback_button(label=’Открыть приложение’, color=VkKeyboardColor.NEGATIVE, payload=) keyboard_1.add_line() # кнопка переключения на 2ое меню keyboard_1.add_callback_button(label=’Добавить красного ‘, color=VkKeyboardColor.PRIMARY, payload=) # №2.

        Клавиатура с одной красной callback-кнопкой. Нажатие изменяет меню на предыдущее. keyboard_2 = VkKeyboard(**settings) # кнопка переключения назад, на 1ое меню. keyboard_2.add_callback_button(‘Назад’, color=VkKeyboardColor.NEGATIVE, payload=)

        Запускаем long poll.

        Запускаем действо. Если пользователь присылает текстовое сообщение — выдаем первое меню.

        Если это событие «клик по callback кнопке» — выполняем определенное действие (одно из 3+1 действий, упомянутых выше).

        f_toggle: bool = False for event in longpoll.listen(): # отправляем меню 1го вида на любое текстовое сообщение от пользователя if event.type == VkBotEventType.MESSAGE_NEW: if event.obj.message[‘text’] != »: if event.from_user: # Если клиент пользователя не поддерживает callback-кнопки, # нажатие на них будет отправлять текстовые # сообщения. Т.е. они будут работать как обычные inline кнопки. if ‘callback’ not in event.obj.client_info[‘button_actions’]: print(f’Клиент не поддерж. callback’) vk.messages.send( user_id=event.obj.message[‘from_id’], random_id=get_random_id(), peer_id=event.obj.message[‘from_id’], keyboard=keyboard_1.get_keyboard(), message=event.obj.message[‘text’]) # обрабатываем клики по callback кнопкам elif event.type == VkBotEventType.MESSAGE_EVENT: # если это одно из 3х встроенных действий: if event.object.payload.get(‘type’) in CALLBACK_TYPES: # отправляем серверу указания как какую из кнопок обработать.

        Это заложено в # payload каждой callback-кнопки при ее создании. # Но можно сделать иначе: в payload положить свои собственные # идентификаторы кнопок, а здесь по ним определить # какой запрос надо послать. Реализован первый вариант. r = vk.messages.sendMessageEventAnswer( event_id=event.object.event_id, user_id=event.object.user_id, peer_id=event.object.peer_id, event_data=json.dumps(event.object.payload)) # если это наша «кастомная» (т.е. без встроенного действия) кнопка, то мы можем # выполнить edit сообщения и изменить его меню.

        Но при желании мы могли бы # на этот клик открыть ссылку/приложение или показать pop-up. (см.анимацию ниже) elif event.object.payload.get(‘type’) == ‘my_own_100500_type_edit’: last_id = vk.messages.edit( peer_id=event.obj.peer_id, message=’ola’, conversation_message_id=event.obj.conversation_message_id, keyboard=(keyboard_1 if f_toggle else keyboard_2).get_keyboard()) f_toggle = not f_toggle if __name__ == ‘__main__’: print()

        Как выглядит процесс

        Заключение

        Тот факт, что callback-кнопки наконец-то появились в ВК — радует. И пусть пока они работают только под мобильными приложениями, а в браузере — не поддерживают. Пусть в браузере inline-кнопки все еще не выравнивается по ширине. Все же их наличие хоть в каком-то виде — искренне радует меня, как разработчика коммерческого телеграмм-бота.

        Теперь появилась возможность реализовать ВК-интерфейс для своего телеграм-бота, где в разы больше жителей РФ, т.е целевой аудитории. Этот факт заставляет мириться со всеми перечисленными неудобствами и минусами, и идти к горе, раз она не хочет идти к Магомеду. На скриншоте ниже реализация одного и того же интерфейса через callback-кнопки: справа в Телеграм, и слева — ВКонтакте.

        В VK добавили Callback кнопки для ботов - 4

        .

        Надеюсь, кому-то этот краткий обзор поможет начать использовать callback кнопки в своих ботах. Pull-request автору библиотеки отправлен.

        Источник: www.pvsm.ru

        Рейтинг
        ( Пока оценок нет )
        Загрузка ...