/webhooks/sms),默认验证 Twilio 请求签名,并通过 Twilio 的 Messages API 发回回复。
状态:官方插件,需单独安装。仅支持文本:不支持 MMS/媒体,仅支持私信。
配对
SMS 的默认私信策略是配对。
Gateway 安全
检查 Webhook 暴露情况和发送者访问控制。
渠道故障排查
跨渠道诊断和修复手册。
开始之前
你需要:- 使用
openclaw plugins install @openclaw/sms安装官方 SMS 插件。 - 一个 Twilio 账户,以及支持 SMS 的电话号码或 Twilio Messaging Service。
- Twilio Account SID 和 Auth Token。
- 一个可访问 OpenClaw Gateway 网关的公共 HTTPS URL。
- 选择发送者策略:私用选择
pairing(默认),预先批准的电话号码选择allowlist,仅在有意开放公共 SMS 访问时选择open。
快速设置
1
安装插件
2
创建或选择 Twilio 发送方
在 Twilio 中,打开 Phone Numbers > Manage > Active numbers,然后选择一个支持 SMS 的号码。保存以下信息:
- Account SID,例如
ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - Auth Token
- 发送方电话号码,例如
+15551234567
MGxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx。3
配置 SMS 渠道
将以下内容保存为 应用配置:
sms.patch.json5,并修改占位符:4
将 Twilio 指向 Gateway 网关 Webhook
在 Twilio 电话号码设置中,打开 Messaging,并将 A message comes in 设置为:使用 HTTP
POST。默认本地路径为 /webhooks/sms;如需使用其他路由,请更改 channels.sms.webhookPath。5
暴露确切的 SMS Webhook 路径
公共 URL 必须将 SMS 路径路由到 Gateway 网关进程(默认端口为 语音通话和 SMS 使用不同的 Webhook 路径。如果同一个 Twilio 号码同时处理两者,请在 Twilio 和隧道中保留这两条路由的配置。
18789)。如果使用 Tailscale Funnel 进行本地测试,请显式暴露 /webhooks/sms:6
启动 Gateway 网关并批准第一个发送者
配置示例
所有键都位于channels.sms 下(每个账户的键位于 channels.sms.accounts.<id> 下):
配置文件
如果希望渠道定义随 Gateway 网关配置一起管理,请使用配置文件进行设置:环境变量
环境变量仅应用于默认账户;配置值的优先级高于环境变量值。SecretRef 身份验证令牌
authToken 可以是 SecretRef(source: "env" | "file" | "exec")。如果希望 Gateway 网关从 OpenClaw 密钥运行时解析 Twilio Auth Token,而不是以纯文本配置形式存储,请使用此方式:
Messaging Service 发送方
如果应由 Twilio 通过 Messaging Service 选择发送方,请使用messagingServiceSid 而不是 fromNumber:
fromNumber 和 messagingServiceSid,则使用 fromNumber。
默认出站目标
如果自动化或智能体发起的投递流程在未指定明确目标时应有默认目标,请设置defaultTo:
访问控制
channels.sms.dmPolicy 控制直接 SMS 访问:
pairing(默认):未知发送者会收到配对码;使用openclaw pairing approve sms <CODE>批准。allowlist:仅处理allowFrom中的发送者。如果allowFrom为空,则拒绝所有发送者(Gateway 网关会记录启动警告)。open:配置验证要求allowFrom包含"*"。如果没有通配符,则只有列出的号码可以聊天。disabled:丢弃所有入站私信。
allowFrom 条目应为 E.164 电话号码,例如 +15551234567。系统接受并规范化 sms: 和 twilio-sms: 前缀。对于私人助理,建议将 dmPolicy: "allowlist" 与明确的电话号码配合使用:
发送 SMS
选择 SMS 渠道后,目标可以是纯 E.164 号码,也可以带有sms: 前缀:
twilio-sms: 前缀会选择此渠道,同时不会占用 sms: 服务前缀;iMessage 使用后者为自己的目标选择运营商 SMS 投递:
--target。defaultTo 用于可从渠道配置中解析目标的自动化和智能体发起的投递路径。
来自入站 SMS 对话的智能体回复会通过已配置的 Twilio 发送方自动发回给发送者。
SMS 输出为纯文本。OpenClaw 会移除 Markdown、展平围栏代码块、将链接重写为 label (url),并在通过 Twilio 发送前,将较长的回复拆分为每块最多 textChunkLimit 个字符(默认 1500)的分块。
验证设置
Gateway 网关启动后:- 确认 Gateway 网关日志中显示 SMS webhook 路由。
- 运行 Twilio 端探测(检查已配置的 Twilio webhook URL/方法和近期入站错误):
- 用你的手机向 Twilio 号码发送一条 SMS。
- 运行
openclaw pairing list sms。 - 使用
openclaw pairing approve sms <CODE>批准配对码。 - 再发送一条 SMS,并确认智能体进行了回复。
从 macOS iMessage/SMS 进行端到端测试
在可通过 Messages 发送运营商 SMS 的 Mac 上,你可以使用imsg 驱动发送方,而无需操作手机:
Webhook 安全
默认情况下,OpenClaw 使用publicWebhookUrl 和 authToken 验证 X-Twilio-Signature。请确保 publicWebhookUrl 的端点部分与 Twilio 中配置的 URL 逐字节一致,包括协议、主机、路径和查询字符串。按照 Twilio 的要求,OpenClaw 在计算签名时会排除 Twilio 连接覆盖片段(#...)。
独立于签名验证,webhook 路由还会强制执行以下规则:
- 仅允许
POST。 - 每个 SMS 账户、webhook 路由和解析出的客户端地址每分钟最多可有 300 个失败请求。所有请求都会计入此预算,但仅当请求未通过正文解析、Twilio 验证或 AccountSid 匹配后,才会应用 HTTP 429。
- 通过上述检查后,每个 SMS 账户、webhook 路由和解析出的客户端地址每分钟最多接受 30 个可分发的回调(超过时返回 HTTP 429)。如果禁用签名验证,此每分钟 30 次的限制即为未经身份验证的分发上限。
- 客户端地址通过共享的 Gateway 网关可信代理规则解析。如果
gateway.trustedProxies包含转发 Twilio 回调的反向代理,OpenClaw 会根据转发的客户端地址应用这些限制;否则会回退到直接套接字地址。 - 有效载荷中的
AccountSid必须与已配置的accountSid匹配(否则返回 HTTP 403)。 - 重复使用的
MessageSid值会在 10 分钟内去重。 - 每个 SMS 账户的重放缓存最多保留 10,000 个仍然有效的消息 SID。当所有槽位均有效时,该账户的新 webhook 会以 HTTP 429 和
Retry-After标头采用失败关闭方式拒绝,直至最早的槽位过期。 - 超过 32 KB 的请求正文会被拒绝。
Retry-After。#rp=4xx 和 #rp=all 连接覆盖会启用 4xx 重试,但 Twilio 将完整重试事务限制在 15 秒内,因此重试仍可能在重放缓存槽位过期前结束。如果必须由其他处理程序接收投递失败的消息,请配置备用 URL;应将 429 视为失败关闭式拒绝,而非可靠的背压机制。
仅用于本地隧道测试时,可以设置:
多账户配置
运营多个 Twilio 号码时,请使用accounts:
webhookPath;如果某个路径已归另一个账户所有,Gateway 网关会拒绝注册使用该路径的 webhook 路由。TWILIO_*/SMS_* 环境变量回退仅适用于默认账户;设置 defaultAccount 可更改默认账户。
故障排除
Twilio 返回 403 或 OpenClaw 拒绝 webhook
检查publicWebhookUrl 是否与 Twilio 中配置的 URL 完全匹配,包括协议、主机、路径和查询字符串。Twilio 会对公共 URL 字符串签名,因此代理重写和备用主机名可能导致签名验证失败。
出现包含 Invalid account 的 403,表示入站有效载荷中的 AccountSid 与已配置的 accountSid 不匹配;请检查 webhook 是否指向拥有该号码的账户。
未出现配对请求
检查 Twilio 号码的 Messaging webhook URL 和方法。它必须指向 SMS webhook URL,并使用POST。还要确认 Gateway 网关可从公共互联网或通过你的隧道访问。
如果 Twilio 消息日志显示错误 11200,则表示 Twilio 已接受入站 SMS,但无法访问你的 webhook。请检查:
- Twilio 的 Messaging > A message comes in 是否指向
publicWebhookUrl。 - 方法是否为
POST。 - 隧道或反向代理是否公开了完全一致的
webhookPath;对于 Tailscale Funnel,请运行tailscale funnel status并确认其中列出了/webhooks/sms。 publicWebhookUrl是否使用 Twilio 发送时相同的协议、主机、路径和查询字符串,以便签名验证可以重现已签名的 URL。
openclaw channels status --channel sms --probe 会同时显示不匹配的 Twilio webhook 设置和近期 11200 错误。
出站发送失败
确认accountSid、authToken 以及 fromNumber 或 messagingServiceSid 已解析。如果使用 Twilio 试用账户,可能需要先在 Twilio 中验证目标号码,才能发送出站 SMS。
消息已送达,但智能体未回复
检查dmPolicy 和 allowFrom。使用默认的 pairing 策略时,必须先批准发送者,才能处理正常的智能体轮次。