Telegram 机器人创建全指南:从 BotFather 到线上部署

如果你准备在 Telegram 上构建一个自动回复、定时推送或数据查询的机器人,第一步就是通过官方提供的 BotFather 完成注册和基础配置。本文以 如何通过 BotFather 创建机器人 为主线,贯穿从申请 Token、设置命令到选择通信方式(Webhook vs Polling)的完整决策链,帮助你在不同场景下做出合理取舍。

Telegram 机器人创建全指南:从 BotFather 到线上部署
Telegram 机器人创建全指南:从 BotFather 到线上部署

1. 功能定位与变更脉络

BotFather 是 Telegram 官方维护的机器人管理工具,所有第三方机器人必须通过它创建并获取唯一 API Token。它解决了「如何安全地注册并标识一个机器人」的核心问题,同时还提供了修改名称、描述、头像、命令列表等配置能力。截至当前的最新版本,BotFather 的功能保持稳定,未出现重大设计变更,因此本文的步骤在可预见的未来依然有效。

需要注意的是,BotFather 并不涉及机器人的业务逻辑实现(如消息处理、数据库交互),它仅负责身份注册与元数据管理。你的机器人代码需要部署在服务器上,通过 Bot API 与 Telegram 通信。

2. 创建机器人的完整操作路径

2.1 准备工作

你需要一个活跃的 Telegram 账号(手机号注册即可),并能正常访问 Telegram 服务器。BotFather 本身是一个机器人,在聊天界面搜索 @BotFather 并点击 Start 即可开始对话。

平台差异:Android、iOS 和桌面版(Telegram Desktop/Portable)的操作完全一致,都是通过 BotFather 的聊天窗口发送命令。唯一区别在于桌面版更容易复制生成的 Token(可直接选中文本),而移动端可能需要手动记录。建议优先使用桌面端完成创建,减少出错可能。

2.2 使用 /newbot 创建新机器人

在 BotFather 对话框中发送 /newbot,BotFather 会依次询问:

  • 机器人的显示名称(例如:「天气小助手」):用于用户看到的名称,可随时修改。
  • 机器人的用户名(例如:WeatherHelperBot):必须以 bot 结尾,且全局唯一。创建后不可更改。

完成上述两步后,BotFather 会返回一条消息,包含机器人的访问链接(如 t.me/WeatherHelperBot)以及关键的 API Token(格式类似于 1234567890:ABCdefGHIJklmNOPqrstUVwxyz)。请立即复制并保存在安全的地方。Token 是机器人的唯一凭证,泄露后任何人都可以控制你的机器人。

⚠️ 警告: Token 一旦丢失,你将无法从 BotFather 重新查询。唯一补救方法是使用 /revoke 命令撤销旧 Token 并生成新 Token,但此操作会使旧 Token 立即失效,所有已部署的代码需要更新 Token。

2.3 设置机器人基础信息

创建后,你仍可通过 BotFather 调整多项内容:

  • /setname – 修改显示名称(不影响用户名)。
  • /setdescription – 修改机器人简介(出现在开始对话时)。
  • /setabouttext – 修改关于信息(出现在机器人资料页)。
  • /setuserpic – 上传头像(支持最大 512KB 的 PNG/JPG)。
  • /setcommands – 设置命令清单(见下文)。

这些操作可以直接在 BotFather 对话框中顺序执行,每次修改后 BotFather 会返回成功消息。建议在编写代码前完成基础信息配置,避免后续反复。

3. 命令设置:让机器人更易用

命令(Commands)是用户与机器人交互的主要入口。通过 /setcommands,你可以定义一组以斜杠开头的快捷指令(例如 /start、/help、/weather)。当用户在聊天输入框输入 / 时,Telegram 客户端会自动弹出命令菜单。

命令列表的格式为一行一个:commandname - 简短描述。例如:

start - 启动机器人
help - 获取帮助
weather - 查询天气

设置后,所有用户都能看到这些命令。注意命令名只能包含小写英文字母、数字和下划线,且不能超过 32 个字符。描述建议控制在 30 字以内,否则会被截断。

