Разработка мобильного чат-бота для Viber
Viber Public Account и Viber Bot — разные продукты с разными API. Public Account — для брендов, работает через Viber Partners. Viber Bot — для разработчиков, регистрируется через developers.viber.com, подходит для автоматизации. В большинстве проектов нужен именно Bot API.
Регистрация и настройка
Создание бота — через Viber Admin Panel для разработчиков. После создания выдаётся auth_token — используется в каждом API-запросе в заголовке X-Viber-Auth-Token. Webhook устанавливается одним POST:
import requests
def set_webhook(url: str, auth_token: str):
response = requests.post(
"https://chatapi.viber.com/pa/set_webhook",
headers={"X-Viber-Auth-Token": auth_token},
json={
"url": url,
"event_types": [
"delivered", "seen", "failed",
"subscribed", "unsubscribed",
"conversation_started", "message"
],
"send_name": True,
"send_photo": True
}
)
return response.json() # {"status": 0, "status_message": "ok"}
Viber подтверждает webhook немедленно в ответе на set_webhook — не нужен отдельный verification challenge как в WhatsApp/Meta.
Типы сообщений
Viber поддерживает: text, picture, video, file, sticker, contact, url, location и rich_media. rich_media — это кастомный карусельный формат с кнопками, изображениями, заголовками:
def send_rich_media(receiver: str, auth_token: str, items: list):
rich_media = {
"Type": "rich_media",
"ButtonsGroupColumns": 6,
"ButtonsGroupRows": 7,
"BgColor": "#FFFFFF",
"Buttons": []
}
for item in items:
rich_media["Buttons"].extend([
{
"Columns": 6, "Rows": 3,
"ActionType": "open-url",
"ActionBody": item["url"],
"Image": item["image_url"]
},
{
"Columns": 6, "Rows": 1,
"Text": f"<b>{item['title']}</b>",
"ActionType": "none"
},
{
"Columns": 3, "Rows": 1,
"Text": "Подробнее",
"ActionType": "open-url",
"ActionBody": item["url"],
"BgColor": "#2db5f5"
}
])
requests.post(
"https://chatapi.viber.com/pa/send_message",
headers={"X-Viber-Auth-Token": auth_token},
json={"receiver": receiver, "type": "rich_media", "rich_media": rich_media}
)
Rich Media — специфика Viber, аналогов в таком виде у Telegram нет. Хорошо подходит для каталогов товаров, новостей, карточек услуг.
Keyboard: постоянная и одноразовая
Viber Keyboard — кастомная клавиатура внизу экрана. min_api_version: 1 для базовых кнопок:
keyboard = {
"Type": "keyboard",
"DefaultHeight": True,
"BgColor": "#FFFFFF",
"Buttons": [
{
"Columns": 3, "Rows": 1,
"Text": "Каталог",
"ActionType": "reply",
"ActionBody": "catalog",
"BgColor": "#f5f5f5"
},
{
"Columns": 3, "Rows": 1,
"Text": "Поддержка",
"ActionType": "reply",
"ActionBody": "support",
"BgColor": "#f5f5f5"
}
]
}
Keyboard передаётся в каждом сообщении где нужна — она не «прилипает» как в Telegram, если не передать снова. Стандартный паттерн: добавлять keyboard к каждому ответу бота.
Событие conversation_started
conversation_started — пользователь открыл чат с ботом впервые или через deep link. Это единственный момент, когда можно отправить приветственное сообщение незаподписанному пользователю. После этого пользователь должен сам написать (подписаться), прежде чем бот сможет слать ему сообщения.
Ограничение: Viber не позволяет отправлять массовые рассылки незаподписанным пользователям — только тем, кто подписан на бота (событие subscribed).
Проверка подписи webhook
Каждый входящий запрос от Viber содержит заголовок X-Viber-Content-Signature — HMAC-SHA256 тела запроса с auth_token как ключом:
import hmac, hashlib
def verify_viber_signature(body: bytes, signature: str, auth_token: str) -> bool:
expected = hmac.new(
auth_token.encode(),
body,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature)
Без этой проверки ваш webhook может принимать поддельные сообщения от сторонних.
Процесс работы
Регистрация бота в Viber Admin Panel. Настройка webhook с верификацией подписи. Обработка базовых событий: message, conversation_started, subscribed. Реализация Rich Media для каталогов/контента. Диалоговые сценарии с состоянием (Redis FSM). Интеграция с backend-системами.
Ориентиры по срокам
Простой information-bot с keyboard и текстовыми ответами — 1–2 недели. Полноценный бот с Rich Media, FSM, интеграцией с CRM и аналитикой — 4–7 недель.







