【问题标题】:Telegram Bot - how to get a group chat id?Telegram Bot - 如何获取群聊 ID?
【发布时间】:2015-12-02 03:12:57
【问题描述】:

我一直在使用telegram_bot,并尝试获取 groupChat id 以向群聊发送通知,但不知道我必须使用哪些方法。

当机器人参与聊天时,我使用 message.chat.id 获取聊天 id,但我必须使用它来获取群聊 id 无法找到/

【问题讨论】:

  • 我为此管理了一个机器人。我希望这会有所帮助,检查一下 stackoverflow.com/a/37396871/6223024>

标签: telegram telegram-bot


【解决方案1】:

要获取群聊ID,请执行以下操作:

  1. 将 Telegram BOT 添加到群组。

  2. 获取您的 BOT 的更新列表:

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

    例如:

     https://api.telegram.org/bot123456789:jbd78sadvbdy63d37gda37bd8/getUpdates
    
  3. 寻找“聊天”对象:

{"update_id":8393,"message":{"message_id":3,"from":{"id":7474,"first_name":"AAA"},"chat":{"id": ,"title":""},"date":25497,"new_chat_participant":{"id":71,"first_name":"NAME","username":"YOUR_BOT_NAME"}}}

这是您将 BOT 添加到组时的响应示例。

  1. 使用“聊天”对象的“id”发送消息。

  2. (如果您使用机器人创建了新组并且您只获得了{"ok":true,"result":[]},请删除该机器人并将其再次添加到组中)

  3. 私人图表仅适用于图片argoprojlabs/argocd-notifications:v1.1.0或以上。

【讨论】:

  • @WannaBeCoder,您可以像任何其他成员一样将 BOT 添加到组:转到您的组属性,单击添加成员,然后使用搜索图标查找 BOT 的名称。但是,请记住,由于 Telegram 群组最近发生了变化,您必须是群组“管理员”才能添加新成员,无论他们是否是 BOT。
  • 对于新创建的群组getUpdates,请求返回{"ok":true,"result":[]},即使我尝试通过@ 和一些随机“命令”/my_id、@ 向群组发送一堆消息并提及机器人987654329@,/help。有什么想法该怎么做? - 更新:好的,从组中删除机器人,然后重新添加机器人修复了这个问题(它还在组中打印了聊天 id)---看起来在组创建过程中无法添加机器人。
  • 返回:{"ok":true,"result":[]}
  • 嗨@Tom。您是否已经尝试过 rutsky 解决方案:“从组中删除机器人,然后重新添加机器人修复了这个问题(它还在组中打印了聊天 id)——看起来在组创建期间无法添加机器人。”?我遇到过同样的问题几次,从组中删除机器人并重新添加它总是可以解决问题。如果这对您没有帮助,请告诉我。
  • @tom,如果你得到 {"ok":true,"result":[]} ,请在机器人频道中输入一些内容。在此之后,你应该得到 chat_id
【解决方案2】:

经过几个小时的努力,这是对我有用的顺序:

假设机器人名称是 my_bot

1- 将机器人添加到组中。
转到组,单击组名称,单击添加成员,在搜索框中搜索您的机器人,如下所示:@my_bot,选择您的机器人并单击添加。

2- 向机器人发送虚拟消息。
您可以使用此示例:/my_id @my_bot
(我试了几条消息,不是所有的消息都能正常工作。上面的例子工作正常。也许消息应该以/开头)

3- 转到以下网址: https://api.telegram.org/botXXX:YYYY/getUpdates
用你的机器人令牌替换 XXX:YYYY

