
🤖 Створіть 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
Це демонстраційний ключ, ваш буде з унікальними символами, але тієї самої структури.

Головна зміна порівняно зі старими посібниками: починаючи з версії API 7.0 токен передається не в тілі POST-запиту, а в HTTP-заголовку X-Viber-Auth-Token. Якщо надіслати токен по-старому, полем auth_token у JSON, API поверне помилку missing_auth_token.
Старий формат (більше не працює):
1 {"auth_token": "ваш_токен", "url": "https://..."}
Сучасний підхід, заголовок:
1 X-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); 13 curl_setopt($ch, CURLOPT_POST, 1); 14 curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData); 15 curl_setopt($ch, CURLOPT_HTTPHEADER, [ 16 'Content-Type: application/json', 17 'X-Viber-Auth-Token: your_auth_token' 18 ]); 19 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 20 $result = curl_exec($ch); 21 curl_close($ch); 22 23 echo $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 6 if ($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 } 13 elseif ($input['event'] == "subscribed") { 14 // Пользователь подписался — можно отправить приветствие 15 } 16 elseif ($input['event'] == "conversation_started") { 17 // Пользователь открыл чат — можно отправить меню 18 } 19 elseif ($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 }
Ключові поля для розбору:
Поле | Де знаходиться | Опис |
|---|---|---|
| Корінь | Значення |
|
| Унікальний Viber ID, збережіть його, він потрібен для надсилання відповіді |
|
| Ім’я користувача (якщо дозволена персоналізація) |
|
| Тип повідомлення: text, picture, video, file, location, contact, sticker або url |
|
| Текст повідомлення (для типу |
| Корінь | Унікальний 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 }
Параметр | Опис |
|---|---|
| Унікальний Viber ID отримувача (той самий |
| Тип повідомлення: text, picture, video, file, location, contact, sticker, carousel або url |
| Текст повідомлення, до 7000 символів |
| Відображуване ім’я відправника, до 28 символів |
| Довільний рядок до 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 3 function 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 }

Параметри клавіатури:
Параметр | Опис |
|---|---|
| Тип відображення. Поки доступний лише |
| HEX-колір фону клавіатури |
|
|
Параметри кожної кнопки:
Параметр | Можливі значення |
|---|---|
| 1-6, ширина в стовпцях |
| 1 або 2, висота в рядках |
|
|
| Текст відповіді або URL посилання |
| Напис на кнопці. Підтримує HTML-теги: b, i, u, br і span style |
| HEX-колір кнопки |
|
|
| URL фонового зображення або GIF |
| URL зображення поверх фону |
| top, middle або bottom |
| left, center або right |
| 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_webhookViber негайно надсилає 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-ланцюжки збираємо у візуальному редакторі платформи, швидше й наочніше. Обирайте те, що ближче до ваших навичок і задачі. Почніть із першого кроку сьогодні, публічний акаунт оформлюється за пів години, а далі кожен наступний крок займає рівно стільки часу, скільки потрібно, щоб скопіювати й адаптувати код із цього посібника.



