一个 Meta 真正会接受的 Webhook URL。
Meta 要先检查回调 URL 才肯保存;之后如果一直没人应答,36 小时后就不再尝试。AnyHook 替你应答这次检查,保存每个事件,并按自己的计划重试你的处理程序,只要你的套餐还保留着事件,每个事件都可以重放。
时限问题
Meta 会向你的回调 URL 发送一个 GET 请求,带着 hub.mode=subscribe 和一个 challenge;除非你把这个 challenge 原样作为整个响应体返回,否则它不会保存这个 URL。内网穿透工具能让你过一次。等 ngrok 下次给你换了新主机名,你又得回到 App Dashboard 再来一遍,而你已经建好的订阅指向的是一个不存在的地址。
事件开始流入之后,时限就不再按请求计算,而是 36 小时。Meta 在这段时间里以逐渐降低的频率重试,然后丢弃所有从未被应答的通知。对一个自动回复机器人来说,这个窗口决定了你是回复了一条评论,还是永远不知道它存在过。
36 小时
Meta 丢弃未应答通知之前的时间
1 个 URL
覆盖 Instagram、Facebook 和 Threads
GET
AnyHook 替你应答的握手
0
内网穿透工具重启后的重新验证次数
把回调指向 AnyHook,只验证一个请求头
接收 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 说我的回调 URL 无法通过验证,为什么?
- 这个检查是一个带 hub.mode=subscribe 和 hub.challenge 的 GET 请求;除非你的 URL 把 challenge 原样作为整个响应体返回(不包 JSON,末尾也没有换行),否则就会失败。AnyHook 会应答这个检查,所以接收 URL 第一次就能保存成功。如果你在 AnyHook 中设置了 Verify Token,就在 App Dashboard 里填入同一个字符串。
- Instagram、Facebook 和 Threads 需要分别配置三次吗?
- 不需要。它们共用一套 Graph API Webhook 约定,签名都是同一个 X-Hub-Signature-256,所以一个 AnyHook App 就能覆盖这三个平台。在 App Dashboard 里选择你需要的订阅即可。
- 机器人重新部署期间,评论和私信会怎样?
- 事件一到达,AnyHook 就会保存,并按退避策略重试你的端点,所以一次部署或崩溃不会让你丢掉消息。Meta 收到一次应答,就不再管这件事了。
- Verify Token 和 App Secret 是一回事吗?
- 不是,而且两者不应该用同一个字符串。App Secret 用来为每个请求体签名,从不出现在 URL 里。Verify Token 是你自己编的,它出现在配置握手的查询字符串里,只在那一刻使用。把 App Secret 放进查询字符串,会让它泄露到沿途的每一份日志里。
只改一个 URL。Instagram 处理程序不用动。
Free 套餐包含每月 10,000 个事件。无需 SDK:把 Instagram 指向你的 AnyHook 接收 URL。