4- 寻找“聊天”:{“id”:-zzzzzzzzzz,
-zzzzzzzzzz 是您的聊天 ID(带有负号)。

5- 测试:您可以测试用 curl 向群组发送消息:

curl -X POST "https://api.telegram.org/botXXX:YYYY/sendMessage" -d "chat_id=-zzzzzzzzzz&text=my sample text"

如果您错过了第 2 步,您正在寻找的群组将不会有更新。此外,如果有多个组,您可以在响应中查找组名(“title”:“group_name”)。

希望这会有所帮助。

【讨论】:

  • 关于如何配置 BOT 的精彩分解。
  • 我无法让我的机器人在组中工作,我在浏览器中得到 {"ok":true,"result":[]}。希望有人能帮帮我
  • 这对我有用。一件事,如果你配置了 webhook,你必须禁用它。谢谢!
  • @TheMrkt 似乎,正如 apadana 所说,发送一条以 / 开头的消息,比如 /test something,让 getUpdates 很开心。
  • 我不知道为什么它对我不起作用。我用我的api.telegram.org/here 包含我的机器人令牌/getUpdates,它根本不起作用。它一直说 "{"ok":false,"error_code":404,"description":"Not Found"}"
【解决方案3】:

截至 2021 年 5 月,只需:

  • 邀请 @RawDataBot 加入您的群组。

加入后,它将输出一个 JSON 文件,您的 chat id 将位于 message.chat.id

"message": {
    "chat": {
        "id": -210987654,
        "title": ...,
        "type": "group",
        ...
    }
    ...
}

之后一定要把@RawDataBot踢出你的小组。

【讨论】:

  • @RawDataBot 应该在哪里输出这个?我将机器人添加到我的组中,但没有任何反应。更新:你需要在 Telegram 中设置一个用户名,否则什么都不会发生。
  • @Cherona:我刚刚重新验证了它。但似乎网络客户端发生了变化,因此邀请机器人比以前更难了。您可以这样做: 在搜索字段中搜索 RawDataBot。单击联系人以开始聊天会话。单击聊天标题以打开“联系信息”。单击“添加到组”并选择组。它将像以前一样立即输出信息。希望它对你有用。
  • 截至 2021 年 5 月运行良好。
  • 实际上是 @raw_data_bot 为我完成了这项工作。
【解决方案4】:

2018 年年中之后:
1:) 邀请@getidsbot@RawDataBot 加入您的群组,并从聊天ID 字段中获取您的群组ID。

Message
 ├ message_id: 338
 ├ from
 ┊  ├ id: *****
 ┊  ├ is_bot: false
 ┊  ├ first_name: 사이드
 ┊  ├ username: ******
 ┊  └ language_code: en
 ├ chat
 ┊  ├ id: -1001118554477    // This is Your Group id
 ┊  ├ title: Test Group
 ┊  └ type: supergroup
 ├ date: 1544948900
 └ text: A

2:) 使用非官方 Messenger,例如 Plus Messenger,并在群组/频道信息中查看您的群组 ID。

