Як створити Viber-бота з допомогою PHP

У листопаді 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 і заповнити потрібну форму:
early access to pa
У формі ви вказуєте телефон, до якого буде виданий доступ до публічних акаунтів, і через деякий час ви отримаєте повідомлення формату "...You now have early access to Public Accounts!...". Після чого вам необхідно перезапустити Viber-клієнт і пройти наступні кроки:
  1. Відкрити розділ "Публічні акаунти" (іконка вгорі праворуч — ico)
  2. Натиснути на "створити акаунт" (іконка внизу праворуч — ico)
  3. Заповнити дані для вашого бота (необхідна фонова картинка, зазначена категорія, ім'я, опис та інше)
На останньому кроці буде доступний вибір способу роботи з повідомленнями, виберіть "api" і скопіюйте ключ. (або його можна просто подивитися на екрані "редагування інформації" PA):
edit page token
Для прикладу, мій ключ:
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("../виробника/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("../виробника/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.
Корисні посилання
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.