用 HTTP API 从自己的手机发短信
概述
本技能封装 Traccar SMS Gateway 安卓 App —— 它把一部手机变成私有短信网关,
对外暴露一个极简的本地 HTTP API。无需向短信服务商付费,短信直接从你自己的
SIM 卡发出。随附的 scripts/send_sms.py 用纯 Python 标准库(零依赖)完成 HTTP
调用;scripts/send_sms.sh 是等价的 curl 版;references/api.md 记录了完整接口约定。
在以下场景使用本技能:
- 从脚本、自动化流程或 agent 里用 HTTP 发短信。
- 把个人安卓手机当作短信网关。
- 不想用第三方短信服务、希望消息全程本地化。
- 让 Traccar 服务器把手机作为短信发送通道。
前置准备(手机端,一次性)
- 安装 Traccar SMS Gateway(Google Play,或从
GitHub releases 下载 APK)。 - 打开 App → 设置 → General → Gateway → Configuration → Local Service →
开启 Enable service。 - 复制其中的 Token 和 Endpoints 地址(如
http://192.168.1.10:8082)。 - 保持 App 常驻(关闭该 App 的电池优化),并让手机连着 Wi-Fi。
快速开始
直接发送一条短信:
python3 scripts/send_sms.py \
--endpoint 'http://192.168.1.10:8082/' \
--token 'bbcb9958-864c-4048-aeb0-a60fafb46c78' \
--to '+8613800138000' \
--message '来自我自己网关的问候'
成功时会打印 SMS SENT (HTTP 200) 并以退出码 0 结束。
更习惯用 Bash/curl?scripts/send_sms.sh 接受完全相同的参数
(--endpoint、--token、--to、--message、--check)和同样的环境变量,
适合在没有 Python 的机器上使用。原始 curl 一行命令和连通性检测命令见
references/api.md。
反复使用(环境变量)
把 endpoint 和 token 设置一次,之后每次只传消息内容:
export TRACCAR_SMS_ENDPOINT='http://192.168.1.10:8082/'
export TRACCAR_SMS_TOKEN='bbcb9958-864c-4048-aeb0-a60fafb46c78'
python3 scripts/send_sms.py --to '+8613800138000' --message 'Ping'
命令行参数始终优先于环境变量。
连通性检测
发送前先确认手机可达(对 endpoint 发起一次 GET,会返回接口格式说明文本):
python3 scripts/send_sms.py --check
接口约定(摘要)
POST {endpoint}/
Authorization: {token}
Content-Type: application/json
{ "to": "+8613800138000", "message": "你的短信内容" }
- 成功 → HTTP
200。App 无状态,不保存任何送达回执。 to必须是带前导+的国际 E.164 格式。- 短信从手机自身的 SIM 卡号发出(没有
from字段)。
完整接口说明、启用步骤、Traccar 服务器端配置写法以及常见坑,见
references/api.md。
注意事项与常见坑
- 仅限局域网。 endpoint 是内网地址;不做端口转发(不推荐)时无法从公网访问。
- 端口 默认
8082—— 以 App 里显示的为准。 - App 必须存活。 App 被杀或手机休眠会导致连接错误。
- 无回执。 App 不持久化消息,事后无法通过 API 查询发送状态。
- 长短信 会被拆成多条拼接短信发送(可能按条计费)。
安全
- Token 是 bearer 凭证 —— 同网络内任何知道它的人都能用这部手机发短信(并产生
话费)。请妥善保密,不要提交到代码仓库,优先用环境变量而非硬编码。 - 该通道按设计就是局域网明文 HTTP,仅在可信网络中使用,切勿把 endpoint 暴露到公网。