2018 年年中之前:(请勿使用)
1:转到 (https://web.telegram.org)
2:转到您的 Gorup 并找到您的 Gorup 链接(https://web.telegram.org/#/im?p=g154513121)
3:在 g 之后复制那个数字并在那个之前放一个 (-) -154513121
4:将您的信息发送给 Gorup bot.sendMessage(-154513121, "Hi")
我现在测试并像魅力一样工作

【讨论】:

  • 非常简单。谢谢!在 Grafana 警报通知中测试。到目前为止,一切顺利。
  • @Sedric Heidarizarei 如果这不是这样的数字怎么办 (web.telegram.org/#/im?p=@welcomeworld)
  • '@welcomeworld' 是您的频道用户名,您可以转发消息到 '@getidsbot' 并获取您的 id
  • 做了同样的事情,但遇到错误 OverflowError: Python int too large to convert to SQLite INTEGER ... client.send_message(-1240933195_1386556410045688xx08.'Hi')
  • 我更新了我的答案,这个方法已经不行了,暂时用After mid-2018这个方法。
【解决方案5】:

您可以通过这种方式获取聊天ID。

在与您的机器人进行私人聊天时,发送一条随机消息。稍后您将搜索此消息。

从 bot_father 获取您的 API 令牌:XXXXXXXXX:YYYYYYY-YYYYYYYYYYYYYYYYY_YY

然后,在您的浏览器上使用该 url 发出请求:

https://api.telegram.org/botXXXXXXXXX:YYYYYYY-YYYYYYYYYYYYYYYYY_YY/getUpdates

请求返回一个 json 响应,在 json 文本中搜索您的 random message 并获取该对象中的聊天 ID。

【讨论】:

    【解决方案6】:

    我发现的最简单的方法只使用电报网络

    • 在浏览器中打开web.telegram(我的情况是chrome)
    • 右键单击左侧菜单中的组名
    • 点击“检查”按钮
    • 您将在属性中看到组 ID data-peer-id="-xxxxxxxxxx" 或 peer="-xxxxxxxxxx"

    群聊ID:-xxxxxxxxxx

    频道聊天ID:-100xxxxxxxxxx

    (对于某些频道/组,您需要添加 -100 前缀

    编辑: 在某些情况下,当您点击群组名称时,ID 会显示在浏览器地址栏中

    https://web.telegram.org/z/#-xxxxxxxxxx

    【讨论】:

    • 但是他们开始捕捉右键单击,因此打开网络检查器并启动位于左上角的Choose an element 可能很有用
    • 这对我不起作用,HTML 不存储任何数据属性。
    • 是的,似乎有一些更新可以隐藏 html 属性,但是您仍然可以在 web-telegram 中获取 id,一旦您单击聊天名称,id 就会出现在浏览器的地址栏上(我的铬)web.telegram.org/z/#-xxxxxxxx
    • 这是新方法。我搜索了一个多小时,就是这样。太感谢了!另外:如果无法通过右键单击打开 Inspect Element,请使用 Ctrl+Shift+I 或 F12。
    • 用 -100 为 url 中的组添加前缀对我有用,谢谢!
    【解决方案7】:

    使用 python 和 telethon 很容易获得聊天 ID。这个解决方案最适合那些使用电报 API 的人。

    如果你没有 Telethon,运行这个:

    pip install telethon
    

    如果您没有注册过 Telegram 的应用,请注册一个: 链接是这样的:https://my.telegram.org/

    然后运行以下代码:

    from telethon import InteractiveTelegramClient
    from telethon.utils.tl_utils import get_display_name
    
    client = InteractiveTelegramClient('session_id', 'YOUR_PHONE_NUMBER', api_id=1234YOURAPI_ID, api_hash='YOUR_API_HASH')
    
    dialog_count = 10
    dialogs, entities = client.get_dialogs(dialog_count)
    for i, entity in enumerate(entities):
                        i += 1  # 1-based index
                        print('{}. {}. id: {}'.format(i, get_display_name(entity), entity.id))
    

    您可能希望向您的群组发送消息,以便该群组显示在列表顶部。

    【讨论】:

      【解决方案8】:

      您可以用相同的方式检索组 ID。它在消息正文中显示为message.chat.id,通常为负数,正常聊天为正数。

      组 ID 和聊天 ID 只能从收到的消息中检索,没有可用于检索活动组的呼叫等。您必须在收到消息时记住组 ID 并将其存储在缓存或类似的东西中。

      【讨论】:

      • 其他人可以确认这是真的吗?在阅读完这些文件后,我差点说是的。我希望能够从群组链接中获取 chat_id 以满足我的要求。
      【解决方案9】:

      我的第二个错误解决方案 {"ok":true,"result":[]}

      1. 加入你的电报群
      2. 添加新用户(邀请)
      3. 搜索“getidsbot” => @getidsbot
      4. 留言:/start@getidsbot
      5. 现在您可以看到 ID。看起来像 1068773197,对于机器人来说是 -1001068773197(带有 -100 前缀)!!!
      6. 将机器人踢出群组。
      7. 现在转到网络浏览器并发送此行(测试消息):
      https://api.telegram.org/botAPITOKENNUMBER:APITOKENKEYHERE/sendmessage?chat_id=-100GROUPNUMBER&text=test

      编辑 API 令牌和组 ID!

      【讨论】:

        【解决方案10】:

        创建一个机器人,或者如果已经创建,设置如下:

        有权访问消息

        显然,无论 Telegram 组的新旧程度如何:

        1. 将机器人添加到组

        2. 从组中删除机器人

        3. 再次将机器人添加到组中

        4. 创建一个脚本文件并运行getUpdates 方法 示例:

            var vApiTokenTelegram = "1234567890:???>yg5GeL5PuItAOEhvdcPPELAOCCy3jBo"; // @?????Bot API token
            var vUrlTelegram = "https://api.telegram.org/bot" + vApiTokenTelegram;
        
            function getUpdates() {
                var response = UrlFetchApp.fetch(vUrlTelegram + "/getUpdates");
                console.log(response.getContentText());
            }
        
        1. 函数应将以下内容记录到控制台:
        [20-04-21 00:46:11:130 PDT] {"ok":true,"result":[{"update_id":81329501,
        "message":{"message_id":975,"from":{"id":962548471,"is_bot":false,"first_name":"Trajano","last_name":"Roberto","username":"TrajanoRoberto","language_code":"en"},"chat":{"id":-1001202656383,"title":"R\u00e1dioRN - A voz da na\u00e7\u00e3o!","type":"supergroup"},"date":1587454914,"left_chat_participant":{"id":1215098445,"is_bot":true,"first_name":"MediaFlamengoRawBot","username":"MediaFlamengoRawBot"},"left_chat_member":{"id":1215098445,"is_bot":true,"first_name":"MediaFlamengoRawBot","username":"MediaFlamengoRawBot"}}},{"update_id":81329502,
        "message":{"message_id":976,"from":{"id":962548471,"is_bot":false,"first_name":"Trajano","last_name":"Roberto","username":"TrajanoRoberto","language_code":"en"},"chat":{"id":-1001202656383,"title":"R\u00e1dioRN - A voz da na\u00e7\u00e3o!","type":"supergroup"},"date":1587454932,"new_chat_participant":{"id":1215098445,"is_bot":true,"first_name":"MediaFlamengoRawBot","username":"MediaFlamengoRawBot"},"new_chat_member":{"id":1215098445,"is_bot":true,"first_name":"MediaFlamengoRawBot","username":"MediaFlamengoRawBot"},"new_chat_members":[{"id":1215098445,"is_bot":true,"first_name":"MediaFlamengoRawBot","username":"MediaFlamengoRawBot"}]}}]}
        
        1. 电报群chat_id可以从上面的消息中提取 "chat":{"id":-1001202656383,"title"

        【讨论】:

        • 请不要发布多个答案,除非每个答案都真正不同
        【解决方案11】:

        我现在测试了 4 小时,但它在 2021 年无法使用 group-chat-id。一直错误 {"ok":true,"result":[]}

        但现在我找到了解决方案:

        1:) 安装“Plus Messenger”(https://play.google.com/store/apps/details?id=org.telegram.plus

        2:) 进入群组 => 现在点击头部中的“群组名称” => 现在双击群组的标题。信息即将发布:ID123456789 已复制到剪贴板

        3:) 进入 Group 并粘贴剪贴板文本。是你的地名

        4:) 看起来像 1068773197,对于机器人来说是 -1001068773197(带有 -100 前缀)!!!

        顺便说一句,您也可以在您的个人资料上看到用户 ID。

        5:) 现在转到网络浏览器并发送此行(测试消息):

        https://api.telegram.org/botAPITOKENNUMBER:APITOKENKEYHERE/sendmessage?chat_id=-100GROUPNUMBER&text=test
        

        编辑 API 令牌和组 ID

        【讨论】:

          【解决方案12】:

          您可以通过向机器人userinfobot 发送/start 消息来获取您的ID

          注意:一旦你在电报中搜索 userinfobot,你会得到很多回复。 确保你选择带有@bot标签的那个

          【讨论】:

            【解决方案13】:

            恕我直言,最好的方法是使用 TeleThon,但鉴于 apadanathe answer 已经过时且无法修复,我将在此处编写工作解决方案:

            import os
            import sys
            from telethon import TelegramClient
            from telethon.utils import get_display_name
            
            import nest_asyncio
            nest_asyncio.apply()
            
            session_name = "<session_name>"
            api_id = <api_id>
            api_hash = "<api_hash>"
            dialog_count = 10 # you may change this
            
            if f"{session_name}.session" in os.listdir():
                os.remove(f"{session_name}.session")
            
            client = TelegramClient(session_name, api_id, api_hash)
            
            async def main():
                dialogs = await client.get_dialogs(dialog_count)
                for dialog in dialogs:
                    print(get_display_name(dialog.entity), dialog.entity.id)
            
            async with client:
                client.loop.run_until_complete(main())
            

            这个 sn-p 将为您提供 Telegram 中的第一个 10 聊天。

            假设:

            • 您已安装 telethonnest_asyncio
            • 你有来自my.telegram.orgapi_idapi_hash

            【讨论】:

            • 这个 sn-p 不起作用。我得到SyntaxError: 'async with' outside async function。有办法解决吗?
            • 很遗憾听到您无法使用我的答案。这是很久以前的事了。我不能保证我可以立即修复它。
            • 我可能已经修复了它,但它需要来自其他机器人的会话文件。我在这里发布代码以防其他人偶然发现同样的问题。只要您有会话文件,似乎就可以工作:gist.github.com/casper/444daf52c1fde5a1b839306b551f757f
            【解决方案14】:

            我不明白为什么最明显(也可能是最简单)的答案不在这里。

            在编写机器人时,您可以通过以下三行简单的代码获取 id:

            bot.on('message', (msg) => {
              console.log(msg)
            })
            

            然后只需从控制台检查 groupId :D

            而且您可能正在尝试查看 groupId 以便能够使用您的机器人向群组发送消息,正确的答案可能是:

            您不再使用 groupId。您使用以@ 为前缀的组名(带有https://t.me/careless_whisper 的组名)。请记住,您的群组必须公开。来源:Telegram API

            因此,如果您的群组名称是 careless_whisper,那么收件人将是 @careless_whisper

            【讨论】:

              【解决方案15】:

              我想指出非常具体的案例让我对此感到困惑。

              我得到了chat_id,上面的步骤格式为-1001379XXXXXX。所以我只是假设真实的 id 是1001379XXXXXX,并以这样的格式将其留给 grafana 管理页面。但实际上 id 得到了这个 - 作为不可或缺的部分。如果真的需要和数字一起复制。

              【讨论】:

                【解决方案16】:

                如果您正在实现您的机器人,请保持存储组名 -> id 表,并使用命令询问它。然后你也可以按名字发送。

                【讨论】:

                  猜你喜欢
                  • 2020-04-14
                  • 2019-10-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-01-28
                  • 2019-02-14
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多