这篇只处理 Telegram Bot 和短信桥接设计。Python 程序部署、自启动和日志放到下一篇。
为什么短信单独处理
FreePBX 擅长处理语音呼叫,但短信不是它的强项。很多语音网关虽然支持 SMS over SIP、SMPP、SMTP 或 HTTP API,但 FreePBX 默认并不适合直接接管短信。
更稳的方式是:
语音网关短信接口
↓
Python 桥接程序
↓
Telegram Bot这样电话链路和短信链路彼此独立。电话坏了不一定影响短信,短信脚本升级也不会动到 PBX。
创建 Bot
在 Telegram 搜索:
@BotFather创建流程:
- 发送
/newbot。 - 输入机器人显示名称,例如
Home VoIP SMS。 - 输入唯一用户名,必须以
bot结尾,例如home_voip_sms_bot。 - BotFather 返回 API Token。
Token 形态类似:
1234567890:AAExampleTokenDoNotExpose保存好这个 Token。它相当于机器人密码,不要写进公开仓库,也不要截图发到公开群里。
获取 chat_id
Bot 需要知道把短信发给谁。最简单的办法:
- 先给你的 Bot 发一条消息,例如
hello。 - 在服务器上请求 Telegram API:
curl "https://api.telegram.org/bot<TOKEN>/getUpdates"返回 JSON 里找到:
"chat": {
"id": 123456789,
"type": "private"
}这个 id 就是私聊 chat_id。如果要发到群组,需要先把 Bot 拉进群里,再在群里发一条消息,然后同样用 getUpdates 找群组 ID。
权限设计
短信 Bot 至少要做两层限制:
- 只允许固定
chat_id收短信。 - 只允许固定
chat_id发送短信指令。
不要让 Bot 响应任何陌生人的命令。Python 程序里可以把允许列表写成:
ALLOWED_CHAT_IDS = {123456789}收到消息时先判断:
if update.effective_chat.id not in ALLOWED_CHAT_IDS:
return下一篇采用的测试通过脚本为了保持简单,没有内置这段白名单判断;如果 Bot 只在自己的私聊里使用问题不大。若要拉进群组或长期公开运行,建议把上面的判断补进 handle_message()。
短信接收格式
建议把收到的短信整理成固定格式:
新短信
卡槽:1
来源:+8613800000000
时间:2026-05-19 11:30:00
验证码 123456,请勿告诉他人。固定格式的好处是后面搜索、转发、自动归档都方便。
短信发送指令
本文后续使用的测试脚本采用最简单的文本格式:直接发送“目标号码 空格 短信内容”。
13800000000 你好,这是一条测试短信含义:
| 字段 | 说明 |
|---|---|
13800000000 | 接收短信的目标号码,改成真实收信号码 |
| 空格 | 号码和正文之间必须有一个空格 |
你好,这是一条测试短信 | 要发送的短信正文 |
Python 程序收到 Telegram 文本后,会按第一个空格拆分号码和正文,再通过 SMPP 接口发出短信。
网关侧短信出口
不同网关支持能力不同,常见路径有三种:
| 方式 | 适用情况 | 说明 |
|---|---|---|
| HTTP API | 易排错 | Python 直接请求网关接口,链路短 |
| SMTP/Email | 适合只收短信 | 网关把短信发到邮箱,再由程序读取 |
| SMPP | 本文采用 | 适合网关已提供 SMPP 服务的场景 |
后续实测脚本走的是 SMPP:Python 与网关建立 SMPP transceiver 连接,既收短信,也发短信。
配置文件建议
如果要长期维护,建议把 Token、chat_id、SMPP 账号密码单独放:
/etc/voip-sms-bot.env示例:
TELEGRAM_BOT_TOKEN=1234567890:AAExampleTokenDoNotExpose
TELEGRAM_CHAT_ID=123456789
SMPP_SERVER=10.20.20.74
SMPP_PORT=2775
SMPP_USERNAME=sms
SMPP_PASSWORD=change_me
SMPP_PHONE_NUMBER=13800000000权限收紧:
chown root:root /etc/voip-sms-bot.env
chmod 600 /etc/voip-sms-bot.env测试顺序
不要一上来就写完整服务。建议按顺序测试:
- Bot 能否给自己发消息。
- Python 脚本顶部配置是否都已改成自己的值。
- Python 能否调用 Telegram
sendMessage。 - Python 能否连接并绑定 SMPP 服务。
- 网关收到短信时,Python 能否拿到短信内容。
- Telegram 收到格式化短信通知。
目标号码 短信内容能否触发网关发短信。
每一步都留日志,后面放进 systemd 才好排错。
下一步
下一篇把 Python 虚拟环境、依赖安装、脚本运行方式和 systemd 自启动整理成一个长期可维护的服务。