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

时间:2019-09-23 14:16:21

标签: c# botframework microsoft-teams

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

Hello someuser@mytenant.com

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

当前,我的机器人中包含以下内容:

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 个答案:

答案 0 :(得分:1)

首先,您需要将user@email.com映射到其Teams userId(可能带有静态字典),格式为:

29:1I9Is_Sx0O-Iy2rQ7Xz1lcaPKlO9eqmBRTBuW6XzXXXXXXXXMij8BVMdBcL9L_RwWNJyAHFQb0TXXXXXX

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

  1. Querying the roster
  2. 让机器人收到用户消息,并在传入消息上设置断点,查看Teams用户ID的Activity.ChannelData,或者
  3. 动态地为所有传入消息构建一个静态字典,该字典存储映射到其Teams userId的用户电子邮件(我相信两者都可以在Activity.ChannelData中找到)。

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

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