Skip to content

Всё для WordPress, веб-разработки — и не только

🤖 Создайте Viber-бота на PHP за 6 шагов: полное руководство

🤖 Создайте Viber-бота на PHP за 6 шагов: полное руководство

Пользователь пишет в Viber, а ему никто не отвечает. Знакомая картина для малого бизнеса: один менеджер, три мессенджера, и клиенты уходят к тем, кто ответил первым. Чат-бот решает эту задачу радикально: он работает круглосуточно, не устаёт и реагирует мгновенно.

Раньше, до февраля 2024, развернуть простого Viber-бота можно было бесплатно за полчаса. Сейчас правила другие. Viber полностью перевёл ботов на коммерческую основу, без официальной заявки и партнёра токен не получить. Но если публичный аккаунт у вас уже есть (или вы оформляете его прямо сейчас), техническая часть, те самые шесть шагов на PHP, осталась прежней. Мы прошли этот путь от токена до кастомной клавиатуры и показываем каждый шаг.

💡 Быстрый обзор:

  • Создаёте публичный аккаунт Viber и получаете токен аутентификации: теперь он передаётся в HTTP-заголовке, а не в теле JSON
  • Настраиваете webhook с HTTPS-сертификатом и пишете PHP-обработчик входящих callback-запросов
  • Реализуете приём сообщений и отправку ответов через send message API: текст, изображения, файлы
  • Добавляете кастомную клавиатуру с кнопками быстрых ответов и ссылок, главный инструмент навигации внутри бота
  • Код пишете под актуальную версию Viber REST API 7.3, а не под устаревшие руководства 2017 года

Шаг 1. Создайте публичный аккаунт Viber

Первый шаг, получить публичный аккаунт (PA). С 5 февраля 2024 боты создаются только на коммерческой основе через официальных партнёров Rakuten Viber. Процесс выглядит так:

  • Оставляете заявку на странице публичных аккаунтов Viber: тип бизнеса, сценарии использования бота.
  • После одобрения приходит приглашение. Перезагружаете устройство, заходите на главный экран публичных аккаунтов и жмёте «Создать публичный аккаунт».
  • Заполняете данные: название, описание, аватар. Администратором назначается ваш основной Viber-аккаунт.

На выходе, публичный аккаунт и доступ к настройкам. Именно там появляется токен аутентификации.

Боты поддерживаются на iOS и Android с версии Viber 6.5 и выше, а на десктопе, с версии 6.5.3. Старая версия приложения, обновите до начала разработки, иначе клавиатуры и часть API-методов не заработают.

Шаг 2. Получите токен аутентификации

Токен (application key), уникальный секретный идентификатор вашего бота. Без него ни один API-запрос не пройдёт.

После создания публичного аккаунта токен доступен администратору в разделе «Изменить информацию» публичного аккаунта. Альтернативный путь, через Viber Admin Panel. Выглядит токен примерно так:

455a0f2c05b4fe54-cb4e33d3200fbbae-95f29ebc06af09a8

Это демонстрационный ключ, ваш будет с уникальными символами, но той же структуры.

Страница редактирования данных публичного аккаунта Viber с токеном

Главное изменение по сравнению со старыми руководствами: начиная с версии API 7.0 токен передаётся не в теле POST-запроса, а в HTTP-заголовке X-Viber-Auth-Token. Если отправить токен по-старому, полем auth_token в JSON, API вернёт ошибку missing_auth_token.

Старый формат (больше не работает):

1{"auth_token": "ваш_токен", "url": "https://..."}

Современный подход, заголовок:

1X-Viber-Auth-Token: ваш_токен

Держите токен в секрете. Любой, у кого он есть, может отправлять сообщения вашим подписчикам от имени бота.

Шаг 3. Настройте webhook и напишите PHP-обработчик

Webhook, это URL вашего сервера, на который Viber присылает callback-запросы: сообщения от пользователей, уведомления о подписке и другие события.

Требования к webhook-URL:

  • Протокол HTTPS с действующим SSL-сертификатом от доверенного центра сертификации. Viber не поддерживает самоподписанные сертификаты.
  • Сертификат должен быть в списке доверенных Sun Java, проверьте перед настройкой.

Настройка webhook, POST-запрос к https://chatapi.viber.com/pa/set_webhook. В заголовке X-Viber-Auth-Token, ваш токен. Тело запроса:

1{
2 "url": "https://yourdomain.com/viber-webhook.php",
3 "event_types": ["delivered", "seen", "failed", "subscribed", "unsubscribed", "conversation_started"],
4 "send_name": true,
5 "send_photo": true
6}