经验性观察:合理设置命令可以显著降低用户的困惑,提升留存。例如,一个简单的 /start 回复,可以立即告知机器人能做什么,减少用户因不知道如何操作而离开。

4. 通信方式:Webhook 与 Polling 的取舍

4.1 问题背景

机器人创建完成后,需要接收用户消息并作出响应。Bot API 提供两种消息获取模式:Webhook(推送)和 Polling(轮询)。选择哪种模式取决于你的部署环境、响应速度要求和成本控制。

4.2 Webhook(推送模式)

你提供一个 HTTPS 公网地址(必须带 SSL/TLS 证书),Telegram 服务器在有新消息时主动向该地址发送 POST 请求。优点是实时性高(毫秒级)、无需不断请求服务器、节省流量和 API 配额。

适用场景:生产环境、对响应速度要求高、有固定公网 IP 或域名、能管理 SSL 证书。例如一个电商订单通知机器人,需要秒级推送。

配置命令:

curl -F "url=https://yourdomain.com/webhook" https://api.telegram.org/bot<YOUR_TOKEN>/setWebhook

注:确保你的 Webhook 端点返回 200 OK(通常返回空字符串即可),并且 SSL 证书为受信任机构签发(自签名证书不被允许)。Telegram 要求 Webhook 地址必须为 HTTPS,且端口为 443、80、88、8443 之一。

4.3 Polling(轮询模式)

你的代码主动调用 getUpdates API(例如每隔几秒请求一次),拉取未处理的消息。优点是无需公网地址、内网即可开发调试、SSL 非必须。

适用场景:开发阶段、个人小项目、无法暴露公网 IP(如公司内网环境)。缺点是有延迟(轮询间隔决定),且需要自己处理重复消息(通过 offset 参数)。

配置方法:在代码中调用 https://api.telegram.org/bot<TOKEN>/getUpdates?offset=0。很多编程语言的 SDK 已经封装了长轮询(Long Polling),可以设置 timeout 参数(如 60 秒),减少空请求。

4.4 如何选择?

维度 Webhook Polling
响应延迟 实时 受轮询间隔影响(一般 1-5s)
服务器要求 需公网 HTTPS + 证书 仅需出网能力(内网也可)
成本 需域名/SSL 开销 仅需服务器流量
调试复杂度 中等(需本地端口暴露) 低(直接调用 API)

经验性结论:对于绝大多数个人项目,推荐从 Polling 开始开发,上线后根据需求切换到 Webhook。如果你使用的是 Serverless 平台(如 AWS Lambda、Cloudflare Workers),Webhook 是唯一可行的方案,因为这些平台无法执行持久化的轮询循环。

5. 高级配置:内联模式与隐私设置

5.1 内联模式(Inline Mode)

内联模式允许用户在任何聊天中输入 @你的机器人用户名 + 关键词,从而实时调用机器人提供搜索结果。例如 @WeatherHelperBot 北京 会显示北京天气卡片。启用方法:在 BotFather 中使用 /setinline 并输入占位符(如 请输入城市名)。

内联模式适合工具类机器人(翻译、查询、表情包),能大幅提升使用频率。但注意,你必须实现对应的 inlineQuery 处理逻辑,在数千毫秒内返回结果,否则用户看不到响应。

5.1 内联模式(Inline Mode)
5.1 内联模式(Inline Mode)

5.2 隐私模式(Privacy Mode)

默认情况下,机器人无法接收群组中用户发送的所有消息,除非被设置为管理员或使用 /setprivacy 关闭隐私模式。在 BotFather 中使用 /setprivacy 可切换。关闭后,机器人将能阅读群组中 所有 消息,但需要约束好权限,避免数据泄露。

💡 建议: 除非机器人必须对每条群消息做响应(如自动翻译机器人),否则请保持隐私模式开启,仅通过命令触发,减少不必要的流量和隐私风险。

6. 故障排查:常见问题与解决方法

