我可以通过Telegram Bot API获取用户ID的电话号码吗?

isx*_*ker 11 c# telegram telegram-bot

我正在使用Telegram Bot API向用户发送即时消息.我已经安装了nuget包.电报开发人员推荐这个软件包.

我创建了一个电报机器人,并使用代码成功访问了它.当我向机器人发送消息时,机器人会获得有关发送者的一些信息.

在此输入图像描述

我需要用户的电话号码在我们的系统中识别它们并将信息发回给他们.

我的问题是我可以获得用户电话号码telegramUserId吗?

我这样做是为了方便用户.如果我能得到用户电话号码,我不应该向用户索要.

现在我的命令是这样的:

debt 9811201243
Run Code Online (Sandbox Code Playgroud)

我想要

debt
Run Code Online (Sandbox Code Playgroud)

Ser*_*nov 12

不,遗憾的Telegram Bot API是不会返回电话号码.您应该使用Telegram API方法,或者明确地向用户询问.你也无法获得用户的"朋友".

您一定会检索以下信息:

  1. userid
  2. first_name
  3. content (无论是什么:文字,照片等)
  4. date (unixtime)
  5. chat_id

如果用户配置了它,你也会得到last_nameusername.

  • 没有综合的方法来做到这一点.但是,验证的一种方法是将代码发送到此电话号码,并要求他在聊天中提供此代码. (4认同)
  • 为什么“不幸”?这可以防止垃圾邮件发送者向所有用户发送他们的垃圾(就像 WhatsApp) (2认同)

Dan*_*sev 11

机器人2.0可以检查bot api docs.

https://core.telegram.org/bots/2-0-intro#locations-and-numbers https://core.telegram.org/bots/api#keyboardbutton

  • 你错了。机器人仍然无法使用电话号码**除非**用户使用特殊命令明确地将其发送给机器人。 (4认同)
  • 你可以查看它是什么.用户可以发送自己的电话号码,用户也可以发送联系人.您需要比较邮件发件人的user_id和联系人的user_id.如果它与用户的真实电话号码相同. (3认同)
  • 如果我使用 request_contact 请求用户的电话 - 我可以确定这是用户的电话吗?用户不能手动发送其他用户的电话吗?例如,通过键入而不是按按钮?或者甚至使用修改后的电报客户端? (3认同)
  • 是的,但"用户可以"意味着,默认情况下,机器人无法使用电话号码.这就是我所说的. (2认同)

Hus*_*ish 6

使用Telegram Bot API,只有当您向用户请求时,您才能获取电话号码,但用户不必写下该号码,他所要做的就是在对话中按一个按钮,号码就会发送到你。

在此输入图像描述

当用户点击/myNumber

在此输入图像描述

用户必须确认:

在此输入图像描述

你会得到他的号码

在此输入图像描述

这。是控制台输出:

在此输入图像描述

看一下这个简单的控制台应用程序,但您需要做一些更改来处理数字:

将以Handler.ch下行添加到BotOnMessageReceived

if (message.Type == MessageType.Contact && message.Contact != null)
{
Console.WriteLine($"Phone number: {message.Contact.PhoneNumber}");
}
Run Code Online (Sandbox Code Playgroud)

这是存储库有一天被删除时所需的代码:

程序.cs

public static class Program
{
    private static TelegramBotClient? bot;

    public static async Task Main()
    {
        bot = new TelegramBotClient(/*TODO: BotToken hier*/);

        User me = await bot.GetMeAsync();
        Console.Title = me.Username ?? "My awesome bot";

        using var cts = new CancellationTokenSource();

        ReceiverOptions receiverOptions = new() { AllowedUpdates = { } };
        bot.StartReceiving(Handlers.HandleUpdateAsync,
            Handlers.HandleErrorAsync,
            receiverOptions,
            cts.Token);

        Console.WriteLine($"Start listening for @{me.Username}");
        Console.ReadLine();

        cts.Cancel();
    }
}
Run Code Online (Sandbox Code Playgroud)

处理程序.cs

 internal class Handlers
    {
        public static Task HandleErrorAsync(ITelegramBotClient botClient, Exception exception, CancellationToken cancellationToken)
        {
            var errorMessage = exception switch
            {
                ApiRequestException apiRequestException => $"Telegram API Error:\n[{apiRequestException.ErrorCode}]\n{apiRequestException.Message}",
                _ => exception.ToString()
            };

        Console.WriteLine(errorMessage);
        return Task.CompletedTask;
    }

    public static async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
    {
        
        var handler = update.Type switch
        {
            UpdateType.Message => BotOnMessageReceived(botClient, update.Message!),
            _ => UnknownUpdateHandlerAsync(botClient, update)
        };

        try
        {
            await handler;
        }
        catch (Exception exception)
        {
            await HandleErrorAsync(botClient, exception, cancellationToken);
        }
    }

    private static async Task BotOnMessageReceived(ITelegramBotClient botClient, Message message)
    {
        Console.WriteLine($"Receive message type: {message.Type}");

        if (message.Type == MessageType.Contact && message.Contact != null)
        {
            // TODO: save the number...
            Console.WriteLine($"Phone number: {message.Contact.PhoneNumber}");
        }

        if (message.Type != MessageType.Text)
            return;
        
        var action = message.Text!.Split(' ')[0] switch
        {
            "/myNumber" => RequestContactAndLocation(botClient, message),
            _ => Usage(botClient, message)
        };
        Message sentMessage = await action;
        Console.WriteLine($"The message was sent with id: {sentMessage.MessageId}");


        static async Task<Message> RequestContactAndLocation(ITelegramBotClient botClient, Message message)
        {
            ReplyKeyboardMarkup requestReplyKeyboard = new(
                new[]
                {
                // KeyboardButton.WithRequestLocation("Location"), // this for the location if you need it
                KeyboardButton.WithRequestContact("Send my phone Number"),
                });

            return await botClient.SendTextMessageAsync(chatId: message.Chat.Id,
                                                        text: "Could you please send your phone number?",
                                                        replyMarkup: requestReplyKeyboard);
        }

        static async Task<Message> Usage(ITelegramBotClient botClient, Message message)
        {
            const string usage = "/myNumber  - to send your phone number";

            return await botClient.SendTextMessageAsync(chatId: message.Chat.Id,
                                                        text: usage,
                                                        replyMarkup: new ReplyKeyboardRemove());
        }
    }
   
    private static Task UnknownUpdateHandlerAsync(ITelegramBotClient botClient, Update update)
    {
        Console.WriteLine($"Unknown update type: {update.Type}");
        return Task.CompletedTask;
    }
}
Run Code Online (Sandbox Code Playgroud)