【问题标题】:Programmatically sending a message to a bot in Microsoft Teams以编程方式向 Microsoft Teams 中的机器人发送消息
【发布时间】:2020-04-09 17:51:32
【问题描述】:

我创建了一个主动式机器人,它基本上会在用户开始与机器人对话时向用户提出某些问题。该机器人部署在 Microsoft Teams 环境中。有什么方法可以向频道中的机器人发送自动消息?我知道可以通过使用特定团队公开的 webhook url 或使用 MS Flow 使用 powershell 发送消息。但是我想在消息中提及机器人(例如@mybothandle),因此机器人开始自行提问,而不是要求用户开始对话(通过手动提及机器人)但没有找到方式提及。 欢迎您提出建议。

【问题讨论】:

  • 您想与用户发起对话吗?为此,您需要存储user's information,然后稍后使用它来启动对话。您也可以尝试Graph APIs在频道中发送消息。
  • 启动与用户的对话并不是真正的问题,但我想在特定时间间隔后启动对话,例如每 24 小时后。所以,我正在寻找触发机器人的方法。
  • 请查看此Sending Proactive Message 文档以从外部触发机器人消息。
  • 抱歉,刚刚检查了链接,这似乎是关于存储对话参考,然后使用提供给适配器的对话参考继续对话。我正在寻找的是让机器人每天发送一种欢迎信息,例如早上 7 点致所有团队成员。这可以实现吗?
  • 最后,微软添加了关于同一docs.microsoft.com/en-us/microsoftteams/platform/… 的文档。请查看以实际了解主动消息的工作原理

标签: botframework microsoft-teams


【解决方案1】:

对于所有未来的访问者,Microsoft Graph API(测试版)现在提供了一种使用以下端点发送消息和提及机器人/用户的方法:

 https://graph.microsoft.com/beta/teams/{group-id-for-teams}/channels/{channel-id}/messages

方法: POST

正文

"body": {
    "contentType": "html",
    "content": "Hello World <at id=\"0\">standupbot</at>"
  },
  "mentions": [
    {
      "id": 0,
      "mentionText": "StandupBot",
      "mentioned": {
        "application": {
                            "id": "[my-bot-id]",
                            "displayName": "StandupBot",
                            "applicationIdentityType": "bot"
                        }
      }
    }
  ]
}

但是,bot 收到消息时没有响应的错误: Bot is not responding to @Mention when sending message using Graph API

【讨论】:

  • 以上不是有效的 JSON 正文。需要什么标题?请提供更多细节,因为我正在尝试做同样的事情。
  • 是的,JSON 正文可能无效,我认为它缺少一个左大括号。无论如何,您可以使用在线 JSON 验证器。对于标头,您需要提供包含具有适当权限的访问令牌的授权标头。为了 POC,您可以在图形资源管理器中尝试此端点
【解决方案2】:

基本上,您希望在特定时间点(例如 24 小时后)直接向用户发送消息。我在几个不同的机器人中这样做,所以这绝对是可能的。 Wajeed 在对您的问题的评论中发送的链接正是您所需要的 - 当用户与您的机器人交互时,您需要保存重要信息,例如对话 ID、对话类型、服务 URL 以及收件人和发件人信息。例如,您可以将其存储在数据库中,然后您实际上可以让一个完全独立的应用程序像您的机器人一样进行调用。例如,在我的机器人中,我将机器人托管在普通主机(例如 Azure 网站)中,但随后有一个 Azure 函数来发送消息,例如 24 小时后。在用户看来,它就像是来自机器人的消息,就像平常一样。

您还需要您的机器人的 Microsoft 应用 ID 和应用密码,您应该已经拥有(如果没有,它在 Azure 门户中)。

在您的“发送”应用程序中,您需要创建一个 Microsoft 实例。 Bot.Connector.ConnectorClient,如下:

var Connector = new ConnectorClient(serviceUrl, microsoftAppId: credentialProvider.AppId, microsoftAppPassword: credentialProvider.Password);

您还需要“信任”您正在调用的服务 url,如下所示:

MicrosoftAppCredentials.TrustServiceUrl(serviceURL);

然后您创建一个 Microsoft.Bot.Schema.Activity 的实例,设置所需的属性,并通过您创建的连接器发送它:

 var activity = Activity.CreateMessageActivity();

 activity.From = new ChannelAccount([FromId], [FromName];
 activity.Recipient = new ChannelAccount([ToId], [ToName]);
 activity.Conversation = new ConversationAccount(false, [ConversationType], [ConversationId]);
 activity.Conversation.Id = [ConversationId];

 activity.Text = "whatever you want to send from the bot...";

 Connector.Conversations.SendToConversationAsync((activity as Activity)).Wait();

方括号中的所有项目都是您从用户与机器人进行的初始对话中得到的,除了 From 和 To 互换(当用户向您的机器人发送消息时,用户是 FROM 和您的 Bot 是 TO,当 bot 发送时您切换它们。

希望有帮助

【讨论】:

  • 感谢@Giesenow 提供如此详细的回答。我的机器人像普通机器人一样部署在 Azure 应用程序服务中,并具有该应用程序 ID 和密码。在我的场景中,这基本上是一个 Microsoft 团队的团队,其中用户可以是新成员,并且可能从未与机器人交互过。因此,Azure 功能不会有任何对话参考,来自信息,而只需要每天获取团队信息(成员 ID、姓名等)并向所有成员发送消息,对此 Azure 功能如何的任何见解为此设计的?
  • 啊,好的。我在上面发布的是在 24 小时内发送消息本身,但是您需要第一个对话 ID(直接消息的对话类型是“个人”),因为您的机器人从未与用户聊天。机器人不能仅仅与另一个用户开始聊天,它需要许可。我以前没有这样做过,但是您需要在频道中获取用户信息,例如this,然后以编程方式为用户实际“安装”机器人,例如C# Sample
  • 我还没有测试过“C# Sample”,所以请注意,他们使用的“AppId”可能是 Bot 的 AppId,或者很可能是 TEAMS App Id(在清单文件,或者如果您使用的是 App Studio,则在您的应用设置中列出。
  • 出于好奇,我一直在玩这个,实际上我正在努力使用“c#示例”以及其他一些选项来创建对话 ID。我很好奇是否有人真的设法让它工作?
  • 很棒的评论,@HiltonGiesenow。您似乎更熟悉 Teams 上的机器人集成 :) 我只是想提请您注意您为“C# Smaple”发布的链接。该链接返回未找到的 404 页面。如果可能,请更新它。我很想看看。
猜你喜欢
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 2019-01-05
  • 2019-11-15
  • 2018-04-07
相关资源
最近更新 更多