Telegram Bot 开发必知:Token、Chat ID、群组 ID 获取完整指南

写 Telegram Bot 的第一步就是拿到 Bot Token 和 Chat ID。本文从零开始讲解如何通过 @BotFather 获取 Token,用 @userinfobot 和 Telegram Bot API 获取个人 Chat ID、群组 Chat ID、频道 Chat ID,以及常见踩坑点。

刚接触 Telegram Bot 开发时,有个问题几乎每个人都会遇到——我需要一个 Chat ID,但翻遍 API 文档也找不到哪里直接给你。Token 倒是很好拿,BotFather 注册完就给了。但 Chat ID 呢?你要自己去捞。

这篇文章把整套流程串起来:Token 怎么拿、个人 / 群组 / 频道的 Chat ID 分别怎么获取、哪些参数容易搞混、有哪些安全上的坑。适合刚起步的 Bot 开发者,也适合写过几个 Bot 但每次拿 ID 都要重新翻一遍文档的人。

第一步:从 BotFather 拿到 Token

这是最简单的步骤。在 Telegram 里找到 @BotFather,发送 /newbot。按提示填 Bot 名称和用户名(用户名必须以 bot 结尾),BotFather 就会返回一条消息,里面包含你的 Bot Token:

1234567890:ABCdefGHIjklmNOPqrstUVwxyz-1234567

Token 是由数字和字母组成的字符串,冒号分隔了两部分。务必第一时间把 Token 存到安全的地方,因为一旦泄露,任何人都可以用它控制你的 Bot。

如果忘记了 Token,只需要找 BotFather 重新发一次 /mybots,选择你的 Bot → API Token,就能看到。

Chat ID 到底是什么

很多人搞混这个概念。在 Telegram Bot API 里,Chat 不是特指群聊,它是 Telegram 里所有会话的统称:

  • 一对一私聊(Private Chat)
  • 群组(Group / Supergroup)
  • 频道(Channel)

每种 Chat 都有一个唯一数字 ID。Bot 要发消息,就必须知道目标 Chat 的 ID。难点在于:Telegram 不会在界面上显示这个 ID,你要通过其他途径获取。

获取个人 Chat ID(最快捷的方式)

最简单的办法是用现成的 Bot:

方案一:@userinfobot

打开 Telegram,搜索 @userinfobot,给它随便发一条消息。它会回复你的 ID、First Name、Last Name 和 Username:

Id: 123456789
First: Zhang
Last: San
Username: zhangsan
Language: zh-cn

这个 ID 就是你的个人 Chat ID,也就是 Bot 给你发私信要用到的目标 ID。

方案二:@get_id_bot

同样,给 @get_id_bot 发任意消息,它会返回你当前聊天的详细 ID 信息,频道、群组都适用。

方案三:用自己的 Bot 获取

如果你已经写好了 Bot 代码,可以用 getUpdates 方法。先用任意 Telegram 账号给 Bot 发一条消息(私聊),然后请求:

https://api.telegram.org/bot<TOKEN>/getUpdates

返回的 JSON 里边,message.chat.id 就是发消息那个用户的 Chat ID:

{
  "ok": true,
  "result": [
    {
      "update_id": 123456789,
      "message": {
        "message_id": 1,
        "from": {...},
        "chat": {
          "id": 123456789,
          "first_name": "Zhang",
          "type": "private"
        },
        "text": "Hello"
      }
    }
  ]
}

获取群组 Chat ID

场景变了。你不是要给自己发私信,而是要让 Bot 在群组里说话。这时候需要群组的 Chat ID。

步骤

  1. 把 Bot 拉进群组(在群组设置里添加成员或者通过 Bot 的 t.me 链接拉入)
  2. 在群组里随便发一条消息(@Bot 或者直接发文字)
  3. 请求 getUpdates 接口

返回的消息中,chat.id 就是一个负数,比如 -1001234567890。群组 Chat ID 比个人 ID 多了负号和 -100 前缀,这是 Telegram 内部的标识规则。Supergroup 的 ID 统一以 -100 开头。

注意:如果 Bot 在屏蔽了隐私模式的群组里,它可能收不到非命令以外的消息。这时可以新建一个群组,或者确保群组设置为 Public,然后从群组信息页获取 Chat ID(部分客户端会显示)。

通过转发消息获取

还有一种取巧的方法:在群组里发一条消息,然后转发到 @userinfobot@get_id_bot。这两个 Bot 能识别转发消息的原始来源,返回原始群组的 ID。

获取频道 Chat ID

频道的 Chat ID 获取方式跟群组类似,但有一些额外条件:

  • Bot 必须是频道的管理员
  • Bot 要有发送消息的权限
  • 频道必须是公开的,或者你已在频道中发布了消息

把 Bot 设为频道管理员后,在频道里发一条消息,请求 getUpdates,就能拿到 chat.id。频道的 Chat ID 也以 -100 开头,和 Supergroup 看起来一样。

如果你的频道是私密的,也可以发一条消息然后转发到 @get_id_bot 来识别来源频道 ID。

搞清楚不同类型的 ID

