В ноябре 2016 года Viber внедрил публичные аккаунты (Viber public account, или просто PA). С их выходом стало доступно и api, которое позволяет:
- вести переписку с пользователем
- проверять статус подписчиков (онлайн, оффлайн)
- получить информацию о конкретном подписчике
- вносить записи (посты) на свою страницу
Все это позволяет создать довольно неплохого бота, или же интегрировать бота в уже существующий проект, что вполне может улучшить качество взаимодействие с пользователями. Если вы уже создавали ботов для telegram или slack — то создать бота для Viber не составит большого труда.
Вступление
Еще некоторое время назад у меня появилась необходимость взаимодействовать с пользователями вайбера. Хотелось бы внедрить в свое приложение типовые диалоги с пользователями, а еще предоставлять "кнопочные диалоги" (в тех случаях когда пользователь видит несколько кнопок под чатом). Но на тот момент открытого (публичного) API для этого не было, и приходилось либо отказываться либо изворачиваться с граблями.
С релизом публичных аккаунтов (PA) ситуация изменилась, теперь мы можем создать более полноценное взаимодействие с "кнопочными диалогами" и нужными нам "конверсиями". Все это здорово, если не одно НО — нет SDK для PHP (ради справедливости, есть sdk для nodejs и python). Именно этот пробел я решил заполнить, и описать как можно создать простого бота на php, и за одно создать SDK.
Первые шаги
Прежде чем создавать бота, необходимо получить доступ к аккаунту специального типа. Возможно это покажется вам странным, но на момент написания поста это так. Для этого необходимо перейти на https://www.viber.com/en/public-accounts и заполнить нужную форму:
В форме вы указываете телефон, к которому будет выдан доступ к публичным аккаунтам, и спустя некоторое время вы получите сообщения формата "...You now have early access to Public Accounts!...". После чего вам необходимо перезапустить Viber-клиент и пройти следующие шаги:
Открыть раздел "Публичные аккаунты" (иконка вверху справа — )
Нажать на "создать аккаунт" (иконка внизу справа — )
- Заполнить данные для вашего бота (необходима фоновая картинка, указанная категория, имя, описание и прочее)
На последнем шаге будет доступен выбор способа работы с сообщениями, выберите "api" и скопируйте ключ. (или его можно просто посмотреть на экране "редактирования информации" PA):
Для примера, мой ключ будет: 1111111111111111-2222222222222222-3333333333333333
Серверная часть
Для разработки бота и работы с Viber-API я использую небольшой SDK: https://github.com/Bogdaan/viber-bot-php. Он позволит опустить некоторые подробности взаимодействия c REST-api и построить некоторую логику нашего бота. Установим его:
composer require bogdaan/viber-bot-php
Для начала нам необходимо зарегистрировать адрес вебхука — тот адрес по которому бекенд вибера будет доставлять нам сообщения от пользователей и некоторые другие события. Веб сервер, на котором будет расположен бот (и соотвественно вебхук) обязательно должен работать по https с корректным SSL сертификатом. Самоподписанный сертификат тут не подойдет, если его нет — попробуйте использовать letsencrypt.org.
Для примера, мой вебхук будет: https://viber.hcbogdan.com/bot.php
. Создадим файл setup.php
:
<?php
require_once("../vendor/autoload.php");
use Viber\Client;
$apiKey = '1111111111111111-2222222222222222-3333333333333333'; // <- PLACE-YOU-API-KEY-HERE
$webhookUrl = 'https://viber.hcbogdan.com/bot.php'; // <- PLACE-YOU-HTTPS-URL
try {
$client = new Client([ 'token' => $apiKey ]);
$result = $client->setWebhook($webhookUrl);
echo "Success!\n";
} catch (Exception $e) {
echo "Error: ". $e->getError() ."\n";
}
И зарегистрируем вебхук выполнив файл:
$ php setup.php
Success!
Теперь, когда пользователь отправит сообщение, или зайдет в чат, по адресу вебхука будут отправлены запросы. Создадим файл bot.php
:
<?php
require_once("../vendor/autoload.php");
use Viber\Bot;
use Viber\Api\Sender;
$apiKey = '<PLACE-YOU-API-KEY-HERE>';
// так будет выглядеть наш бот (имя и аватар - можно менять)
$botSender = new Sender([
'name' => 'Whois bot',
'avatar' => 'https://developers.viber.com/img/favicon.ico',
]);
try {
$bot = new Bot(['token' => $apiKey]);
$bot
->onConversation(function ($event) use ($bot, $botSender) {
// это событие будет вызвано, как только пользователь перейдет в чат
// вы можете отправить "привествие", но не можете посылать более сообщений
return (new \Viber\Api\Message\Text())
->setSender($botSender)
->setText("Can i help you?");
})
->onText('|whois .*|si', function ($event) use ($bot, $botSender) {
// это событие будет вызвано если пользователь пошлет сообщение
// которое совпадет с регулярным выражением
$bot->getClient()->sendMessage(
(new \Viber\Api\Message\Text())
->setSender($botSender)
->setReceiver($event->getSender()->getId())
->setText("I do not know )")
);
})
->run();
} catch (Exception $e) {
// todo - log exceptions
}
Далее остается разместить файл bot.php
так, чтобы он был доступен по https://viber.hcbogdan.com/bot.php
, и перейти в чат с ботом из вибер клиента. Если вы не видите ответов бота, то стоит проверить ваш error_log и access_log на предмет наличия ошибок.
Можно немного улучшить функционал бота и добавить логгирование. Сделаем это с помощью monolog:
composer require monolog/monolog
И добавим логгирование исключений:
<?php
//...
} catch (Exception $e) {
// log exceptions
$log = new \Monolog\Logger('bot');
$log->pushHandler(new \Monolog\Handler\StreamHandler('/tmp/bot.log'));
$log->warning('Exception: '. $e->getMessage());
}
Все исключения будут поступать в /tmp/bot.log
.
Базовая версия вашего бота готова, вы можете вносить свою логику, добавлять кнопки в чат, использовать глубокие ссылки (deep link) и html разметку — все это доступно в SDK. Я создал несколько демок которые вы можете увидеть в чате viber://pa?chatURI=viber-bot-php&context=habrahabr. Если у вас еще нет viber клиента, вы можете найти чат по этой ссылке: viber-bot-php.