刚接触 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。
步骤
- 把 Bot 拉进群组(在群组设置里添加成员或者通过 Bot 的 t.me 链接拉入)
- 在群组里随便发一条消息(@Bot 或者直接发文字)
- 请求
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 不是复杂的事情,但信息比较分散,新手容易走弯路。核心就几步:
- Token:@BotFather 创建 Bot,存好别泄露
- 个人 Chat ID:@userinfobot 或 getUpdates
- 群组 / 频道 Chat ID:把 Bot 拉进去,发消息后用 getUpdates
- ID 格式:正整数是个人,负整数是群组 / 频道,Supergroup 以 -100 开头
- 生产环境:用 Webhook + 环境变量,少用轮询,别硬编码 Token
把这些搞清楚了,写 Bot 的逻辑才能安心。毕竟连消息发给谁都不知道,功能写得再好也跑不通。