Розробка мобільного Facebook Messenger-чат-бота
Facebook Messenger Platform — це зрілий API з багатим набором UI-компонентів: Quick Replies, Generic Templates, Buttons, Webview. Бот реєструється як Facebook App та прив'язується до Facebook Page. Для міжнародних проектів — це повнофункціональний канал.
Налаштування: App, Page, Webhook
Messenger-бот потребує:
- Facebook Developer App (
developers.facebook.com) - Facebook Page (бізнес-сторінка)
- HTTPS-webhook на вашому сервері
- Дозволи:
pages_messaging,pages_read_engagement
Верифікація webhook — GET-запит з hub.verify_token та hub.challenge:
from fastapi import FastAPI, Request, Query
app = FastAPI()
VERIFY_TOKEN = "my_secret_verify_token"
PAGE_ACCESS_TOKEN = "EAAxxxxxxx" # З налаштувань Page у Developer Console
@app.get("/webhook")
async def verify(
hub_mode: str = Query(alias="hub.mode"),
hub_verify_token: str = Query(alias="hub.verify_token"),
hub_challenge: str = Query(alias="hub.challenge")
):
if hub_mode == "subscribe" and hub_verify_token == VERIFY_TOKEN:
return int(hub_challenge)
return 403
Після верифікації — підпишіть App на потрібні поля через Graph API: messages, messaging_postbacks, messaging_optins.
Відправлення повідомлень: Send API
Усі повідомлення POST на https://graph.facebook.com/v18.0/me/messages?access_token=PAGE_ACCESS_TOKEN:
import httpx
async def send_message(recipient_id: str, message: dict):
async with httpx.AsyncClient() as client:
await client.post(
f"https://graph.facebook.com/v18.0/me/messages",
params={"access_token": PAGE_ACCESS_TOKEN},
json={"recipient": {"id": recipient_id}, "message": message}
)
# Простий текст
await send_message(user_id, {"text": "Привіт! Чим я можу допомогти?"})
# Quick Replies — одноразові кнопки під повідомленням
await send_message(user_id, {
"text": "Виберіть категорію:",
"quick_replies": [
{"content_type": "text", "title": "Доставка", "payload": "DELIVERY"},
{"content_type": "text", "title": "Повернення", "payload": "RETURN"},
{"content_type": "location"} # Кнопка відправлення геолокації
]
})
Quick Replies зникають після натискання — це навмисна поведінка. Для постійного меню використовуйте messenger_profile з Persistent Menu.
Generic Template: карточки з кнопками
Generic Template — горизонтальна карусель карточок. Максимум 10 карточок, в кожній: зображення, заголовок, підзаголовок, до 3 кнопок:
await send_message(user_id, {
"attachment": {
"type": "template",
"payload": {
"template_type": "generic",
"elements": [
{
"title": "iPhone 15 Pro",
"subtitle": "Titanium. So strong. So light.",
"image_url": "https://cdn.example.com/iphone15.jpg",
"buttons": [
{"type": "web_url", "url": "https://example.com/iphone15",
"title": "Дізнатися більше"},
{"type": "postback", "title": "В кошик",
"payload": "ADD_TO_CART:iphone15"}
]
}
]
}
}
})
postback — кнопка без URL, генерує подію messaging_postbacks на webhook з указаним payload. Використовується для команд бота.
Sender Actions: індикатор печати
typing_on та typing_off показують індикатор печати. Показуйте його перед довгими відповідями (запити до БД, виклики LLM):
async def send_with_typing(recipient_id: str, message: dict, delay: float = 1.0):
await send_action(recipient_id, "typing_on")
await asyncio.sleep(delay) # Імітація «думає»
await send_action(recipient_id, "typing_off")
await send_message(recipient_id, message)
Без індикатора печати відповіді з'являються «ніби звідкись» — особливо критично під час затримки LLM.
Webview та Extensions
Messenger Extensions дозволяє відкрити ваше веб-приложення прямо в Messenger через кнопку web_url з messenger_extensions: true. Це аналог Telegram Mini App, але з меншим набором API. Випадки використання: платіжні форми, каталоги, реєстрація.
MessengerExtensions.getContext() повертає psid користувача для автентифікації на вашому сервері.
Обмеження платформи
24+1 вікно: після останнього повідомлення від користувача бот може писати 24 години. Після цього — тільки через одобрені Message Tags (наприклад, CONFIRMED_EVENT_UPDATE для сповіщень про подію) або підписку користувача на One-Time Notifications.
Процес розробки
Створення Facebook App та прив'язка до Page. Налаштування webhook та підписок. Реалізація обробників: текстові повідомлення, postbacks, attachments. UI-компоненти: Quick Replies, Generic Template, Persistent Menu. Webview-інтеграція для складних форм. Аналітика через Facebook Insights.
Орієнтири за часом
Базовий бот з Quick Replies та Generic Template — 2–3 тижні. Повнофункціональний бот з Webview-інтеграцією, платіжною формою та аналітикою — 6–10 тижнів.







