
你肯定见过这种玩法:某个 Reel 说"评论 GUIDE 我就发给你",你刚发完评论,几秒钟后私信就来了。这不是有人在盯着手机,而是基于 Meta 官方 Instagram API 构建的事件驱动系统。
这篇文章聊清楚几件事:评论怎么推送到你的服务器、私信怎么发出去、有哪些限制需要提前设计好,以及为什么"给我密码"的机器人是个坑。内容保持在架构层面,Meta 会改 API 版本、权限名和限制,具体数值以官方 Instagram Platform 文档为准。
一个评论转私信的流程需要四样东西:
整个过程不涉及用户的 Instagram 密码。账号主人在 Meta 自家页面登录、审批权限,你的应用拿到一个限定范围的访问令牌,账号主人随时可以撤销。
轮询每个帖子查新评论又慢又浪费限流配额。正确做法是订阅账号的 Webhook 字段:这个流程需要 comments 字段,加上私信功能的 messaging 字段。
Webhook 配置有两块,第一天就得搞对:
一条评论通知大概包含这些信息:属于哪个账号、评论 ID、评论内容、评论者是谁、挂在哪个媒体内容上。下面的结构仅作示例,从真实 payload 简化而来,具体字段名以官方文档为准:
// ILLUSTRATIVE ONLY: simplified, not the exact Meta payload
{ "object": "instagram", "entry": [{ "id": "<ig-account-id>", "time": 1760000000, "changes": [{ "field": "comments", "value": { "id": "<comment-id>", "text": "GUIDE please!", "from": { "id": "<commenter-id>", "username": "someone" }, "media": { "id": "<media-id>" } } }] }]
}
处理器应该验证签名、把事件入队、迅速返回 200。如果端点慢或者持续失败,Meta 会重试投递,最后可能直接关掉这个订阅。真正干活的事丢给后台 Worker。
Worker 查一下这个自动化是否适用:
这是核心概念。正常情况下,企业账号只能在对方先发消息后才能给对方发私信。私信回复(Private Replies)就是这个场景的例外:它允许账号在回复某人的评论时给对方发私信,方式是把消息发送给评论 ID 而不是用户 ID。
逻辑上就是调用消息接口,收件人填评论 ID 而不是用户 ID。同样,下面的代码仅作示例,不是能直接复制使用的:
# ILLUSTRATIVE ONLY: check Meta's docs for the current endpoint and version
def send_private_reply(account, comment_id, text, link): body = { "recipient": {"comment_id": comment_id}, # address the comment, not the user
"message": {"text": f"{text}\n{link}"}, } return graph_post(f"/{account.ig_id}/messages", body, token=account.token)
关键约束,粗略说一下:
很多流程还会同时发一条公开回复("已发送!去私信查收"),通过评论回复接口发出去。让其他看到评论的人知道这个流程是真实可用的。可以轮换几条不同的文案,别让评论区全是重复内容。
一旦对方回复了你的私信,就进入了标准对话,标准消息规则开始适用。核心规则:企业可以在用户最后一条消息后 24 小时内自由回复。超过这个窗口,发送受限到 Meta 允许的特定场景(比如人工客服在更长窗口内回复,这个需要单独权限)。
这会影响你的设计:
一条爆款 Reel 一小时内可能产生几千条评论。这就是业余脚本挂掉的原因。
限流。 Graph API 有按应用、按账号的限流,消息还有单独的吞吐限制。在每个账号维度上用令牌桶队列控制发送,收到限流错误就退避。不要从博客文章里硬编码一个数字,读 Meta 返回的响应头和错误码。
重复投递。 Webhook 至少投递一次,所以偶尔会收到同一条评论事件的两次通知。用评论 ID 做幂等 key:
# ILLUSTRATIVE ONLY
def handle_comment(event): key = f"private-reply:{event.comment_id}" if not store.set_if_absent(key, ttl_days=30): return # already handled (or in progress)
rule = match_rule(event) if rule is None or event.author_id == event.account_id: return enqueue_send(event.account_id, rule, event.comment_id)
因为每条评论只能发一条私信回复,重复发送要么失败要么看起来像垃圾。记录每次结果(已发送、错误码失败、跳过),重试只重跑安全的情况。
Token 健康度。 令牌会过期或被撤销。认证错误应该触发暂停该账号的自动化并通知负责人,而不是无脑重试。
在官方 API 支持私信之前,很多工具是用用户名和密码登录、像真人一样操控应用的。现在还有人在用。问题很大:
走官方路线更费劲,但这是唯一能长期做的选择。
如果不想自己维护这套流水线,市面上有托管工具打包了同样的组件。AutoPilotDM 是一个例子:通过 Meta 官方权限连接 Instagram 专业账号(不需要密码),让账号主人选择帖子或 Reel、设定关键词、写公开回复和私信内容。同样的事件流水线处理关键词私信回复、欢迎消息、Story 提及和回复响应、FAQ 回答、内聊线索表单和人工接管。
不管是自己造还是买, Checklist 是一样的: