Telegram Bot - 如何获取群聊 ID?

Posted

技术标签:

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

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

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

【问题讨论】:

我为此管理了一个机器人。我希望这会有所帮助,检查一下 ***.com/a/37396871/6223024> 【参考方案1】:

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

    将 Telegram BOT 添加到群组。

    获取您的 BOT 的更新列表:

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

    例如:

     https://api.telegram.org/bot123456789:jbd78sadvbdy63d37gda37bd8/getUpdates
    

    寻找“聊天”对象:

"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 添加到组时的响应示例。

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

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

    私人图表仅适用于图片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":[]

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

编辑 API 令牌和组 ID!

【讨论】:

【参考方案10】:

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

有权访问消息

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

    将机器人添加到组

    从组中删除机器人

    再次将机器人添加到组中

    创建一个脚本文件并运行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());
    
    函数应将以下内容记录到控制台:
[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"]]
    电报群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,但鉴于 apadana 的 the 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.org的api_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 表,并使用命令询问它。然后你也可以按名字发送。

【讨论】:

以上是关于Telegram Bot - 如何获取群聊 ID?的主要内容,如果未能解决你的问题,请参考以下文章

在 python-telegram-bot 中如何获取该组的所有参与者?

Telegram bot:如何通过 id(而不是用户名)提及用户

在函数内获取变量更新(Telegram bot、Python3、python-telegram-bot 库、多处理)

转发来自 Telegram Bot 的消息

Telegram bot 消息读取回调

用户加入频道时的 Telegram Bot 事件