Teams Bot 在 Controller 中创建对话

Teams Bot Create Conversation In Controller

我想构建一个可以发送主动消息的 Teams 机器人,包括即使用户从未与机器人进行过对话也可以创建对话。

我关注了proactive sample and adapted it to send a notification as POST in the notify controller。我可以继续对话,但是当我尝试创建对话时,用户收不到任何消息。

这是我从通知控制器创建对话的代码:

// I got the following 4 values logging them on the bot in a conversation started by a user
const string botAppId = "<MicrosoftApptId GUID>";
const string serviceUrl = "<my service URL>";
const string tenantId = "<my tenant ID>";
const string recipientId = "<recipient ID xy:GUID>";

var title = "test title";
var activity = Activity.CreateMessageActivity();
activity.Type = ActivityTypes.Message;
activity.Text = "test message";

await ((BotAdapter)_adapter).CreateConversationAsync(
    botAppId: botAppId, 
    channelId: Microsoft.Bot.Connector.Channels.Msteams, 
    serviceUrl: serviceUrl, 
    audience: null, 
    conversationParameters: new ConversationParameters
    {
        Activity = (Activity)activity,
        Bot = new ChannelAccount(botAppId),
        IsGroup = false,
        Members = new List<ChannelAccount> { new ChannelAccount(recipientId) },
        TopicName = title,
        TenantId = tenantId
    },
    callback: (turnContext, cancellationToken) => Task.CompletedTask,
    cancellationToken: default(CancellationToken));

我在这里做错了什么?我在对话参数中遗漏了什么吗?我应该填充观众吗?怎么样?

感谢您的帮助!

请注意,这是基于我对

的评论的新 post

您无法与从未与您的 bot 交谈过的用户开始对话,当他们这样做时,您在某处存储了一个对话参考,以便在发送主动消息时使用它。

主动样本所做的正是,将对对话的引用存储在内存中。

Teams 为机器人-用户关系分配了一个唯一的用户 ID,因此即使您知道用户的活动目录对象 ID,也无法开始对话。或者至少在不使用它来创建对话参考的情况下。

跟随主动样本

https://github.com/microsoft/BotBuilder-Samples/blob/95f2fa8440b4cf3f984c3f1cb82966b8b45d71e8/samples/csharp_dotnetcore/16.proactive-messages/Bots/ProactiveBot.cs#L26 该方法是存储对话引用的方法。然后通知端点循环存储的对话引用并发送通知。 如果您的用户从未触发过该方法,则通知端点不会对该用户执行任何操作。我看到您修改了通知控制器,但我不确定您如何为从未与您交谈过的用户获取 recipientId。

第一次与用户交谈,Microsoft Graph 方法。

为此,您需要访问 AAD 租户中的 Microsoft Graph API 并将其用于:

  1. 获取用户
  2. 如果用户安装了您的机器人或可能强制安装,请获取 AppInstallationId
  3. 使用它来获取 bot 和 AppInstallation 之间的 ChatId
  4. 使用该 ChatId 为该用户创建对话参考。
  5. 可选择将对用户 ID 的引用和您创建的对话引用存储在某处,这样您就不必为该用户再次执行之前的所有步骤。

查看此项目:https://github.com/microsoft/microsoft-teams-apps-company-communicator

Martin 的回答很好地涵盖了所有内容,但我想补充一些相关的要点:

  1. 您链接到的示例工作正常,但实际上有几种方法可以调用 bot 框架服务来执行此操作,其中一些可能因此而有点混乱。为了帮助解决这个问题,我将 a sample 放在一起,其中显示了您需要的一些最少信息以及如何获取这些信息。顺便说一句,它还表明您的主动消息代码不需要与您的机器人本身的代码放在同一个地方。例如,您的机器人将是某种网络服务,但您的主动消息传递 发送 代码可能在 Azure Functions 或 AWS Lambda 或类似的东西中。从最终用户的角度来看,它似乎仍然“来自”您的机器人。

这是一个视频,我在其中更详细地讨论了这个问题,以防有帮助:https://www.youtube.com/watch?v=mM7-fYdcJhw&t=1398s

  1. 正如 Martin 所说,您必须在 Teams 中已经存在用户和机器人之间的对话 - 机器人不可能是第一个 connect给用户 - 用户基本上需要向机器人提供 'permission' 才能与 him/her 进行对话,这是通过安装 bot/app 来完成的。实际上有几种方法可以做到这一点。最简单的方法是让组织中的 Teams 管理员预安装您的应用程序。这样,例如,它可以预安装到贵公司的 每个 用户,甚至自动为所有 - 未来 - 用户预安装。 Teams 管理员将在 Teams 管理站点的“策略”部分执行此操作。另一种选择是以编程方式执行此操作,使用 Graph,使用 this endpoint.