Параметры:

  • url, ваш webhook URL (обязательный, HTTPS).
  • event_types, события для callback. Обязательные и нефильтруемые: message, subscribed и unsubscribed. Остальные опциональны.
  • send_name и send_photo, запрашивать ли имя и фото пользователя. Работает, только если пользователь включил «Персонализацию контента» в настройках приватности Viber.

Отправляем запрос через cURL:

1<?php
2
3$url = 'https://chatapi.viber.com/pa/set_webhook';
4
5$jsonData = json_encode([
6 'url' => 'https://yourdomain.com/viber-webhook.php',
7 'event_types' => ['delivered', 'seen', 'failed', 'subscribed', 'unsubscribed', 'conversation_started'],
8 'send_name' => true,
9 'send_photo' => true
10]);
11
12$ch = curl_init($url);
13curl_setopt($ch, CURLOPT_POST, 1);
14curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
15curl_setopt($ch, CURLOPT_HTTPHEADER, [
16 'Content-Type: application/json',
17 'X-Viber-Auth-Token: your_auth_token'
18]);
19curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
20$result = curl_exec($ch);
21curl_close($ch);
22
23echo $result;

После отправки Viber пришлёт callback на ваш webhook URL для проверки доступности. Ожидается HTTP-ответ 200. Callback-данные:

1{
2 "event": "webhook",
3 "timestamp": 1457764197627,
4 "message_token": 241256543215
5}

Ваш PHP-обработчик должен вернуть ответ:

1{
2 "status": 0,
3 "status_message": "ok",
4 "event_types": ["delivered", "seen", "failed", "subscribed", "unsubscribed", "conversation_started", "message"]
5}

Полный код webhook-обработчика, файл viber-webhook.php на сервере:

1<?php
2
3$request = file_get_contents("php://input");
4$input = json_decode($request, true);
5
6if ($input['event'] == 'webhook') {
7 $webhook_response['status'] = 0;
8 $webhook_response['status_message'] = "ok";
9 $webhook_response['event_types'] = 'delivered';
10 echo json_encode($webhook_response);
11 die;
12}
13elseif ($input['event'] == "subscribed") {
14 // Пользователь подписался — можно отправить приветствие
15}
16elseif ($input['event'] == "conversation_started") {
17 // Пользователь открыл чат — можно отправить меню
18}
19elseif ($input['event'] == "message") {
20 $type = $input['message']['type'];
21 $text = $input['message']['text'];
22 $sender_id = $input['sender']['id'];
23 $sender_name = $input['sender']['name'];
24
25 // Формируем ответ
26 $data = [
27 'receiver' => $sender_id,
28 'type' => 'text',
29 'text' => "Привет, $sender_name! Вы написали: $text",
30 'sender' => [
31 'name' => 'My Viber Bot'
32 ]
33 ];
34
35 $ch = curl_init("https://chatapi.viber.com/pa/send_message");
36 curl_setopt($ch, CURLOPT_POST, 1);
37 curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
38 curl_setopt($ch, CURLOPT_HTTPHEADER, [
39 'Content-Type: application/json',
40 'X-Viber-Auth-Token: your_auth_token'
41 ]);
42 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
43 $result = curl_exec($ch);
44 curl_close($ch);
45}

После успешной установки webhook в боте появится кнопка чата 1-на-1, пользователи смогут начинать диалог. Чтобы отключить эту возможность, отправьте set_webhook с пустым url.

Шаг 4. Принимайте сообщения от пользователей

Когда пользователь пишет боту, Viber присылает на ваш webhook callback такого формата:

1{
2 "event": "message",
3 "timestamp": 1457764197627,
4 "message_token": 4912661846655238145,
5 "sender": {
6 "id": "01234567890A=",
7 "name": "yarden",
8 "avatar": "http://avatar_url"
9 },
10 "message": {
11 "type": "text",
12 "text": "a message to the service",
13 "media": "http://download_url",
14 "location": {
15 "lat": 50.76891,
16 "lon": 6.11499
17 },
18 "tracking_data": "tracking data"
19 }
20}

Ключевые поля для разбора:

Поле

Где находится

Описание

event

Корень

Значение "message" - это сообщение от пользователя

sender.id

sender

Уникальный Viber ID - сохраните его, он нужен для отправки ответа

sender.name

sender

Имя пользователя (если разрешена персонализация)

message.type

message

Тип сообщения: text, picture, video, file, location, contact, sticker или url

message.text

message

Текст сообщения (для типа text)

message_token

Корень

Уникальный ID сообщения - для отслеживания статуса доставки

