如何获取特定用户的 Telegram chat_id?

How to obtain Telegram chat_id for a specific user?

如何在 Telegram bot API 中获取用户 chat_id? 文档说:

Integer | Unique identifier for the message recipient — User or GroupChat id

您通过 getUpdates 或您的 webhook 收到的消息更新将包含特定消息的聊天 ID。它将包含在 message.chat.id 键下。

这似乎是您能够检索聊天 ID 的唯一方法。因此,如果您想在机器人发起对话的地方编写一些内容,您可能必须将与用户相关的聊天 ID 存储在某种键-> 值存储中,例如 MemCache 或 Redis。

我相信他们的文档在这里暗示了类似的东西,https://core.telegram.org/bots#deep-linking-example。您可以使用 深层链接 发起对话,而无需用户先输入消息。

使用 Perl API 你可以这样得到它:首先你从 Telegram 向机器人发送消息,然后发出 getUpdates 并且聊天 ID 必须在那里:

#!/usr/bin/perl

use Data::Dumper;
use WWW::Telegram::BotAPI;

my $TOKEN = 'blablabla';
my $api = WWW::Telegram::BotAPI->new (
    token => $TOKEN
) or die "I can't connect";

my $out = $api->api_request ('getUpdates');
warn Dumper($out);
my $chat_id = $out->{result}->[0]->{message}->{chat}->{id};
print "chat_id=$chat_id\n";

id 应该在 chat_id 但它可能取决于结果,所以我还添加了整个结果的转储。

您可以从 https://github.com/Robertof/perl-www-telegram-botapi 安装 Perl API。这取决于您的系统,但我很容易 运行 在我的 Linux 服务器上安装了这个:

$ sudo cpan WWW::Telegram::BotAPI

希望对您有所帮助

您可以与您的机器人共享联系人,然后通过 /getUpdates,您可以获得 "contact" 对象

我创建了一个机器人来获取用户或群聊 ID, 只需将 /my_id 发送到电报机器人 @get_id_bot.

不仅对用户聊天ID有效,对群聊ID也有效

要获取群聊ID,首先你必须将机器人添加到群中, 然后在群里发/my_id

Here 是机器人的 link。

有一个机器人会在开始对话时回显您的聊天 ID。

只需搜索 @chatid_echo_bot 并点击 /start。它会回显你的聊天 ID。

另一个选项是 @getidsbot,它可以为您提供更多信息。如果您将消息转发给机器人,此机器人还会提供有关转发消息(从用户、到用户、乍得 ID 等)的信息。

直接从 documentation:

假设网站 example.com 想通过 Telegram 机器人向其用户发送通知。以下是他们可以为 ID 为 123 的用户启用通知的方法。

  1. 使用合适的用户名创建一个机器人,例如@ExampleComBot
  2. 为收到的消息设置网络钩子
  3. 生成足够长度的随机字符串,例如$memcache_key = "vCH1vGWJxfSeofSAs0K5PA"
  4. 将键为 $memcache_key 的值 123 放入内存缓存 3600 秒(一小时)
  5. 向我们的用户显示按钮 https://telegram.me/ExampleComBot?start=vCH1vGWJxfSeofSAs0K5PA
  6. 配置 webhook 处理器以使用在以 /start 开头的传入消息中传递的参数查询 Memcached。如果密钥存在,则将传递给 webhook 的 chat_id 记录为用户 123 的 telegram_chat_id。从 Memcache 中删除密钥。
  7. 现在,当我们要向用户 123 发送通知时,检查他们是否有字段 telegram_chat_id。如果是,请使用 Bot API 中的 sendMessage 方法在 Telegram 中向他们发送消息。

首先,post 包含您的机器人的聊天消息(提及机器人的频道、群组或一对一聊天)。然后,只是 运行:

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

如果您没有安装 jq,请随意删除 | jq 部分,它只对漂亮的打印有用。你应该得到这样的东西:

您可以在返回的 json 对象中看到聊天 ID,以及聊天名称和相关消息。

每当用户与 bot 通信时,它都会发送如下信息:

$response = {
        "update_id":640046715,
        "message":{
            "message_id":1665,
            "from":{"id":108177xxxx,"is_bot":false,"first_name":"Suresh","last_name":"Kamrushi","language_code":"en"},
            "chat":{"id":108xxxxxx,"first_name":"Suresh","last_name":"Kamrushi","type":"private"},
            "date":1604381276,
            "text":"1"            
            }        
        }

这样您就可以像这样访问它:
$update["消息"]["聊天"]["id"]

假设您正在使用 PHP。

chat_id 只不过是用户 ID(电报用户帐户 ID)。您可以与 @get_my_chat_id_bot 开始聊天。它会将 chat_id(您的 user_id)发回给您。 常用的id有以下几种:channel id, group id, bot id, chat id(user id).

扩展@Roberto Santalla 的答案,如果您更喜欢将 Telegram API 与 javascriptaxios 库一起使用,那么您可能需要以下内容:

const method = 'get'

const headers: any = {
  'Access-Control-Allow-Origin': '*',
  'Content-Type': 'application/json',
  timestamp: +new Date(),
}

const options = { headers: { ...headers } }

const urlTelegramBase =
  'https://api.telegram.org/bot123456:ABCDEF'

const urlGetUpdates = `${urlTelegramBase}/getUpdates`
const username = 'user_name'

const {
  data: { result: messages },
} = await axios[method](urlGetUpdates, options)

const chat_id = messages.find(
  messageBlock => messageBlock.message.chat.username === username
).message.chat.id

console.info('chat_id': chat_id)