Meta 真的會接受的 Webhook 網址。
Meta 會先檢查回呼網址(Callback URL)才肯儲存,之後如果沒有人確認收到,36 小時後就不再嘗試。AnyHook 替你回應檢查、儲存每個事件,並依自己的排程重試你的處理程式;只要方案還保存著,每個事件都能重播。
時限問題
Meta 會對你的回呼網址送出一個 GET,帶著 hub.mode=subscribe 和一個 challenge;除非你把那個 challenge 原封不動地當成整個回應主體回傳,否則它不會儲存這個網址。用隧道可以過關一次。等下一次 ngrok 給你新的主機名稱,你又得回到 App Dashboard 再做一遍,而你已經建立的訂閱,指向的是一個已經不存在的網址。
事件開始進來之後,期限就不是以單一請求計算,而是 36 小時。Meta 會在這段期間以遞減的頻率重試,之後丟棄所有從未被確認收到的通知。對自動回覆機器人來說,這段期間決定了你是回覆了一則留言,還是根本不知道它存在過。
36 小時
Meta 丟棄未確認通知之前的期限
1 個網址
涵蓋 Instagram、Facebook 與 Threads
GET
AnyHook 替你回應的交握
0
隧道重啟後需要重新驗證的次數
把回呼網址指向 AnyHook,只驗一個標頭
接收網址(inbound URL)永遠不變,所以 App Dashboard 的設定只要做一次。AnyHook 在邊緣節點檢查 Meta 的 X-Hub-Signature-256,儲存事件,再重新簽章,傳遞給你的處理程式。
// 1. In AnyHook: set the app's source to Meta, paste your App Secret.
// Optionally set a Verify Token. You invent that string, it is not
// something you copy out of Meta.
//
// 2. In Meta App Dashboard -> Webhooks:
// Callback URL: https://in.anyhook.net/{user-slug}/{app-slug}
// Verify Token: the same string you chose
//
// AnyHook answers the GET handshake, so the URL saves first time.
import { verifyWebhook } from "anyhook-verify";
export async function POST(req: Request) {
const ok = await verifyWebhook(req, process.env.ANYHOOK_SIGNING_SECRET!);
if (!ok) return new Response("invalid signature", { status: 401 });
const event = await req.json();
const change = event.entry?.[0]?.changes?.[0];
// Meta already has its acknowledgement. Take as long as you need here.
if (change?.field === "comments") {
await replyToComment(change.value); // an LLM call, a few seconds
}
return new Response("ok", { status: 200 });
}團隊常問的問題
- Meta 說我的回呼網址無法驗證,為什麼?
- 那個檢查是一個帶 hub.mode=subscribe 與 hub.challenge 的 GET;除非你的網址把 challenge 原封不動地當成整個主體回傳,不包 JSON、結尾也沒有換行,否則就會失敗。AnyHook 會替你回應,所以接收網址第一次就能儲存。如果你在 AnyHook 設定了 Verify Token(驗證權杖),在 App Dashboard 填入相同的字串。
- Instagram、Facebook 和 Threads 需要分開設定三次嗎?
- 不用。三者是同一套 Graph API Webhook 規格,簽章都是 X-Hub-Signature-256,所以一個 AnyHook App(一個接收網址,對應一個 Webhook 來源)就能涵蓋三者。要訂閱哪些項目,在 App Dashboard 選擇。
- 機器人重新部署時,留言和私訊會怎樣?
- 事件一抵達,AnyHook 就會儲存,並依退避排程重試你的端點,所以部署或當機不會讓你失去訊息。Meta 看到一次確認收到,就不再管它了。
- Verify Token 和 App Secret 是同一個東西嗎?
- 不是,而且兩者不該是同一個字串。App Secret(應用程式密鑰)用來簽署每個 payload,從不出現在網址裡。Verify Token 是你自己編的,它出現在設定交握的查詢字串裡,只在那一刻使用。把 App Secret 放進查詢字串,會讓它洩漏到沿途的每一份 log 裡。
換一個網址。Instagram 的處理程式不用改。
Free 方案每月涵蓋 10,000 個事件。不用 SDK:把 Instagram 指向你的 AnyHook 接收網址。