Что важно сделать в обработчике:

  • Сохраните связку sender.id → имя/контекст в базу данных. Viber API не имеет метода «получить всех подписчиков», вы накапливаете ID сами по мере обращений.
  • Если пользователь прислал изображение (type: "picture"), URL файла, в message.media.
  • Не игнорируйте tracking_data: оно связывает ответ пользователя с вашим исходящим сообщением, незаменимо для аналитики диалогов.

Шаг 5. Отправляйте сообщения пользователям

API send_message поддерживает текст, изображения, видео, файлы, местоположение, контакты, стикеры, карусели и URL-превью. Разберём основные типы.

Текстовое сообщение. POST-запрос к https://chatapi.viber.com/pa/send_message с заголовком X-Viber-Auth-Token:

1{
2 "receiver": "01234567890A=",
3 "type": "text",
4 "text": "Здравствуйте! Чем могу помочь?",
5 "sender": {
6 "name": "Support Bot"
7 },
8 "tracking_data": "welcome_message_001"
9}

Параметр

Описание

receiver

Уникальный Viber ID получателя (тот самый sender.id из callback)

type

Тип сообщения: text, picture, video, file, location, contact, sticker, carousel или url

text

Текст сообщения - до 7000 символов

sender.name

Отображаемое имя отправителя - до 28 символов

tracking_data

Произвольная строка до 4096 символов - вернётся в callback при ответе пользователя

Отправка изображения:

1{
2 "receiver": "01234567890A=",
3 "type": "picture",
4 "text": "Акция марта 2026",
5 "media": "https://yourdomain.com/img/promo.jpg",
6 "thumbnail": "https://yourdomain.com/img/promo_thumb.jpg",
7 "sender": {
8 "name": "Shop Bot"
9 }
10}
  • media, URL изображения (только JPEG).
  • thumbnail, URL уменьшенной копии (тоже JPEG).
  • text, описание, может быть null.

PHP-функция для отправки сообщений, универсальная обёртка, которую мы используем на практике:

1<?php
2
3function sendViberMessage($receiverId, $type, $data, $trackingData = '') {
4 $token = 'your_auth_token';
5 $apiUrl = 'https://chatapi.viber.com/pa/send_message';
6
7 $payload = array_merge(['receiver' => $receiverId, 'type' => $type], $data);
8
9 if ($trackingData) {
10 $payload['tracking_data'] = $trackingData;
11 }
12
13 $ch = curl_init($apiUrl);
14 curl_setopt($ch, CURLOPT_POST, 1);
15 curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
16 curl_setopt($ch, CURLOPT_HTTPHEADER, [
17 'Content-Type: application/json',
18 "X-Viber-Auth-Token: $token"
19 ]);
20 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
21 $result = curl_exec($ch);
22 curl_close($ch);
23
24 return json_decode($result, true);
25}

Ограничение: максимальный размер JSON-запроса, 30 КБ. Учитывайте это при отправке каруселей с большим количеством элементов.

Шаг 6. Добавьте кастомную клавиатуру с кнопками

Клавиатура заменяет стандартную клавиатуру устройства набором кнопок: быстрые ответы, ссылки на сайт, переходы к разделам. Это главный инструмент навигации внутри бота.

Клавиатура прикрепляется к любому типу сообщения через поле keyboard в запросе send_message:

1{
2 "receiver": "01234567890A=",
3 "type": "text",
4 "text": "Что вас интересует?",
5 "sender": {
6 "name": "Help Bot"
7 },
8 "keyboard": {
9 "Type": "keyboard",
10 "BgColor": "#FFFFFF",
11 "Buttons": [
12 {
13 "Columns": 6,
14 "Rows": 1,
15 "BgColor": "#2db9b9",
16 "ActionType": "reply",
17 "ActionBody": "Услуги",
18 "Text": "📋 Услуги",
19 "TextVAlign": "middle",
20 "TextHAlign": "center",
21 "TextSize": "regular"
22 },
23 {
24 "Columns": 6,
25 "Rows": 1,
26 "BgColor": "#2db9b9",
27 "ActionType": "open-url",
28 "ActionBody": "https://yoursite.com/prices",
29 "Text": "💰 Цены",
30 "TextVAlign": "middle",
31 "TextHAlign": "center",
32 "TextSize": "regular"
33 }
34 ]
35 }
36}
Пример кастомной клавиатуры чат-бота Viber с кнопками навигации

Параметры клавиатуры:

Параметр

Описание

Type

Тип отображения. Пока доступен только "keyboard"

BgColor

HEX-цвет фона клавиатуры

DefaultHeight

