Telegram Bot API
🌐 中文

Telegram chat id 获取教程:查看用户、群组、频道和话题的聊天 ID

· 8 分钟阅读

Telegram chat id 获取最可靠的方法是:先让目标聊天给机器人发一条消息,然后调用 getUpdates,在返回结果中查看 message.chat.id。聊天 ID(chat_id)是 Telegram(电报)Bot API 用来标识私聊、群组和频道的数字,发送消息、配置通知、接入 n8n 或 AI 助手时都会用到。下面按聊天类型逐一说明获取方法,并整理了 result 为空、409 Conflict 等常见问题的排查办法。

chat_id 是什么:各类聊天的 ID 格式

聊天类型chat.typeID 示例说明
私聊(用户)private123456789正数,等于该用户的 ID
普通群组group-123456789负数
超级群组supergroup-1001234567890以 -100 开头
频道channel-1001234567890以 -100 开头;公开频道也可以用 @channelusername

负号和 -100 前缀都是 ID 的一部分,漏掉就会收到 400 Bad Request: chat not found。另外,chat_id 可能超出 32 位整数的范围(官方说明最多有 52 个有效二进制位),在数据库和代码中请使用 64 位整数(如 BIGINT)保存,不要用 32 位的 int。

方法一:私聊机器人,用 getUpdates 获取 chat id

适用于获取你自己(或任何用户)与机器人私聊的 chat_id:

  1. 在 Telegram 中打开你的机器人,点击 Start,或者随便发一句话。
  2. 在浏览器地址栏中打开下面的地址(换成你自己的 Token),或者直接用 Bot API Tester 调用 getUpdates。
  3. 在返回的 JSON 中找到 message.chat.id。
https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/getUpdates
{
  "ok": true,
  "result": [
    {
      "update_id": 870000002,
      "message": {
        "message_id": 5,
        "from": {"id": 123456789, "is_bot": false, "first_name": "Alex", "username": "alex_dev"},
        "chat": {"id": 123456789, "first_name": "Alex", "username": "alex_dev", "type": "private"},
        "date": 1793266200,
        "text": "hello"
      }
    }
  ]
}

在私聊中,chat.id 与发送者的 from.id 相同。如果机器人加入了多个聊天,可以用一小段 Python 把所有 chat_id 整理出来:

import requests

TOKEN = "123456789:AAEexampleTokenReplaceWithYours"
data = requests.get(f"https://api.telegram.org/bot{TOKEN}/getUpdates", timeout=10).json()

if not data["ok"]:
    print(data["error_code"], data["description"])  # 409 表示设置了 Webhook
for update in data.get("result", []):
    for key in ("message", "edited_message", "channel_post", "my_chat_member"):
        if key in update:
            chat = update[key]["chat"]
            name = chat.get("title") or chat.get("first_name")
            print(key, chat["type"], chat["id"], name)

不写代码,在浏览器中查看 chat id

如果只是想快速查看一次 chat id,用浏览器就够了:

  1. 打开 Bot API Tester,粘贴机器人 Token(只保存在你浏览器的 localStorage 中)。
  2. 启动 getUpdates 长轮询,然后在 Telegram 中给机器人发消息,或者在群里发送 /start@your_bot。
  3. 新的更新会实时出现在更新历史中(最多保留最近 100 条),展开 JSON 找到 chat.id 即可。

这种方式的好处是可以同时观察私聊、群组和频道的更新,适合一次性查清多个聊天的 ID。工具界面为英文,但操作只有上面几步。

获取 Telegram 群组和超级群组的 chat id

  1. 把机器人添加到群组。
  2. 在群里发送 /start@your_bot(把 your_bot 换成你的机器人用户名)。
  3. 调用 getUpdates,读取这条消息的 message.chat.id:普通群组是负数,超级群组以 -100 开头。

为什么要发带 @用户名 的命令?因为机器人默认开启隐私模式:在群组中只能收到明确发给它的命令(如 /start@your_bot)、对它消息的回复、通过它发送的消息以及各类服务消息,普通聊天内容是收不到的。另外,把机器人拉进群这个动作本身就会产生一条 my_chat_member 更新和一条带 new_chat_members 的服务消息,它们同样包含 chat.id。

如果机器人需要读取群里的所有消息,可以在 @BotFather 中用 /setprivacy 关闭隐私模式(修改后要把机器人移出群组再重新加入才会生效),或者把机器人设为群管理员。

还要注意:普通群组升级为超级群组后,chat_id 会改变。用旧 ID 调用方法时,错误响应的 parameters.migrate_to_chat_id 会给出新的 ID,记得同步更新你保存的配置。

获取频道的 chat id

公开频道可以直接用 @channelusername 作为 chat_id,不需要数字 ID。如果确实需要数字 ID,调用 getChat 并传入 chat_id=@channelusername,返回结果中的 id 就是,可以在 Bot API Tester 的 getChat 中试一试。

私有频道没有用户名,需要这样获取:

  1. 把机器人添加为频道管理员(机器人只能以管理员身份加入频道)。
  2. 在频道里发布一条消息。
  3. 调用 getUpdates。频道消息以 channel_post 的形式出现,读取 channel_post.chat.id 即可,形如 -1001234567890。

还有一个不用发帖的办法:把频道里的任意一条消息转发给机器人,然后在私聊的更新中查看 message.forward_origin.chat.id。转发来源是频道时,这里就是频道的 ID。如果频道开启了禁止转发,这个方法就无法使用。

