18

Telegram Bot API用于向用户发送即时消息。我已经安装了nuget 包。这个包是电报开发者推荐的

我创建了一个电报机器人,并通过使用代码成功访问了它。当我向机器人发送消息时,机器人会获取一些关于发件人的信息。

在此处输入图像描述

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

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

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

现在我的命令是这样的:

debt 9811201243

我想

debt
4

3 回答 3

17

不,很遗憾Telegram Bot API不会返回电话号码。您应该改用Telegram API 方法,或者向用户明确询问。您也无法获得用户的“朋友”。

您一定会检索到以下信息:

  1. userid
  2. first_name
  3. content(不管是什么:文字、照片等)
  4. date(unixtime)
  5. chat_id

如果用户配置了它,您还将获得last_nameand username

于 2015-10-09T12:12:53.810 回答
17

bots 2.0 可以查看 bot api 文档。

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

于 2016-04-15T05:40:00.790 回答
1

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

在此处输入图像描述

当用户点击/myNumber

在此处输入图像描述

用户必须确认:

在此处输入图像描述

你会得到他的号码

在此处输入图像描述

这个。是控制台输出:

在此处输入图像描述

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

将以Handler.ch下行添加到BotOnMessageReceived

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

这是某天删除存储库时所需的代码:

程序.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();
    }
}

处理程序.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;
    }
}
于 2022-02-27T07:13:06.147 回答