true или false - использовать высоту по умолчанию

Параметры каждой кнопки:

Параметр

Возможные значения

Columns

1-6 - ширина в столбцах

Rows

1 или 2 - высота в рядах

ActionType

"reply" - отправить текст; "open-url" - открыть ссылку

ActionBody

Текст ответа или URL ссылки

Text

Надпись на кнопке. Поддерживает HTML-теги: b, i, u, br и span style

BgColor

HEX-цвет кнопки

BgMediaType

"picture" или "gif" - тип фонового медиа

BgMedia

URL фонового изображения или GIF

Image

URL изображения поверх фона

TextVAlign

top, middle или bottom

TextHAlign

left, center или right

TextSize

small, regular или large

Несколько важных нюансов из практики:

  • Кнопка с ActionType: "open-url" открывает ссылку во внешнем браузере, а не внутри Viber.
  • Не перегружайте клавиатуру: 4-6 кнопок, оптимум для одного экрана.
  • Фоновые GIF в кнопках (BgMedia) поддерживают зацикливание через BgLoop: true.

С этого момента бот готов к работе: принимает сообщения, отвечает текстом и изображениями, показывает меню-клавиатуру.

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

⁉️🤔 Частые вопросы

Можно ли создать Viber-бота бесплатно в 2026 году?

Нет. С 5 февраля 2024 Viber перевёл создание ботов исключительно на коммерческие условия. Для получения токена необходимо обратиться напрямую в Rakuten Viber или к одному из официальных партнёров. Бесплатные тестовые аккаунты больше не выдаются. Боты, созданные до этой даты, продолжают работать.

Обязательно ли использовать PHP для Viber-бота?

Нет, язык не имеет значения. Viber API работает через HTTP POST/GET-запросы, подойдёт любой бэкенд: Node.js, Python, Go, Ruby. Мы показываем PHP, потому что это самый распространённый язык на WordPress-хостингах и shared-серверах, доступен большинству владельцев сайтов без дополнительной настройки окружения.

Как проверить, что webhook работает?

После вызова set_webhook Viber немедленно отправляет callback с "event": "webhook" на ваш URL. Сервер возвращает HTTP 200, webhook активен. Проверить текущий статус можно повторным вызовом set_webhook с теми же параметрами, ответ API покажет зарегистрированные event_types. Для отладки используйте логирование file_get_contents("php://input") в файл на сервере.

Чем отличается старый способ аутентификации от нового?

До версии API 7.0 токен передавался в JSON-теле каждого запроса полем auth_token. Современный API (7.0+) требует передачи токена в HTTP-заголовке X-Viber-Auth-Token. Старый формат не поддерживается, запросы с auth_token в теле возвращают ошибку missing_auth_token. Если переносите код с руководств 2017-2023 годов, замените передачу токена на заголовок.

Что делать, если пользователь не видит клавиатуру?

Три вероятные причины: (1) JSON-запрос превысил лимит 30 КБ, сократите количество кнопок или уберите фоновые медиа; (2) в поле Type указано что-то кроме "keyboard", это единственное поддерживаемое значение; (3) пользователь на старой версии Viber, клавиатуры поддерживаются с версии 6.5.

Можно ли удалить webhook и отключить чат 1-на-1?

Да, отправьте set_webhook с пустой строкой в url:

1{"url": ""}

Кнопка чата исчезнет, но токен и публичный аккаунт сохранятся. Полезно при переносе бота на другой сервер.

Что ставить в 2026 году: свой PHP-бот или no-code-платформу

Если вы дочитали до этого места, перед вами два пути. Первый, написать бота на PHP по шагам выше. Вы получаете полный контроль над логикой, данными и хостингом. Подходит, когда бот, часть более крупного проекта: интернет-магазин, служба поддержки, внутренний инструмент команды.

Второй путь, no-code-платформы вроде SendPulse, Infobip или Kommunicate. Они берут на себя webhook-инфраструктуру и дают визуальный редактор сценариев. Цена, ежемесячная подписка и ограничения бесплатного тарифа. Для типовых задач, автоответчик FAQ, рассылка акций, этого хватает с запасом.

На практике мы обычно комбинируем: ядро бота на PHP для нестандартной логики, а клавиатуры и welcome-цепочки собираем в визуальном редакторе платформы, быстрее и нагляднее. Выбирайте то, что ближе к вашим навыкам и задаче. Начните с первого шага сегодня, публичный аккаунт оформляется за полчаса, а дальше каждый следующий шаг занимает ровно столько времени, сколько нужно, чтобы скопировать и адаптировать код из этого руководства.