论坛话题(Topic):message_thread_id

开启了话题功能的超级群组(论坛)中,每个话题并没有独立的 chat_id,而是用 message_thread_id 区分。话题里的消息在更新中会带有 message_thread_id 和 "is_topic_message": true:

{
  "message_id": 120,
  "message_thread_id": 42,
  "is_topic_message": true,
  "chat": {"id": -1001234567890, "title": "开发者社区", "type": "supergroup", "is_forum": true},
  "text": "/start@your_bot"
}

向这个话题发消息时,chat_id 填超级群组的 ID,再加上 message_thread_id:

curl -X POST "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/sendMessage" \
  -H "Content-Type: application/json" \
  -d '{"chat_id": -1001234567890, "message_thread_id": 42, "text": "这条消息发到指定话题"}'

如果机器人在私聊中开启了话题模式,私聊消息同样可能带有 message_thread_id,用法相同。

getUpdates 结果为空或报错怎么办

现象原因解决方法
"result": []没有新的更新:还没给机器人发消息,或者群里的消息被隐私模式过滤了私聊发送任意消息;群里发送 /start@your_bot,然后重新调用
之前有消息,现在 result 为空更新超过 24 小时被删除;或同一 Token 的另一个程序已经用 offset 确认了这些更新重新发一条消息;暂停其他正在轮询的程序
409 Conflict(Webhook 已设置)机器人设置了 Webhook,与 getUpdates 不能同时使用调用 deleteWebhook,测试完再用 setWebhook 恢复
409 Conflict(多个实例)有另一个程序在用同一个 Token 轮询只保留一个正在运行的实例
401 UnauthorizedToken 错误或已被撤销检查 Token,参考 Bot Token 获取与验证教程

两种 409 的 description 分别是 Conflict: can't use getUpdates method while webhook is active; use deleteWebhook to delete the webhook first 和 Conflict: terminated by other getUpdates request; make sure that only one bot instance is running。在 Bot API Tester 中启动长轮询时,工具会先自动调用 deleteWebhook(保留积压的更新);如果你的正式机器人依赖 Webhook,测试完成后记得按 Webhook 设置教程重新设置。

另外,getUpdates 只返回尚未确认的更新:一旦用大于某个 update_id 的 offset 调用过,之前的更新就不会再出现。

拿到 chat_id 之后:通知、n8n 与 AI 助手

chat_id 最常见的用途,是让程序把消息发到固定的地方:

发送到群组时填负数 ID,发送到公开频道可以直接填 @channelusername。消息格式、按钮和常见错误见 Telegram Bot API 发送消息教程。

常见问题

Telegram 群组的 chat id 为什么是负数?

这是 Bot API 的约定:用户 ID 为正数,普通群组为负数,超级群组和频道形如 -1001234567890。负号和 -100 都是 ID 的一部分,调用时必须完整填写。

getUpdates 返回的 result 是空的怎么办?

说明当前没有未确认的更新:先给机器人发一条消息再调用;更新最多保存 24 小时;如果同一个 Token 还有别的程序在轮询,更新可能已经被它取走。如果返回的是 409 Conflict,则说明设置了 Webhook,需要先调用 deleteWebhook。

公开频道一定要用数字 chat id 吗?

不一定。公开频道可以直接把 @channelusername 作为 chat_id;私有频道没有用户名,只能使用 -100 开头的数字 ID。无论哪种,机器人都必须是频道管理员才能发帖。

能通过用户名查到某个用户的 chat id 吗?

不能。getChat 只接受超级群组和频道的 @username。用户的 ID 只能在对方给机器人发过消息(或在群里与机器人互动)之后,从更新中的 message.from.id 读取。

群组升级为超级群组后 chat id 变了怎么办?

用旧 ID 调用方法时,错误响应的 parameters.migrate_to_chat_id 中会给出新的超级群组 ID(以 -100 开头),把保存的 ID 替换成它即可。

论坛话题(Topic)的 ID 在哪里看?

话题中的消息带有 message_thread_id 字段。向该话题发消息时,chat_id 填超级群组的 ID,再加上 message_thread_id。

Telegram 机器人教程:从零创建 Telegram 机器人并发送第一条消息

Telegram 机器人教程:在 @BotFather 中用 /newbot 创建机器人并获取 Token,用 getMe 验证,再通过 getUpdates 找到 chat_id,用 curl 和 Python 发出第一条消息,附常见问题排查。

Telegram Bot API 发送消息教程:sendMessage 参数、格式、按钮与错误处理

Telegram Bot API 发送消息中文教程:sendMessage 参数说明,curl、Python、JavaScript 示例,HTML 与 MarkdownV2 格式、内联按钮、群组和频道发送,以及 400、403、429 错误处理。

Telegram Bot Token 怎么获取:获取、查看、验证和撤销机器人 Token

Telegram Bot Token 怎么获取?用 @BotFather 的 /newbot 获取新 Token,在 /mybots 中查看已有 Token,用 getMe 检查是否有效,泄露后及时撤销,并配合 chat_id 接入 n8n 等工具。

Telegram Bot Webhook 设置教程:用 setWebhook 配置 Webhook URL 和 secret_token

Telegram Bot API setWebhook 中文教程:Webhook URL 的 HTTPS 与端口要求、secret_token 请求头校验、用 getWebhookInfo 排错、用 deleteWebhook 切回轮询,以及 409 等常见错误的解决方法。