Telegram 里有好几种 ID,初学者容易搞混:

  • User ID:用户的唯一标识,任何时候都不会变。上面说的个人 Chat ID 实际上就是 User ID。
  • Chat ID:会话的 ID。私聊时等于 User ID;群聊和频道时是一个独立数字。
  • Group ID:群组的 Chat ID,通常是负数,Supergroup 以 -100 开头。
  • Channel ID:频道的 Chat ID,同样以 -100 开头。

简单记:个人私信时 Chat ID = User ID,都是正整数。群组和频道 Chat ID 都是负整数。

程序化获取:getUpdates 深入用法

生产环境里,不可能每次都手动请求接口。一般是在 Bot 启动时(或定期)调用 getUpdates

curl https://api.telegram.org/bot<TOKEN>/getUpdates?offset=0&timeout=10

参数说明:

  • offset:指定从哪个 update_id 开始拉。没用过的建议从 0 开始,然后每处理一次把 update_id + 1 存入本地,下次用这个值。
  • limit:一次最多拉多少条更新,默认 100,不建议改。
  • timeout:长轮询参数。设为 10~30 秒可以减少空轮询,也比即时响应更适合 Bot 场景。

需要注意:getUpdates 拿到的消息是累积的。如果不传 offset,每次都会返回从 Bot 上线开始的所有历史消息。一定要用 offset 标记已处理位置,否则你会反复收到同一条消息。

pyTelegramBotAPI 和 python-telegram-bot 这类库会自动管理 offset,但底层逻辑是一样的。

通过 Webhook 获取 Chat ID

生产环境更推荐用 Webhook 代替 getUpdates。Telegram 会直接向你的服务器推送更新,不需要轮询:

curl -X POST https://api.telegram.org/bot<TOKEN>/setWebhook \n  -d "url=https://your-server.com/webhook"

Webhook 推送的 JSON 结构跟 getUpdates 的结果完全一样,message.chat.id 就是你要的 Chat ID。Webhook 的好处是实时推送、不需要轮询、节省服务器资源。

设置 Webhook 后,getUpdates 会返回 {"ok":true,"result":[]},因为消息已经通过 Webhook 推走了。两个不能同时用。

如果 Webhook 出了问题,可以用 deleteWebhook 清掉,然后重新用 getUpdates:

curl -X POST https://api.telegram.org/bot<TOKEN>/deleteWebhook

Token 安全:最容易翻车的地方

这是整个环节里最容易被忽略的一环。说几个真实案例:

  • 把 Token 写死在 GitHub 公开仓库的代码里,几分钟就被爬虫扫到,Bot 被拿去发垃圾消息。
  • 在客户端脚本里硬编码 Token,抓包工具直接能看到。
  • 日志里打印 Token,运维查日志时暴露。

正确的做法:

  • 环境变量存 Token,BOT_TOKEN=xxx,代码里 os.getenv('BOT_TOKEN') 读取。
  • 如果必须存文件,配置文件不要进 Git,加 .gitignore
  • 考虑用 Secrets Manager(Vault、AWS Secrets Manager 等)管理生产环境的 Token。
  • 设置 Rate Limit白名单——如果 Bot 只处理特定来源的消息,可以在收到消息时校验来源 User ID。

万一 Token 泄露了,立刻去 BotFather 用 /revoke 重置 Token,旧 Token 立即失效。

常见的坑

隐私模式(Privacy Mode)

默认情况下,Bot 在群组里处于隐私模式,只能收到以下消息:

  • / 开头的命令(比如 /start
  • @Bot 提及的消息
  • 回复 Bot 的消息

这意味着普通群聊消息 Bot 是收不到的。如果需要接收群组里的所有消息,找 @BotFather/mybots → 你的 Bot → Bot Settings → Group Privacy → Disable。或者直接在群组里把 Bot 设为管理员,隐私模式也会自动失效。

offset 不更新导致重复消息

如果不管理 offset,getUpdates 每次都会返回从上次确认位置开始的所有未确认消息。正确做法是每次处理后将 update_id + 1 传入下一个请求。

Bot 不是管理员收不到频道消息

频道里,Bot 必须被设为管理员才能收到消息更新和发送消息。这是一个容易被忽略的权限问题。

ID 不会变,但格式要注意

个人的 Chat ID 就是 User ID,只要 Telegram 账号不被删除就不会变。群组的 ID 同理。但如果删除并重建群组,会得到一个全新的 ID。

总结

获取 Telegram Bot 的 Token 和 Chat ID 不是复杂的事情,但信息比较分散,新手容易走弯路。核心就几步:

  1. Token:@BotFather 创建 Bot,存好别泄露
  2. 个人 Chat ID:@userinfobot 或 getUpdates
  3. 群组 / 频道 Chat ID:把 Bot 拉进去,发消息后用 getUpdates
  4. ID 格式:正整数是个人,负整数是群组 / 频道,Supergroup 以 -100 开头
  5. 生产环境:用 Webhook + 环境变量,少用轮询,别硬编码 Token

把这些搞清楚了,写 Bot 的逻辑才能安心。毕竟连消息发给谁都不知道,功能写得再好也跑不通。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注