接入文档
短信转发助手把安卓手机收到的短信、以及 App 通知里的验证码,转发到群机器人、你的程序和 AI。接口地址:https://api.smsforwarder.app。
开始
- 在收短信的手机上安装 App,点「开始使用」。
- 允许读取短信。App 推送里的验证码,到设置里打开「同时转发 App 通知里的验证码」。
- 在 App 首页「接入你的程序和 AI」里复制 API Key,以
sk_开头。 - 在 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,点推送就复制验证码 |
| Telegram | https://api.telegram.org/bot<token>/sendMessage?chat_id=<chat id> |
| Slack / Discord | 频道的 Incoming Webhook 地址 |
以飞书为例
- 群设置 → 群机器人 → 添加机器人 → 自定义机器人,复制 Webhook 地址。
- 安全设置可以不开;要开就选「自定义关键词」,填「短信转发助手」。钉钉同理。
- 在 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 | 短信必须包含的文字 |
since | ISO 时间或毫秒时间戳,只算这之后到的。默认是 2 分钟前 |
timeout | 最多等几秒,0–120,默认 60 |
device | 只看某台手机 |
source | sms 或 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 | 含义 |
|---|---|---|
| 401 | missing_api_key、invalid_api_key | 没带 Key、Key 不对或已作废 |
| 402 | device_limit | 手机数量到了套餐上限 |
| 404 | not_found | 接口不存在,或等验证码超时 |
免费版:1 台手机,每月 100 条,消息保留 7 天。超出当月额度的短信留在手机上,不再转发。