
🤖 Создайте 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-цепочки собираем в визуальном редакторе платформы, быстрее и нагляднее. Выбирайте то, что ближе к вашим навыкам и задаче. Начните с первого шага сегодня, публичный аккаунт оформляется за полчаса, а дальше каждый следующий шаг занимает ровно столько времени, сколько нужно, чтобы скопировать и адаптировать код из этого руководства.



