Как создать 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("../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.


Полезные ссылки


Поделиться публикацией
Комментарии 31
    0
    Хм. А таким образом можно делать уведомления пользователям сайта по Viber?
      +1
      Полагаю, что логика тут аналогична телеграмму- сначала юзер сам подписывается к боту, и лишь затем он может получать от него всякий спам.
        +1
        Как и указал TimsTims — сначала нужно чтобы пользователь подписался на страничку.
        Но процесс можно упростить, скажем можно дать пользователю специальную «глубокую» ссылку. Тогда вы точно будете знать кто и откуда пришел, и тогда уже по ID проверять его статус онлайн/офлайн и отсылать сообщения.
          0
          В Украине курьерская служба «Новая почта» шлет в вайбер уведомления о посылках без моей подписки куда либо, в случае если я онлайн.
            0
            А вы случайно не вкурсе как они это делают?
            Вроде бы нечто подобное анонсировали sms.ru, но пока я так и не дождался у них этой фичи. Да и платная она будет, а если можно сделать бесплатно, это будет плюс.
              0
              Вобщем то уже ответил выше — это расширенное api. Хотелось бы надеяться что такой функционал станет доступнее обычным пользователям в будующем.
              0
              Да, вы правы, но у них другая версия (это не публичное api). Такое еще реализовано было в Приват24 и у некоторых других бизнес клиентов.
                0
                Мне шли рекламные сообщения от Hoff, Карусели и Сбербанка. На счет Hoff и карусели, возможно, когда подписывал с ними документы на скидочную/накопительную карту, не заметил информации о спаме в вайбер. А вот на счет сбербанка — могу сказать уверенно: ни на что не подписывался
                0
                А спам идёт от бота или контакта с телефонным номером? Если с номером то скорее всего через сам клиент (подсмотрели протокол на андроиде или вообще девочка сидит «прокликивает»)
                  0
                  Нет, не от номера, а именно от бота. Причем отправитель подписан как «прошедший проверку». То есть у вайбера есть какая-то партнёрка, по которой можно рассылать сообщения. И ответить на сообщения нельзя — нет поля для ввода текста.
                  Выглядит это вот так.
                    0
                    Если не ошибаюсь — гуглится на слова «Viber for Business». Насколько я помню — верифицированные могут слать кому и что угодно (в пределах «разумного»).
              0
              Реквестирую скриншоты — как в итоге все это выглядит, потому что впервые слышу, чтобы viber раздавал доступы на ботов. Я раза два запрашивал, и ни ответа, ни привета. Думаю, стоит заострить на этом внимание.
                +1
                Согласен, процедура регистрации выглядит довольно странно, но в моем случае я получил доступ к PA почти сразу.
                А далее уже можно создавать несколько ботов.
                +1

                Ещё бы увидеть ответ на вопрос "зачем" :)

                  0
                  Затем же, зачем и боты в телеграмме — от предоставления интересного сервиса, например по обработке фото, либо поддержке пользователей по вайберу, до продаж — например, заказ пиццы.
                    +1

                    Это я авансом за пятницу пошутил :)

                    0
                    Приведу несколько кейсов (кое-что реализовывал):
                    1. ваши пользователи любят вайбер (не знают что такое slack или telegram), и вам нужно частенько посылать им смс (по их же подписке), почему бы не перевести это в чат?
                    2. автоматизированный диалог, пользователь нажимает на кнопку — у него пополняется (или списывается) баланс в внутренней системе (скажем кликнул «выполнил задачу»)
                    Ну а придумать можно еще много чего. Возможностей гораздо меньше, чем скажем в телеграмме, но тоже не плохо.
                    0

                    Очень рад был бы, если можно было бы прикрутить к zabbix viber-бота, а то пользуюсь только viber, а ради одного бота ставить telegram не хочется

                      0
                      Как я понимаю, ни о каких интерактивных фишках, как в Telegram, речи не идет? Только текст?
                        +1
                        Есть несколько вещей:
                        • можно добавить кнопки к чату (и стилизовать их)
                        • добавлять ограниченную html разметку
                        • передавать видео, контакты, стикеры или скажем гифки
                      0
                      А Viber-бота можно пригласить в группу?
                      Я тут сделал телеграм-бота @PoleChudesBot для игры в расширенную версию поле чудес, но часть моих знакомых сидит на Viber…
                        0

                        На данный момент таких возможностей нет. В апи сообщения отправляются по id пользователя. Но есть публичный чат — в нем сообщения видны всем

                        0
                        не понятно для чего файл
                        setup.php

                        а так же куда писать
                        composer require bogdaan/viber-bot-php
                        0
                        } catch (Exception $e) {
                            echo "Error: ". $e->getError() ."\n";
                        }
                        

                        нет метода getError, есть getMessage
                          0
                          Спасибо за замечание — спутал название.
                          0
                          Прежде чем создавать бота, необходимо получить доступ к аккаунту специального типа.

                          Дважды пытались и дважды были посланы подальше. Один раз как паблик сказали что «не для нас» а второй раз специально для сервисных сообщений и сказали что от 600 тыс в месяц их дают. Пока предпочтем ботов в более адекватных мессенджерах :)
                            0
                            IgorDimitrov скажите, у вас получилось завести паблик аккаунт? У меня такая же проблема, сколько раз делал запросы, всегда отказывают.
                              0
                              Нет, на сейчас опустили руки. Кто-то предлагал «посредничество» но мы не считаем что это нормально. Клиентам хватает FB и Telegram, не могу сказать что есть масса желающих включить и Viber.
                            0
                            Ребята, а библиотека для Laravel есть? Для телеграмма есть, а вот для viber не нашел… Может плохо искал. Подскажите!

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                            Самое читаемое