Konektor social_media/meta
Pola modelu Connect::Connector:
-
kind:social_media/meta -
code: zwyklemeta_social(per konto) -
secret_token: App Secret aplikacji Meta - per-konektor fallback dlaRails.application.credentials.meta.app_secret -
fields.app_id: App ID aplikacji Meta - fallback dlaRails.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ładaAccount::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:
- Skip jeśli
comment.internal?lubcomment.created_by_id.blank?(komentarz klienta) lubcomment.fields["ai_comment"] - Szuka routingu w
DataObject(object_name: "fb_ticket", object_id: ticket_id) - Wysyła przez Messenger Send API (
POST /me/messages) albo Graph Comments API (POST /{comment_id}/comments) w zależności odkind
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).