短信转发助手

接入文档

短信转发助手把安卓手机收到的短信、以及 App 通知里的验证码,转发到群机器人、你的程序和 AI。接口地址:https://api.smsforwarder.app。

开始

  1. 在收短信的手机上安装 App,点「开始使用」。
  2. 允许读取短信。App 推送里的验证码,到设置里打开「同时转发 App 通知里的验证码」。
  3. 在 App 首页「接入你的程序和 AI」里复制 API Key,以 sk_ 开头。
  4. 在 App 里点「发一条测试消息」,然后试一下:
curl -H "Authorization: Bearer sk_你的Key" "https://api.smsforwarder.app/v1/messages?limit=1"

转发到群机器人

把下面这些地址设成转发地址,消息会按群聊文字发过去:第一行是验证码和来源,接着是短信原文,最后一行「来自短信转发助手」。

去处地址的样子
飞书https://open.feishu.cn/open-apis/bot/v2/hook/…
钉钉https://oapi.dingtalk.com/robot/send?access_token=…
企业微信https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=…
Bark(iPhone 推送)https://api.day.app/你的设备Key,点推送就复制验证码
Telegramhttps://api.telegram.org/bot<token>/sendMessage?chat_id=<chat id>
Slack / Discord频道的 Incoming Webhook 地址

以飞书为例

  1. 群设置 → 群机器人 → 添加机器人 → 自定义机器人,复制 Webhook 地址。
  2. 安全设置可以不开;要开就选「自定义关键词」,填「短信转发助手」。钉钉同理。
  3. 在 App 的设置里点「转发到群聊或网址」,粘贴地址,点「保存并测试」,群里会收到一条测试消息。也可以在电脑上执行:
curl -X PUT https://api.smsforwarder.app/v1/webhook \
  -H "Authorization: Bearer sk_你的Key" \
  -d '{"url":"https://open.feishu.cn/open-apis/bot/v2/hook/xxxx"}'

curl -X POST https://api.smsforwarder.app/v1/webhook/test -H "Authorization: Bearer sk_你的Key"

测试接口返回 {"ok":true} 就说明群里应该已经收到了一条测试消息;被机器人拒了会把对方的回复带回来,照着改即可。不想转了:DELETE /v1/webhook。

API Key

请求头带 Authorization: Bearer sk_…。不方便加请求头的工具,也可以用 x-api-key 头或 ?key= 参数。

接口作用
GET /v1/keys列出 Key(前缀、名字、最后使用时间)
POST /v1/keys新建一个 Key,请求体 {"name":"CI"},完整 Key 只显示这一次
DELETE /v1/keys/:id作废一个 Key
GET /v1/me当前套餐、额度和本月已用条数

等验证码

GET /v1/codes/wait 会一直挂着,直到带验证码的消息到了才返回。在点完「发送验证码」后立刻调用。

参数
from来源,比如 淘宝、支付宝、Google,或号码的一部分。会同时匹配发件号码、App 名和短信原文。知道是哪家就一定带上,免得拿到别家的验证码
contains短信必须包含的文字
sinceISO 时间或毫秒时间戳,只算这之后到的。默认是 2 分钟前
timeout最多等几秒,0–120,默认 60
device只看某台手机
sourcesms 或 notification
curl -G https://api.smsforwarder.app/v1/codes/wait \
  -H "Authorization: Bearer sk_你的Key" \
  --data-urlencode "from=淘宝" -d timeout=60

到了返回 200 和 {"code":"731942","message":{…}};超时没到返回 404 和 {"code":null}。

GET /v1/codes/latest 参数相同,不等待,直接返回最新一条匹配的验证码。

消息列表

GET /v1/messages 按时间倒序返回最近的消息。参数:from、contains、since、source、device、codes_only=true、limit(1–100,默认 20)。

消息字段

{
  "id": "msg_…",
  "source": "sms",                 // 或 "notification"
  "service": "淘宝",               // App 名、短信里的【签名】,都没有时是发件号码
  "from": "1065502…",              // 发件号码,通知则是标题
  "app": null,                     // 通知来自哪个 App
  "appPackage": null,
  "body": "【淘宝】验证码731942,用于登录,5分钟内有效。",
  "code": "731942",                // 没识别出验证码时为 null
  "device": { "id": "dev_…", "name": "Xiaomi 14" },
  "simSlot": 0,
  "receivedAt": "2026-10-13T09:41:00.000Z"
}

MCP(AI 助手)

MCP 地址 https://api.smsforwarder.app/mcp(Streamable HTTP),工具:wait_for_code、list_messages、list_devices。

Claude Code

claude mcp add --transport http sms-forwarder https://api.smsforwarder.app/mcp \
  --header "Authorization: Bearer sk_你的Key"

Cursor、Claude Desktop 等

{
  "mcpServers": {
    "sms-forwarder": {
      "type": "http",
      "url": "https://api.smsforwarder.app/mcp",
      "headers": { "Authorization": "Bearer sk_你的Key" }
    }
  }
}

只能填一个地址的客户端,用 https://api.smsforwarder.app/mcp?key=sk_你的Key。

Agent Skill

Claude Code 等支持 Skill 的 Agent,把 skill.md 存成技能目录里的 SKILL.md,再设好 SMSFORWARDER_API_KEY:

mkdir -p ~/.claude/skills/sms-forwarder
curl -o ~/.claude/skills/sms-forwarder/SKILL.md https://duanxinzhuanfa.com/skill.md
export SMSFORWARDER_API_KEY=sk_你的Key

命令行

需要 Node.js 18 及以上。

npm install -g smsforwarder
smsforwarder login sk_你的Key        # 或者设 SMSFORWARDER_API_KEY
smsforwarder code --from 支付宝       # 只打印验证码;超时退出码 2
smsforwarder code --json             # 打印整条消息
smsforwarder messages --codes --limit 5
smsforwarder devices
smsforwarder webhook set https://open.feishu.cn/open-apis/bot/v2/hook/xxxx
smsforwarder mcp                     # 打印 MCP 配置

Webhook 签名

普通地址收到的是 JSON:{"event":"message.received","message":{…}},失败会再重试两次。请求头 x-signature: t=<秒级时间戳>,v1=<hex>,其中 hex 是用设置 Webhook 时返回的 secret 对 <t>.<原始请求体> 做的 HMAC-SHA256:

import crypto from "node:crypto";

function verify(rawBody, header, secret) {
  const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
  return crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
}

手机管理

GET /v1/devices已连接的手机和最后在线时间 lastSeenAt
DELETE /v1/devices/:id断开一台手机
POST /v1/pairing-codes生成 6 位配对码(10 分钟有效),用来把另一台手机加进同一个账号

手机几个小时没在线,通常是被系统清理了后台。App 里点「允许后台运行」;小米、华为、荣耀、OPPO、vivo 还要打开自启动。

错误和额度

出错时返回 {"error":{"code":"invalid_api_key","message":"…"}}。

状态码code含义
401missing_api_key、invalid_api_key没带 Key、Key 不对或已作废
402device_limit手机数量到了套餐上限
404not_found接口不存在,或等验证码超时

免费版:1 台手机,每月 100 条,消息保留 7 天。超出当月额度的短信留在手机上,不再转发。