Callback-кнопки позволяют отслеживать нажатие кнопки пользователем и выполнять какие-либо действий без отправки сообщения. Как ими пользоваться и как их сделать - разберем в этой статье. Плюсом добавим боту кнопки для отправки своего местоположения, перевода денег и link-кнопку.
Шаг 1: Скрипт
Обычно я начинаю с настройки группы, но сегодня отложу это на потом - на конец статьи.
Так-с, и для начала качаем последний бета-релиз библиотеки SimpleVK:
Либо подключаем через composer:
composer require digitalstars/simplevk:dev-testing --ignore-platform-reqs
Теперь нужно создать файл php и написать несколько строк кода. Пока нам нужно подключить библиотеки, авторизоваться и инициализировать нужные нам переменные:
<?php
require_once __DIR__ . '/vendor/digitalstars/simplevk/autoload.php'; // Подключение библ
$vk = \DigitalStars\SimpleVK\SimpleVK::create( 'Токен сообщества, создадим на 2-м шаге', 'Версия VK API' ) // Авторизация через токен сообщества ->setConfirm( 'Строка, которую должен вернуть сервер' ) // Подтверждение callback-сервера
->setUserLogError( 294485732 ) // Установка айди юзера ВК, которому будут отправляться уведы об ошибках
->initType( $type ) // Инициализация типа события
->initText( $text ) // Инициализация текста сообщения
->initPayload( $payload ); // Инициализация пэйлоулда
В предыдущих статьях мы инициализировали переменные методом initVars(), однако в текущей версии библиотеки появилась возможность "точечной" инициализации каждой переменной по отдельности. Мне пригодится тип события initType( $type ), тест сообщения initText( $text ) и payload initPayload( $payload ).
Тут можно заметить ещё один метод - метод setUserLogError( $id ). Используется для отправки уведомлений об ошибках конкретному человеку ($id - айди страницы ВКонтакте). Метод необязателен, поэтому можно оставить, а можно и убрать. Мне лично удобнее оставлять 🙂
Далее создам команду '/кнопки' для отправки ботом клавиатуры пользователям:
if ( $type == 'message_new' )
{
if ( $text == '/кнопки' )
{
// Тут продолжим писать код
}
}
Чтобы инициализировать Callback-кнопку нужно воспользоваться методом buttonCallback( $text, $color, $payload ). Принимает 3 параметра - текст кнопки, её цвет, а также payload в виде ассоциативного массива:
$btn_callback = $vk->buttonCallback( 'Callback-кнопка', 'green', [ 'command' => 'btn_callback' ] );
Есть ещё несколько методов для создания кнопок, рассмотрим их тоже:
Я же много кнопок клепать не буду, сделаю только 4:
$btn_callback = $vk->buttonCallback( 'Callback-кнопка', 'green', [ 'command' => 'btn_callback' ] );
$btn_donate = $vk->buttonDonateToUser( 123 );
$btn_location = $vk->buttonLocation();
$btn_link = $vk->buttonOpenLink( 'https://kotoff.net', 'Перейти' );
Ну, и осталось отправить клавиатуру пользователю:
$vk->msg( 'Твои кнопки:' )->kbd( [ [ $btn_callback ], [ $btn_donate ], [ $btn_location ], [ $btn_link ] ] )->send();
С помощью метода msg() формируем текст сообщения, метод kbd() создаёт "сетку" с кнопками, а метод send() отправляет всё это дело юзеру. Кстати для метода kbd( $keyboard = array(), $inline = false, $one_time = false ) в данном случае можно указать ещё и второй параметр ($inline = true), чтобы кнопки отправились в inline-формате.
При нажатии на кнопку будем отправлять пользователю всплывающие уведомление с помощью метода eventAnswerSnackbar( $text ). Чтобы отследить нажатие на кнопку создадим через elseif (после проверки на message_new) такую же проверку, но уже не на входящее, а на действие с сообщением (message_event). Также делаю проверку по payload (напомню, у нас он такой: [ 'command' => 'btn_callback' ]):
else if ( $type == 'message_event' )
{
if ( $payload['command'] == 'btn_callback' )
{
$vk->eventAnswerSnackbar( 'Привет!' );
}
}
Весь код:
<?php
require_once __DIR__ . '/vendor/digitalstars/simplevk/autoload.php'; // Подключение библ
$vk = \DigitalStars\SimpleVK\SimpleVK::create( 'Токен сообщества', 'Версия API' ) // Авторизация через токен сообщества
->setConfirm( 'Строка, которую должен вернуть сервер' ) // Подтверждение callback-сервера
->setUserLogError( 294485732 ) // Установка айди юзера ВК, которому будут отправляться уведы об ошибках
->initType( $type ) // Инициализация типа события
->initText( $text ) // Инициализация текста сообщения
->initPayload( $payload ); // Инициализация пэйлоулда
if ( $type == 'message_new' )
{
if ( $text == '/кнопки' )
{
$btn_callback = $vk->buttonCallback( 'Callback-кнопка', 'green', [ 'command' => 'btn_callback' ] );
$btn_donate = $vk->buttonDonateToUser( 294485732 );
$btn_location = $vk->buttonLocation();
$btn_link = $vk->buttonOpenLink( 'https://kotoff.net', 'Перейти' );
$vk->msg( 'Твои кнопки:' )->kbd( [ [ $btn_callback ], [ $btn_donate ], [ $btn_location ], [ $btn_link ] ] )->send();
}
}
else if ( $type == 'message_event' )
{
if ( $payload['command'] == 'btn_callback' )
{
$vk->eventAnswerSnackbar( 'Привет!' );
}
}
Шаг 2: Настройки группы
1. Создаём токен, выставляем права доступа на сообщения сообщества и вставляем его в код:
2. Выбираем версию API, указываем ссылку на бота, копируем и вставляем в код строку, которую должен вернуть сервер. После сохранения скрипта у себя на сервере - жмём кнопку подтвердить:
3. Выбираем необходимые нам типы событий (входящие и действия с сбщ):
4. Не забываем включить сообщения сообщества и возможности для ботов:
Шаг 3: Заключение
Осталось протестировать:
Нашли ошибку?
Вы можете сообщить об этом администрации.
Выделив текст нажмите CTRL+Enter