出国自建 VoIP(四):创建 Telegram Bot 并规划短信桥接

为语音网关短信通知创建 Telegram Bot,并梳理短信接收、发送、权限和消息格式。

这篇只处理 Telegram Bot 和短信桥接设计。Python 程序部署、自启动和日志放到下一篇。

为什么短信单独处理

FreePBX 擅长处理语音呼叫,但短信不是它的强项。很多语音网关虽然支持 SMS over SIP、SMPP、SMTP 或 HTTP API,但 FreePBX 默认并不适合直接接管短信。

更稳的方式是:

语音网关短信接口
Python 桥接程序
Telegram Bot

这样电话链路和短信链路彼此独立。电话坏了不一定影响短信,短信脚本升级也不会动到 PBX。

创建 Bot

在 Telegram 搜索:

@BotFather

创建流程:

  1. 发送 /newbot
  2. 输入机器人显示名称,例如 Home VoIP SMS
  3. 输入唯一用户名,必须以 bot 结尾,例如 home_voip_sms_bot
  4. BotFather 返回 API Token。

Token 形态类似:

1234567890:AAExampleTokenDoNotExpose

保存好这个 Token。它相当于机器人密码,不要写进公开仓库,也不要截图发到公开群里。

获取 chat_id

Bot 需要知道把短信发给谁。最简单的办法:

  1. 先给你的 Bot 发一条消息,例如 hello
  2. 在服务器上请求 Telegram API:
curl "https://api.telegram.org/bot<TOKEN>/getUpdates"

返回 JSON 里找到:

"chat": {
  "id": 123456789,
  "type": "private"
}

这个 id 就是私聊 chat_id。如果要发到群组,需要先把 Bot 拉进群里,再在群里发一条消息,然后同样用 getUpdates 找群组 ID。

权限设计

短信 Bot 至少要做两层限制:

  1. 只允许固定 chat_id 收短信。
  2. 只允许固定 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

测试顺序

不要一上来就写完整服务。建议按顺序测试:

  1. Bot 能否给自己发消息。
  2. Python 脚本顶部配置是否都已改成自己的值。
  3. Python 能否调用 Telegram sendMessage
  4. Python 能否连接并绑定 SMPP 服务。
  5. 网关收到短信时,Python 能否拿到短信内容。
  6. Telegram 收到格式化短信通知。
  7. 目标号码 短信内容 能否触发网关发短信。

每一步都留日志,后面放进 systemd 才好排错。

下一步

下一篇把 Python 虚拟环境、依赖安装、脚本运行方式和 systemd 自启动整理成一个长期可维护的服务。