如何通过 Bot Framework 向 Teams 中的用户发送通知?

Posted

技术标签:

【中文标题】如何通过 Bot Framework 向 Teams 中的用户发送通知?【英文标题】:How do I send a notification to a user in Teams via the Bot Framework? 【发布时间】:2019-09-23 14:16:21 【问题描述】:

我有一个使用 Microsoft Bot Framework 的 v4 创建的 Bot。我可以在 Azure 门户的“网络聊天测试”部分成功使用此机器人。我还可以在我在 Microsoft Teams 中创建的应用程序中成功使用此机器人。我现在想从“网络聊天中的测试”部分向 Teams 中的特定用户发送通知。例如,在“网络聊天测试”部分,我想输入

Hello someuser@mytenant.com

当这是通过“网络聊天中的测试”部分发送时,我想在 Microsoft Teams 中仅向 someuser@mytenant.com 显示“Hello”。我已经成功地标记了来自“网络聊天测试”的字符串。因此,我知道我想发送什么,以及我想发送给谁。但是,我不知道如何实际发送它。

目前,我的机器人中有以下内容:

public class EchoBot : ActivityHandler

  private ConcurrentDictionary<string, ConversationReference> _conversationReferences;

  public EchoBot(ConcurrentDictionary<string, ConversationReference> conversationReferences)
  
    _conversationReferences = conversationReferencs;
  

  private void AddConversationReference(Activity activity)
  
    var reference = activity.GetConversationReference();
    _conversationReferences.AddOrUpdate(reference.User.Id, reference, (key, newValue) => reference);
  

  protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> context, CancellationToken cancellationToken)
  
    AddConversationReference(context.Activity as Activity);

    var parameters = GetParameters();  // Parses context.Activity.Text;

    // Send a message to the target (i.e. someuser@mytenant.com)
    var connection = new Microsoft.Bot.Connector.ConnectorClient(new Uri(context.Activity.ServiceUrl));
    var tenant = context.Activity.GetChannelData<TeamsChannelData>().Tenant;
    // how do I send the message to parameters.Target?

    // Confirm message was sent to the sender
    var confirmation = $"Message was sent to parameters.Target.";
    await context.SendActivityAsync(MessageFactory.Text(confirmation));
  
 

我已经查看了如何send proactive notifications to users。但是,我在 a) 获取 parameters.Target 中指定的用户和 b) 向该用户发送通知方面没有成功。我错过了什么?

【问题讨论】:

【参考方案1】:

首先,您需要将user@email.com 映射到他们的 Teams 用户 ID(可能使用静态字典),格式为:

29:1I9Is_Sx0O-Iy2rQ7Xz1lcaPKlO9eqmBRTBuW6XzXXXXXXXXMij8BVMdBcL9L_RwWNJyAHFQb0TXXXXXX

您可以通过以下任一方式获取 Teams 用户 ID:

    Querying the roster,或 让用户向机器人发送消息,并在传入消息上设置断点,查看团队用户 ID 的 Activity.ChannelData,或 动态构建所有传入消息的静态字典,其中存储映射到其团队用户 ID 的用户电子邮件(我相信两者都在 Activity.ChannelData 中找到)。

注意:#1 和 #2 都要求用户首先向机器人发送消息,这有点违背主动消息的目的

拥有适当的团队 ID 后,您只需 send a proactive message to a Teams user。此链接的末尾还提到了trustServiceUrl,如果您在尝试发送主动消息时遇到权限/身份验证问题,您可能会发现它很方便。

【讨论】:

谢谢。但是,我一直无法查询名册。我的机器人在团队的“对话”选项卡中正确回显了输入。但是,当我尝试查询名册时,Team 属性为空。我用这条线:var members = (await turnContext.TurnState.Get&lt;IConnectorClient&gt;().Conversations.GetConversationMembersAsync( turnContext.Activity.GetChannelData&lt;TeamsChannelData&gt;().Team.Id).ConfigureAwait(false)).ToList(); 显示here 您是否将机器人添加到团队中? Teams &gt; App Studio &gt; Manifest Editor &gt; YourBot &gt; Test and Distribute &gt; Install &gt; [Dropdown by Add] Add to a team? 我没有将应用添加到团队中。但是,我确实在 Teams 中安装了 Teams 应用程序。我正在寻找一种仅使用 Teams 应用程序而无需在 Teams 中创建实际团队的方法。 @ZachTempleton 你不能这样做,因为机器人没有适当的范围。这是为了防止垃圾邮件。

以上是关于如何通过 Bot Framework 向 Teams 中的用户发送通知?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Bot Framework V4 在 Teams 中发送主动式 1:1 消息

在使用 Bot Framework 时,如何将 Skype 音频附件与 Bing Speech API 一起使用?

传出 Skype 消息不适用于 Bot Framework

Bot Framework:如何退出对话?

在 Bot Framework 中获取 Skype 身份?

Microsoft Bot Framework - 如何将数据从 Azure 数据库获取到我的 Bot 项目?