Botframework 以编程方式向Microsoft团队中的机器人发送消息

Botframework 以编程方式向Microsoft团队中的机器人发送消息,botframework,microsoft-teams,Botframework,Microsoft Teams,我创建了一个主动式机器人,当用户开始与机器人对话时,它基本上会向用户询问某些问题。机器人程序部署在Microsoft Team环境中。有没有什么方法可以让我通过一个通道向机器人发送自动消息?我知道可以使用powershell通过利用特定团队公开的webhook url或使用MS Flow发送消息。但是我想在消息中提到bot(例如@mybothandle)因此bot开始自己提问,而不是要求用户开始对话(手动提及bot)但没有找到提及的方式。 欢迎您的建议。对于所有未来的访问者,Microsoft

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

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

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

正文

"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"
                        }
      }
    }
  ]
}
“正文”:{
“内容类型”:“html”,

“内容”:“Hello World

基本上,您希望在特定时间点(如24小时后)直接向用户发送消息。我在几个不同的机器人上做这件事,所以这绝对是可能的。Wajeed在你的问题的评论中发送的链接正是你所需要的-当用户与你的机器人交互时,你需要保存重要信息,如对话id、对话类型、服务url以及往返信息。你可以存储这些信息,例如instance、 在数据库中,然后您实际上可以让一个完全独立的应用程序进行调用,就像它是您的bot一样。例如,在我的bot中,我将bot托管在普通主机中(例如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();
方括号中的所有项目都是从用户与bot的初始对话中获得的,除了from和To是切换的(当用户向bot发送消息时,用户是from,bot是To,当bot向您发送消息时,切换它们)


希望这有帮助

您想启动与用户的对话吗?为此,您需要存储并稍后使用它来启动对话。您也可以尝试在频道中发送消息。启动与用户的对话并不是一个真正的问题,但我想在特定的时间间隔后启动对话,例如,每24小时之后小时。因此,我正在寻找触发bot的方法。请查看此文档以从外部触发bot消息。抱歉,刚刚检查了链接,这似乎是关于存储对话引用,然后使用提供给适配器的对话引用继续对话。我搜索的是使bot发送排序每天早上7点向所有团队成员发送欢迎消息。这可以实现吗?感谢@Giesenow的详细回答。我的机器人像普通机器人一样部署在Azure应用程序服务中,并具有该应用程序id和密码。在我的场景中,这基本上是一个Microsoft团队,其中用户可以是新成员,也可能没有与机器人进行交互所以,Azure函数将不会有任何对话引用、指向、来自信息,只需要每天获取团队信息(成员id、姓名等)并向所有成员发送消息,关于Azure功能如何设计的任何见解?啊,好的。我在上面发布的内容是在24小时内发送消息本身,但您首先需要会话id(直接MSG的会话类型为“个人”)因为你的机器人从来没有与用户聊天过。机器人不能只是与另一个用户聊天,它需要权限。我以前没有这样做过,但你需要在频道中获取用户信息,然后实际以编程方式为用户“安装”机器人,就像我还没有测试“C#Sample”一样,所以请注意,“AppId”“他们使用的可能是机器人的AppId,也可能是团队的AppId(清单文件中的一个,或者如果你使用app Studio,则在你的应用程序设置中列出。我玩这个更多是出于好奇,实际上我正在努力创建一个对话id,使用“c#sample”以及其他一些选项。我很好奇是否有人真的成功了?评论不错,@HiltonGiesenow.It.)你似乎更熟悉团队中的机器人集成:)我只是想提醒你注意你为“C#smple”发布的链接。该链接返回404页未找到。如果可能,请更新它。我很想检查它。上面不是有效的JSON正文。需要什么标题?请提供更多详细信息,因为我正在尝试做相同的事情。是的,JSON正文可能无效,我想它缺少一个大括号。无论如何,您可以使用联机JSON验证器。对于标题s、 您需要提供包含具有适当权限的访问令牌的授权头。为了实现POC,您可以在图形浏览器中尝试此端点