You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Microsoft Bot Framework的C#机器人中获取多渠道用户信息的问题

解决Microsoft Bot Framework获取Telegram用户数据并支持多渠道的方案

我来帮你搞定这个需求!在Bot Framework里,不同渠道的用户原生数据会存在Activity对象的特定字段里,Telegram的用户信息就藏在ChannelData中,和你之前用Telegram Bot API拿到的结构几乎一致。下面是具体实现步骤:

1. 定义Telegram数据对应的C#实体类

首先我们需要创建和Telegram返回数据匹配的类,方便后续反序列化:

using Newtonsoft.Json;

public class TelegramUpdate
{
    [JsonProperty("update_id")]
    public int UpdateId { get; set; }
    
    [JsonProperty("message")]
    public TelegramMessage Message { get; set; }
}

public class TelegramMessage
{
    [JsonProperty("message_id")]
    public int MessageId { get; set; }
    
    [JsonProperty("from")]
    public TelegramUser From { get; set; }
}

public class TelegramUser
{
    [JsonProperty("id")]
    public long Id { get; set; }
    
    [JsonProperty("is_bot")]
    public bool IsBot { get; set; }
    
    [JsonProperty("first_name")]
    public string FirstName { get; set; }
    
    [JsonProperty("last_name")]
    public string LastName { get; set; }
    
    [JsonProperty("language_code")]
    public string LanguageCode { get; set; }
}

2. 在Bot逻辑中解析Telegram用户数据

在处理消息的方法里,我们可以通过ChannelData反序列化出Telegram的用户信息,然后提取first_name进行交互:

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
    string userName = null;

    // 针对Telegram渠道解析用户数据
    if (turnContext.Activity.ChannelId.Equals("telegram", StringComparison.OrdinalIgnoreCase))
    {
        try
        {
            var telegramUpdate = JsonConvert.DeserializeObject<TelegramUpdate>(turnContext.Activity.ChannelData.ToString());
            userName = telegramUpdate?.Message?.From?.FirstName;
        }
        catch (Exception ex)
        {
            // 处理反序列化异常,比如日志记录
            await turnContext.SendActivityAsync("抱歉,暂时无法获取您的信息,请告诉我您的姓名。", cancellationToken: cancellationToken);
            return;
        }
    }
    // 其他渠道的适配(比如Facebook/Slack等,直接从From.Name取)
    else if (!string.IsNullOrEmpty(turnContext.Activity.From.Name))
    {
        userName = turnContext.Activity.From.Name;
    }

    // 根据获取到的姓名做出响应
    if (!string.IsNullOrEmpty(userName))
    {
        await turnContext.SendActivityAsync($"是否要使用{userName}作为您的名称?", cancellationToken: cancellationToken);
    }
    else
    {
        // 回退到官方文档建议的询问逻辑
        await turnContext.SendActivityAsync("请问您的姓名是什么?", cancellationToken: cancellationToken);
    }
}

3. 多渠道支持的注意事项

  • 依赖Newtonsoft.Json:需要在项目中安装Newtonsoft.Json NuGet包,用来处理JSON反序列化。
  • 渠道兼容性:不是所有渠道都能提供用户的原生姓名数据,比如有些即时通讯渠道可能只返回匿名ID,这时候必须回退到询问用户的逻辑,这也是官方文档建议这么做的核心原因。
  • 异常处理:要做好ChannelData为空、反序列化失败的异常处理,避免Bot崩溃。

内容的提问来源于stack exchange,提问作者JohnLemon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:54:34