Viber bot in PHP

Ранее мы рассматривали, как создать и настроить своего собственного телеграм-бота, но обойти стороной другой не менее популярный месенджер Viber – точно нельзя.

Принцип работы такого чат-бота схож с работой бота в телеграм. Также используется веб-хук с API вайбер на ту часть вашего сайта, где расположен PHP код, обрабатывающий сообщения от пользователей. Учитывая, что Viber разрабатывали совсем другие люди, следует ожидать, что API будет отличаться, но это не беда, ведь есть официальная документация API Viber, немного покурив которую, можно будет склепать что-то более менее похожее на чат-бота и может быть он даже заработает )

Твой чат-бот скорее всего будет работать. Или нет.

Создаем Viber бота через админ-панель вайбер

Заходим в админ-панель Viber по ссылке – https://partners.viber.com/login. Регистрируемся, если еще этого не сделали. Для регистрации нам достаточно “живого” номера телефона, на который может прийти SMS. Думаю, на этом этапе все понятно:

Регистрация в админ панели Viber

После того, как вы зарегестрировались и вошли в админ панель, следует найти слева ссылку и кликнуть ее – “Create Bot Account”.

Нужно больше роботов!

Заполняем небольшую анкету. Сначала подбираем изображение для бота – картинка 400 на 400 пикселей

Картинка для бота – 400 на 400 пикселей

В процессе заполнения самой анкеты, пожалуй, важно только поле URI – это по сути ссылка на вашего бота, суть которой станет ясна позже. Также не забудьте выбрать нужную категорию для вашего бота, например Группы – Хобби, как ниже на скрине.

Заполните все поля, в том числе контактную информацию

После ввода всех данных и нажатия кнопки “Create” по сути, бот уже готов. Бережно сохраним Viber Token – который нам пригодится при создании бота на PHP. Сохраняем этот секретный ключ в секретное место:

Код получен

Обратите внимание, что по ссылке “REST API” можно найти дополнительную информацию о том, как работает API Viber. Рекомендую почитать, или просто посмотреть картинки )

Готовый пример кода PHP

Пробуем скачать готовый пример бота на PHP. Есть нормальный (и маленький) понятный пример на гитхаб – качаем отсюда. Качаем два файла index.php и set_webhook.php и размещаем у себя на вебхостинге в отдельной папочке

Все нонятно

У кого не удалось скачать исходные файлы с гитхаба, качайте отсюда прямой ссылкой.

В файле set_webhook.php делаем правки, вписываем значения нашего вновь созданного бота:

	$auth_token = '4b7d*********d12a-457a4e********b6d5-34*******5af483';  // ваш API TOKEN который был получен при регистрации бота
	$webhook = 'https://[ИМЯ ВАШЕГО САЙТА]/viberbot/index.php';  // адрес файла index.php примера бота Viber на вашем сервере

Обратите внимание, что у меня на сервере папка с кодом PHP для бота Viber называется “viberbot”, поэтому путь к файлу именно такой: https://[ИМЯ ВАШЕГО САЙТА]/viberbot/index.php

Теперь обратим внимание на файл index.php и сделаем и в нем изменения.

$auth_token = '4b7d*********d12a-457a4e********b6d5-34*******5af483'; // ваш API TOKEN который был получен при регистрации бота
$send_name = 'TopsitesCC'; // Имя вашего бота, указанное при регистрации

… и ты знаешь, что веб-хук для вайбер будет работать, только если у тебя сайт работает по https (не http). Понятная статья на тему https – ссылка.

Теперь, когда мы знаем, что веб хук заработает, только для сайтов с https защищенным протоколом, то облегченно вздыхаем, так как у нас на сайте он есть и переходим по ссылке:

https://[АДРЕС_ВАШЕГО_САЙТА]/[АДРЕС_ПАПКИ_НА_САЙТЕ_С_КОДОМ_БОТА]/set_webhook.php

Если все сделали правильно, то любуемся таким сообщением в браузере, самое важное из которого – это status_messageok:

 {"status":0,<strong>"status_message":"ok"</strong>,"chat_hostname":"SN-CHAT-06_","event_types":["subscribed","unsubscribed","delivered","message","seen"]}1

После того, как мы убедились, что хук установлен – чисто теоретически бот должен работать. Возникает вопрос, а как найти ваш чат бот в Viber? А вот тут и оказывается, что чат бот не будет участвовать в поиске, пока не наберет хотя бы 6 подписчиков

Казалось бы, что можно воспользоватся ссылкой такого плана: viber://pa?topsites=TopsitesCC – то, что мы указывали при регистрации. Но нет, на момент написания статьи – это не работало.

Вторым вариантом (рабочим вариантом!) добавления бота в список контактов является сканирование QR-кода из программы вайбер на смартфоне. Данный код виден в настройках бота в партнерской панели Viber

Просто отсканируйте код через Viber

Вот тут все работает как надо. Если честно, не ожидал от разработчиков вайбер такого странного решения. По сути еще одним способом поделиться ссылкой на бот – является отправка приглашения другому пользователю вайбера от пользователья, который уже в этой группе состоит.

Эти программисты – они такие странные…

Что же умеет данный бот?

Данный бот может лишь пересылать сообщение тому пользователю, который ему его отправил. Т.е. если, напишем ему “Привет, че как?” то и в ответ получим то же самое:

Бот уже общается – это неплохо