现象 可能原因 验证步骤 解决方法
bot 无法收到消息 未正确设置 Webhook 或 Polling 访问 /getWebhookInfo 查看状态 重新设置 Webhook 或改用 Polling
Webhook 返回 400 错误 SSL 证书无效或端口不对 使用浏览器访问 webhook 地址看证书 更换受信任证书(Let's Encrypt 免费)
Polling 收到重复消息 未正确使用 offset 参数 检查每次请求是否传入了上次最后 update_id+1 实现 offset 递增逻辑
命令菜单没更新 客户端缓存 退出并重新进入聊天窗口 稍等几分钟或重启客户端

如果 Token 泄露,立即在 BotFather 中使用 /revoke 撤销并重新获取。此操作会让旧 Token 永久失效。

7. 适用与不适用场景清单

✅ 适合用 BotFather 创建机器人的场景

  • 你需要在 Telegram 上实现自动回复、消息推送、数据查询等能力。
  • 你希望在群组或频道中集成第三方服务(如 CI/CD 通知、日志监控)。
  • 你计划开发个人或小团队使用的效率工具(如待办列表、密码管理)。
  • 你需要测试 Bot API 或学习异步编程。

❌ 不适合的场景

  • 需要一个即开即用的聊天机器人(BotFather 只提供注册,不提供 AI 能力)。
  • 需要与 Telegram 服务器双向高频实时通信(WebRTC 等原生功能不通过 Bot API)。
  • 你的应用只需要单向接收推送(应使用 Telegram Channel 而非机器人)。
  • 需要访问用户手机号或消息历史(API 未提供,无法获取)。

8. 最佳实践清单

  1. 安全第一: Token 不要硬编码在公共代码仓库,使用环境变量或密钥管理服务。
  2. 命令设计: 每个命令对应一个明确功能,避免模糊描述(如“帮助”比“其他”好)。
  3. 错误处理: 当调用 Bot API 失败时(如网络错误、频率限制),实现重试与退避机制。
  4. 日志记录: 记录所有收到的消息和发送的响应,便于调试和审计。
  5. 频率限制: 遵守 Telegram Bot API 的速率限制(约 30 条消息/秒/chat),避免被暂时封禁。
  6. 迁移规划: 如果从 Polling 切换到 Webhook,确保先删除 Webhook 再使用 Polling(调用 /deleteWebhook)。
  7. 内联模式测试: 在内联机器人正式上线前,先在测试群中验证响应速度和结果正确性。

FAQ

创建机器人后 Token 丢了怎么办?

在 BotFather 中使用 /revoke 命令,它会生成一个新的 Token 并撤销旧的。旧 Token 将立即失效,你需要更新所有使用旧 Token 的代码。

机器人用户名能否修改?

不能。机器人的用户名(@xxxBot)在创建后永久固定。显示名称则可以通过 /setname 随时修改。

Webhook 与 Polling 可以同时启用吗?

不能。Bot API 只允许一种模式生效。如果设置了 Webhook,getUpdates 会返回冲突错误。切换前需要先删除旧的 Webhook。

如何让机器人支持群组中的 @提及?

通过 BotFather 启用 /setinline 并填写占位符,然后在代码中处理 inline_query 更新。用户可以输入 @你的机器人用户名+关键词 在任何聊天中调用。

机器人的命令描述支持中文吗?

支持。命令名只能使用英文字符,但描述可以包含中文。建议描述简洁明了,避免过长导致显示不全。

9. 总结与下一步

创建 Telegram 机器人的核心流程简单且稳定:通过 BotFather 注册并拿到 Token,然后根据部署环境选择 Webhook 或 Polling。本文不仅给出了操作步骤,还分析了两种通信方式的取舍逻辑,帮助你做出符合自身场景的决策。

下一步建议你根据选择的语言(Python、Node.js、PHP 等)搭建一个最简单的 /start 回复,验证 Token 和 Webhook 是否正常工作。官方文档提供了各语言 SDK 的推荐列表(在 Bot API 页面 底部)。从 Hello World 开始,逐步添加功能,一个实用的机器人就诞生了。

如果你在创建过程中遇到未覆盖的问题,可以在 Telegram 的 Bot Support 群组(@BotSupport)中提问。祝你开发顺利。