Разработка мобильного чат-бота для Facebook Messenger
Facebook Messenger Platform — зрелый API с богатым набором UI-компонентов: Quick Replies, Generic Templates, Buttons, Webview. Бот регистрируется как Facebook App и привязывается к Facebook Page. Для российского рынка использование Meta-продуктов ограничено, но для международных проектов — полноценный канал.
Настройка: 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 indicator
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)
Без typing indicator ответ «появляется из ниоткуда» — особенно критично при задержке 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 Notification.
Доступность в РФ: Meta заблокирована, но API доступен при наличии соответствующих инструментов. Для международных проектов ограничений нет.
Процесс работы
Создание Facebook App и привязка к Page. Настройка webhook и подписок. Реализация обработчиков: text messages, postbacks, attachments. UI-компоненты: Quick Replies, Generic Template, Persistent Menu. Webview-интеграция для сложных форм. Аналитика через Facebook Insights.
Ориентиры по срокам
Базовый бот с Quick Replies и Generic Template — 2–3 недели. Полноценный бот с Webview-интеграцией, платёжной формой и аналитикой — 6–10 недель.







