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-ланцюжки збираємо у візуальному редакторі платформи, швидше й наочніше. Обирайте те, що ближче до ваших навичок і задачі. Почніть із першого кроку сьогодні, публічний акаунт оформлюється за пів години, а далі кожен наступний крок займає рівно стільки часу, скільки потрібно, щоб скопіювати й адаптувати код із цього посібника.