Przejdź do treści
Intum

Integracja z Meta (Facebook Messenger, Instagram, komentarze pod postami)

Aktualizacja: 4 min czytania

Konektor social_media/meta

Pola modelu Connect::Connector:

  • kind: social_media/meta
  • code: zwykle meta_social (per konto)
  • secret_token: App Secret aplikacji Meta - per-konektor fallback dla Rails.application.credentials.meta.app_secret
  • fields.app_id: App ID aplikacji Meta - fallback dla Rails.application.credentials.meta.app_id
  • config.pages[<page_id>]: konfiguracja strony FB - page_name, page_access_token, app_secret, verify_token, desk_id, category_id, instagram_active, ig_account_id
  • config.oauth_states: tymczasowe state-y OAuth, czyszczone po callbacku

Endpointy publiczne (allow_public)

Metoda URL Opis
GET /connect/connector/{code}/webhook_facebook Weryfikacja Meta (hub.challenge)
POST /connect/connector/{code}/webhook_facebook Wiadomości Messenger + komentarze feed
GET /connect/connector/{code}/webhook_instagram Weryfikacja IG
POST /connect/connector/{code}/webhook_instagram Wiadomości IG DM
GET /connect/connector/{code}/oauth_start?desk_id=X Start OAuth (wymaga sesji agenta)
GET /connect/connector/{code}/oauth_callback Powrót z OAuth

Metody connector_method

  • check - sprawdza poświadczenia przez Graph API (/v21.0/{app_id}?fields=id,name)
  • pages - zwraca listę podłączonych stron z config
  • install_outgoing_webhook - idempotentnie zakłada Account::Webhook (target_kind=connector, target_code=<code>, source_type=Helpdesk::Comment, kind=create)
  • uninstall_outgoing_webhook - usuwa Account::Webhook tego konektora

Wywołanie:

POST /connect/connectors/{id}/method/install_outgoing_webhook
Authorization: Bearer TOKEN

Routing wiadomości

Stan trzymamy w Connect::DataObject (connector_id + object_name + object_id UNIQUE):

  • fb_mid - dedup wiadomości Messenger (object_id = mid)
  • fb_comment_id - dedup komentarzy FB (object_id = comment_id, data: ticket_id)
  • fb_ticket - routing ticket → sender/page (object_id = ticket_id, data: sender_id / top_comment_id, page_id, kind = messenger|instagram|comment)

Outgoing dispatch

Account::Webhook#deliver! z target_kind=connector wywołuje connector.dispatch_webhook_event(source_type:, kind:, record:). Dla Helpdesk::Comment#create:

  1. Skip jeśli comment.internal? lub comment.created_by_id.blank? (komentarz klienta) lub comment.fields["ai_comment"]
  2. Szuka routingu w DataObject(object_name: "fb_ticket", object_id: ticket_id)
  3. Wysyła przez Messenger Send API (POST /me/messages) albo Graph Comments API (POST /{comment_id}/comments) w zależności od kind

Weryfikacja podpisu

Przychodzące webhooki Meta są podpisane nagłówkiem X-Hub-Signature-256 (HMAC-SHA256 z App Secret). Bez nagłówka payload jest tolerowany (dev), z nieprawidłowym - odrzucany cicho (HTTP 200 ok, ale bez przetwarzania, żeby Meta nie wyłączała subskrypcji). Per-page secret w config.pages[id].app_secret, fallback na globalny secret_token konektora.

OAuth scope

pages_messaging
pages_manage_metadata
pages_read_engagement
pages_read_user_content
pages_manage_engagement
pages_show_list
instagram_basic
instagram_manage_messages

Instalator (Noe App)

Noe::Appstore::NoeAppstore::INTEGRATIONS[:meta_social]:

  • url_code: meta-social-integration
  • svelte: meta_social_integration.svelte
  • show_in_module: helpdesk/settings
  • helplink: account_apps_meta_social

Instalacja: Noe::Appstore::NoeAppstore.install_app(:meta_social) (lub przez UI /account/apps).