在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.JsonNuGet包,用来处理JSON反序列化。 - 渠道兼容性:不是所有渠道都能提供用户的原生姓名数据,比如有些即时通讯渠道可能只返回匿名ID,这时候必须回退到询问用户的逻辑,这也是官方文档建议这么做的核心原因。
- 异常处理:要做好
ChannelData为空、反序列化失败的异常处理,避免Bot崩溃。
内容的提问来源于stack exchange,提问作者JohnLemon
相关产品推荐
相关产品推荐

