Как сделать кнопки быстрых ответов(keyboard) для ботов в ВК
Недавно Вконтакте опубликовала новый функционал для ботов ВК — кнопки быстрых ответов или же keyboard.
ВАЖНО! Более свежая версия статьи находится здесь
Наша команда «ботописцев» сразу заинтересовалась этим нововведением и начала изучать официальную API, чтобы рассказать вам и показать подробную инструкцию по созданию бота использующего keyboard. В ходе этой статьи получится бот, посмотреть работу которого вы можете в нашей группе GameTips в ВК. Так же вы можете присоединиться к беседе-комьюнити в вк, где вам могут помочь с возникшей проблемой.
Оглавление:
- Создание и настройка сообщества
- Настройка сервера
- Как работает Callback API и keyboard
- Работа с библиотекой
- Полный код бота
- Поехали!
- FAQ
Создание и настройка сообщества
После создания сообщества в ВК проследуйте по этому пути:
«Управление сообществом» →«Сообщения» и включите диалоги сообщества. Теперь в подменю «Настройки для бота» включите «Возможности ботов» и кнопку «Начать».
Писать будем используя Сallback api(отправляет каждое действие в сообществе по отдельности на сервер). Поэтому его тоже следует настроить. Переходим в
«Управление сообществом» →»Работа с API». Для работы бота нужно зарегистрировать ключ доступа. Нажимаете «Создать ключ» и выбираете необходимые права доступа, для этого бота нужны только права на сообщения. Подтверждаем номер телефона и сохраняем куда нибудь ключ доступа. Теперь переходим во вкладку Callback API. Ставим свое название сервера и выбираем последнюю версию API(на данный момент она 5.80, и именно с ней ниже представленный бот будет работать 100%) . Во вкладке «Типы запросов» выбираем только входящие сообщения.
Настройка сервера
Теперь вам понадобится сервер для хостинга своего бота. Вы можете использовать бесплатные хостинги, например 000webhost.
Если вы будете использовать дешевые/бесплатные хостинги, то вероятнее всего на них будет отключен cURL(вы не сможете отправлять ботом медиа файлы, только текст), и его нельзя включить. У 000webhost все с этим нормально, можете использовать . Если у вас свой сервер или хороший купленный, то вам надо подключить cURL для полноценной работы бота из нашего примера.
Как работает Callback API и keyboard
Проведу краткий экскурс как все работает. Сallback API отсылает на ваш сервер любое событие, которое происходит в группе виде JSON. Полный список событий можно посмотреть во вкладке «Сallback API» → «Типы событий». Вот так выглядит JSON запрос когда пользователь отправляет сообщение, в данном случае он нажал на кнопку:
{"type":"message_new","object":{"date":1529668584,"from_id":89846036,"id":1522,"out":1,"peer_id":89846036,"text":"Золотая рыбка","conversation_message_id":305,"fwd_messages":[],"important":false,"random_id":0,"attachments":[],"payload":"{\"animals\":\"Goldfish\"}","is_hidden":false},"group_id":101461081}
Тут есть несколько интересных полей, которые можно обработать: id пользователя, текст сообщения(text), полезная нагрузка кнопки(payload).
Отправка сообщений пользователю происходит с помощью метода messages.send. Если вы отправляете клавиатуру, то после всех стандартных параметров вы добавляете параметр keyboard, который содержит json кнопок, вот как он выглядит:
keyboard: { "one_time": false, "buttons": [ [{ "action": { "type": "text", "payload": "{\"button\": \"1\"}", "label": "Red" }, "color": "negative" }, { "action": { "type": "text", "payload": "{\"button\": \"2\"}", "label": "Green" }, "color": "positive" }]
Работа с библиотекой
Для работы бота мы используем самописную библиотеку на PHP. Здесь (Если ссылка не работает, то вот архив)вы можете найти документацию к библиотеке и скачать саму библиотеку. Вот короткий листинг готовых функций для написания бота, подробнее ищите по ссылке выше. Если вы хотите узнавать об изменениях в библиотеке, то напишите хотя бы одно сообщение нашему боту в ВК, через него мы будет вас оповещать об изменениях.
$vk = new vk_api(vk_key, version_api) — инициализация бота. Параметры: ключ сообщества(vk_key), версия API(version_api).
sendMessage(id, text) — функция отправки сообщений юзеру. Параметры: id пользователя(id), текст сообщения(text).
sendImage(id, patch) — функция отправки изображений. Параметры: id пользователя(id), путь до изображения(patch).
sendButton(id, text, buttons, one_time) — функция отправки сообщения с кнопками. Параметры: id пользователя(id), текст сообщения(не может быть пустым)(text), массив с кнопками(buttons), не обязательный параметр one_time, по дефолту false, если поставить true, то после нажатия на любую кнопку клавиатура скроется.
request(method, array_arguments) — универсальная функция работы с методами. Параметры: method — название метода из официального api, array_arguments — массив параметров.
sendOK() — Бета функция. Используется вместо echo «ok», помогает в тех случаях, когда время работы скрипта долгое, и бот начинает повторять сообщения по несколько раз.
ВАЖНО: есть использовать эту функцию, то у вас не будет отображаться вывод ошибок. Во время дебага заменяйте на echo «ok»
Полный код бота на PHP
Теперь перейдем собственно к коду, где прокомментирована почти каждая строка.
Данный код поддерживается на PHP 5.6+
В блоке CONFIG укажите свой ключ доступа сообщества, ключ для подтверждения сервера а так же выбранную вами версию API.
<?php include "vk_api.php"; //Подключаем библиотеку для работы с api vk //**********CONFIG************** const VK_KEY = "your_key"; //тот самый длинный ключ доступа сообщества const ACCESS_KEY = "your_key"; //например c40b9566, введите свой const VERSION = "5.80"; //ваша версия используемого api //****************************** const BTN_FISH = [["animals" => 'Fish'], "А какие бывают?", "blue"]; //Код кнопки 'Fish' const BTN_BACK = [["command" => 'start'], "<< Назад", "red"]; // Код кнопки '<< Назад' const BTN_SALMON = [["animals" => 'Pink_salmon'], "Горбуша", "white"]; // Код кнопки 'Горбуша' const BTN_GOLDFISH = [["animals" => 'Goldfish'], "Золотая рыбка", "blue"]; // Код кнопки 'Золотая рыбка' const BTN_PLOTVA = [["animals" => 'Plotva'], "Плотва", "green"]; // Код кнопки 'Плотва' $vk = new vk_api(VK_KEY, VERSION); // создание экземпляра класса работы с api, принимает ключ и версию api $data = json_decode(file_get_contents('php://input')); //Получает и декодирует JSON пришедший из ВК if ($data->type == 'confirmation') { //Если vk запрашивает ключ exit(ACCESS_KEY); //Завершаем скрипт отправкой ключа } $vk->sendOK(); //Говорим vk, что мы приняли callback if (isset($data->type) and $data->type == 'message_new') { //Проверяем, если это сообщение от пользователя $id = $data->object->from_id; //Получаем id пользователя, который написал сообщение $message = $data->object->text; if (isset($data->object->peer_id)) $peer_id = $data->object->peer_id; // Получаем peer_id чата, откуда прилитело сообщение else $peer_id = $id; if (isset($data->object->payload)){ //получаем payload $payload = json_decode($data->object->payload, True); } else { $payload = null; } if (isset($payload['command']) or mb_strtolower($message) == 'начать') { //Если нажата кнопка начать или << назад $vk->sendButton($peer_id, 'Хочешь посмотреть на рыбок?', [[BTN_FISH]]); //Отправляем кнопку пользователю } else { if ($payload != null) { // если payload существует switch ($payload['animals']) { //Смотрим что в payload кнопках case 'Fish': //Если это Fish $vk->sendButton($peer_id, 'Вот такие, выбирай', [ //Отправляем кнопки пользователю [BTN_SALMON, BTN_GOLDFISH, BTN_PLOTVA], [BTN_BACK] ]); break; case 'Pink_salmon': //Если это Горбуша $vk->sendMessage($peer_id, "Держи свою горбушу!"); //отправляем сообщение $vk->sendImage($peer_id, "img/pink_salmon.jpg"); //отправляем картинку break; case 'Goldfish': //Если это Золотая рыбка $vk->sendMessage($peer_id, "Она исполнит твои желания..."); $vk->sendImage($peer_id, "img/goldfish.jpg"); break; case 'Plotva': //Если это Плотва $vk->sendMessage($peer_id, "Ой, похоже картинку перепутали)"); $vk->sendImage($peer_id, "img/plotva.jpg"); break; default: break; } } } } ?>
Теперь вы знаете как работает код, и можете подстроить его под себя.
Стартуем!
Заливайте свой скрипт и библиотеку на сервер. Теперь заходим в настройках во вкладку Callback API, вписываем в поле адреса путь до своего скрипта и жмем подтвердить. Если вы все сделали правильно, то рядом с адресом появится зеленая галочка.
FAQ:
Вопрос: Вообще ничего не работает!
Ответ: Значит где-то накосячили. Перечитайте еще раз внимательно статью, и проверьте, все ли вы сделали. Любой шаг влево может привести к ошибке…
Вопрос: У меня все работает, но не отправляются картинки.
Ответ: Проверьте, добавили ли вы папку img с изобажениями. Так же, возможно вы используете сервер, где не поддерживается cURL.
Вопрос: Я изменил версию на 5.78 или любую другую. У меня ничего не работает.
Ответ: Используйте другие версии api кроме 5.80 на свой страх и риск. Например на версии 5.78 от ВК приходят другие названия переменных(например вместо object->text идет object->body), поэтому скрипт крашится. Все изменения api ищите здесь.
Вопрос: Бот дублирует сообщения.
Ответ: Ваш скрипт долго выполняется. Проверьте что вы используете функцию sendOK. Если все же проблема не решена, то это может быть косяк функции, она еще находится тестировании.
Вопрос: Не появляется кнопка Начать.
Ответ: Недавно мы тоже столкнулись с такой проблемой. После разговора с поддержкой было отмечено, что это баг ВК, который присутствует в некоторых группах. Если у вас именно эта проблема, то уберите приветственное сообщение в настройках группы, и кнопка появится. Если кнопки еще нет, то вы забыли включить ее в настройках 🙂
Вопрос: Как отправить чисто кнопки, без сообщения?
Ответ: API предусматривает отправку кнопок только вместе с каким то сообщением, без него нельзя.
Вопрос: Как мне добавить свой функционал? У меня плохо с программированием…
Ответ: Мы делаем ботов на заказ от 500р, если хотите, то пишите насчет этого в группу ВК.
Остались еще какие-то вопросы? Пишите их нам в группу, обязательно поможем, если связано с примером из статьи или библиотекой.
Ну вот и все, у вас теперь тоже есть бот с клавиатурой 🙂
Делитесь этими знаниями с вашими друзьями и не забывайте подписаться на нашу группу ВК, там будет еще много интересного!
Вопрос: Как спрятать кнопки?
Очень просто, для этого надо отправить JSON с пустым массивом кнопок, с помощью нашей библиотеке это делается примерно так:
$vk_api->sendButton($id, ‘Кнопки скрыты’, []);
Кнопочки работаю, но проблема с кодировкой, кнопки с русскими буквами приходят в VK кракозябрами… Все кодировки на сайте UTF-8
На message_reply тоже лучше слать ‘ok’, хотя и не обрабатываете его.
Иначе контакт задолбит повторами ответа.
Если в настройках не включать калбэк на исходящие сообщения, то это не обязательно
как изменить кнопку «Начать» на другую формулировку?
Изменять кнопку «Начать» к сожалению нельзя
Подскажите, как вывести имя человека в сообщении? чтобы получилось
«ИМЯ ЧЕЛОВЕКА», Хочешь посмотреть рыбок?
Для того, что-бы получить имя человека существует специальный метод, об этом можете прочитать в документации к библиотеке в нашем репозитории на гит хабе: https://github.com/digitalstars/vk_api
Я сделал кнопку классом и в конструктор загружаю параметр для paylad, label, а цвет и тип заданы умолчаниями.
После этого клавиатура описывается элементарным массивом. И получилось гораздо короче.
Как через вашу библиотеку можно обработать сообщения отправленные пользователем?
Я реализовал кнопку «позвать менеджера», теперь при нажатии на кнопку бот в беседу со мной отправляет ссылку на беседу с человеком.
Сам вопрос в следующем, хочу сделать функцию «Заказ звонка», то есть человек вводит номер телефона, скрипт проверки уже реализован и если номер введён корректно, то идёт отправка в беседу с менеджером.
Тут без Базы Данных не обойтись, можно лишь 2 поля добавить, id_vk и статус, и если пользователь нажал на кнопку — изменять статус на другой (ожидание ввода номера телефона) и после ввода номера проверять, если статус — ожидание номера — то это номер.
У вас без проблем выводится более 15 кнопок в клавиатуре?
В документации написано, что максимум — 40 клавиш. Но у меня максимум показывается 15 (при размерности 3х5). Если ставить больше, то клавиатура не присылается.
Да. Попробуйте обновить версию библиотеки