Думаю, это не совсем то, ради чего мы его создавали, поэтому давайте откроем на редактирование файл index.php и немного изучим код, чтобы понять, что он делает и как.

$type = $input['message']['type']; // тип полученного от пользователя сообщения (text/picture)
$text = $input['message']['text']; // текст сообщения, отправленного пользователем

$sender_id = $input['sender']['id']; // уникальный viber id пользователя, который отправил сообщение
$sender_name = $input['sender']['name']; // имя пользователя, который отправил сообщение



// тип события - установка вебхука
if($input['event'] == 'webhook') {
	
	$webhook_response['status'] = 0;
	$webhook_response['status_message'] = "ok";
	$webhook_response['event_types'] = 'delivered';
	echo json_encode($webhook_response);
	die;
  
// тип события - новый подписчик - можно писать длинное привественное письмо )
} else if($input['event'] == "subscribed") {
	sendMsgText($sender_id, "Спасибо, что подписались на нас!");

// тип события - начало беседы - непонятно зачем, так как - Note that users’ first message to the bot will make them subscribed, but will not result in a Subscribed callback.
} else if($input['event'] == "conversation_started") {
	sendMsgText($sender_id, "Беседа началась!");

// тип события - сообщение от пользователя - именно тут мы и будем писать всякой разное
} elseif($input['event'] == "message") {
	// именно это строка кода возвращает вам ваше сообщение
	sendMsg($sender_id, $text, $type);
}

Также обратите внимание, что чуть выше по коду в файл index.php присутствует такая функция, как put_log_in($request); – эта функция “складирует” все входящие сообщения в текстовый файл – tmp_in.txt. Это очень удобно на этапе программирования, так как нужно понимать, что именно пользователь присылает боту.

Обратите внимание, что при передаче сообщений, API Viber все символы не входящие в диапазон ASCII (например кириллица) преобразует в unicode escape sequence.

Иными словами, фраза “Привет, че как?” превратится в “\u041f\u0440\u0438\u0432\u0435\u0442, \u0447\u0435 \u043a\u0430\u043a?” Данные каракули можно онлайн раскодировать тут – http://www.online-decoder.com/ru или же не лениться и делать это программно при помощи PHP.

Для ленивых приведу кусок кода, который можете вставить в отдельном PHP файле и потренироваться и понять принцип:

// строка с кириллицей в unicode escape sequence
$str = "\u041f\u0440\u0438\u0432\u0435\u0442, \u0447\u0435 \u043a\u0430\u043a?";

// преобразовем строку в человекочитаемый вид
$str = preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/', function ($match) {
    return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
}, $str);

// выводим строку в браузер
echo $str;

А теперь давайте вернемся к Viber PHP боту и чуть расширим его функционал. Итак, меняем код в файле index.php, а именно вот эту часть:

// тип события - сообщение от пользователя - именно тут мы и будем писать всякой разное
} elseif($input['event'] == "message") {
	// именно это строка кода возвращает вам ваше сообщение
	sendMsg($sender_id, $text, $type);
}

Меняем на это:

// тип события - сообщение от пользователя - именно тут мы и будем писать всякой разное
} elseif($input['event'] == "message") {
	// отправим чуть больше информации
	$return_string  = "Привет, человек с именем ".$sender_name."!";
	$return_string .= "Твой айди в системе Viber: ".$sender_id." - просто смирись с этим.";
	$return_string .= "Ты прислал мне сообщение такого типа: ".$type.".";
	$return_string .= "Я обязательно запомню, что ты мне сказал: ".$text."!";
	
	//sendMsg($sender_id, $text, $type);
	sendMsg($sender_id, $return_string, $type);
}

С нашим ботом уже стало интереснее общаться) Давайте еще научим его ставить переносы строк, чтобы ответное сообщение от бота не выглядело такой кашей:

Без переносов строки сообщение превращается в кашу, которую трудно читать

Меняем PHP код ответа бота, добавив в конце строк \n – перенос строки:

// тип события - сообщение от пользователя - именно тут мы и будем писать всякой разное
} elseif($input['event'] == "message") {
	// отправим чуть больше информации
	$return_string  = "Привет, человек с именем ".$sender_name."!\n";
	$return_string .= "Твой айди в системе Viber: ".$sender_id." - просто смирись с этим.\n";
	$return_string .= "Ты прислал мне сообщение такого типа: ".$type.".\n";
	$return_string .= "Я обязательно запомню, что ты мне сказал: ".$text."!";
	
	//sendMsg($sender_id, $text, $type);
	sendMsg($sender_id, $return_string, $type);
}
Такое сообщение уже удобнее читать

На этом можно в принципе остановиться на этапе понимания, как вообще работает бот вайбер. По сути осталось дописать код, который делает что-то полезное и связать его тем, что присылает боту пользователь.

Далее расширение функционала бота – только вопрос вашей фантазии. В общем, если нужен вайбер бот, то

Котэ врать не будет!

3 comments

    • Александр, добрый день.
      Если честно, забросил я эту тему с Viber ботами, так как там все довольно печально и в плане API и вообще здравого смысла.
      Пробовал я и так и этак эти ссылки делать – не получается. Даже гугление и хабр не помог.
      Хорошо, что есть телеграм боты – вот там реально все хорошо и понятно и приятно.
      Рад, если хоть как-то ответил на вопрос )

Leave a Reply to admin Cancel reply

Your email address will not be published. Required fields are marked *