在没有团队环境的情况下,使用Bot Framework for Microsoft Teams发起主动对话。

时间:2019-01-24 07:15:35

标签: azure botframework

我基本上是在尝试与Microsoft Bot Framework建立主动对话。我使用以下代码成功完成了Skype for BUsiness的操作:

string serviceUrl = "https://api.skypeforbusiness.com/platformservice/botframework";
MicrosoftAppCredentials.TrustServiceUrl(serviceUrl);

var connector = new ConnectorClient(new Uri(serviceUrl), "{app-id}", "{app-password}");

var user = new ChannelAccount("any-user-upn@domain.com", "Name of User");
var bot = new ChannelAccount("bot-upn@campana-schott.com", "Name of bot");

ConversationParameters cpMessage = new ConversationParameters(true, bot, new List<ChannelAccount> { user }, "Topic of the conversation");

ConversationResourceResponse response = await connector.Conversations.CreateConversationAsync(cpMessage);

启动对话后,我可以向用户发送消息,效果很好。但是对于MS团队,我有两个问题: 1.哪个serviceURL是正确的?我发现了一些提示,包括以“ https://smba.trafficmanager.net…”开头的网址,但它们都没有起作用,我总是收到异常的“错误请求”。

第二个问题:我是否需要一个Teams-Context(团队ID)来实际发布一条消息?或者(例如,以我的Skype为例)是否可以只与用户发起聊天?

编辑:我试图添加channelData(teamsChannelId)并使用服务URL“ https://smba.trafficmanager.net/emea-client-ss.msg”-然后得到响应代码“ Forbidden”。 这使我想到一个问题:实际上有可能在没有任何团队上下文的情况下(只是聊天)发起与团队的对话吗?

预先感谢, 马丁

2 个答案:

答案 0 :(得分:1)

所以,我想我自己找到了答案:

以下代码将使MS团队可以主动编写(Bot Services v3):

string serviceUrl = "https://smba.trafficmanager.net/emea/";
MicrosoftAppCredentials.TrustServiceUrl(serviceUrl);

var connector = new ConnectorClient(new Uri(serviceUrl), botAppId, appSecret);
var teamsBotAccount = new ChannelAccount("28:<BOT-APP-ID>", "Smart Office Bot");
var teamsUserAccount = new ChannelAccount("29:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_x", "Martin");

ConversationResourceResponse response = connector.Conversations.CreateOrGetDirectConversation(teamsBotAccount, teamsUserAccount, "9e73e135-fe7a-447f-baba-b0312d3aa55d");

关键是要向其发送消息的用户的ChannelAccount ID。我的第一个误解是,MS Teams的channelaccount ID也可以与Email一起使用-并非如此。 MS小组的ChannelAccounts是神秘的,而且是特定于Channel的。

这意味着:在ChannelAccount中用于消息收件人的用户ID仅存在于Channel Context中。对于直接1:1聊天,似乎我的用户在每次聊天中都有一个不同的ID。

我的结论:问题不在于Bot框架,而是MS Teams,它根本不支持从自动化组件发起聊天。正如我在其他类似主题中所总结的那样,有意不支持防止垃圾邮件(不幸的是,这非常不一致-显然不适用于Skype for Business)。

答案 1 :(得分:0)

@kolbi理想的解决方案是使用Botframework V4,这是一种与您尝试实现的方法类似的方法,但是是使用 Botframework V4 版本编写的。 Here is a detailed blog post about accomplishing this(发起对话,并主动回复特定对话)

            var channelData = turnContext.Activity.GetChannelData<TeamsChannelData>();

            var conversationParameter = new ConversationParameters
            {
                Bot = turnContext.Activity.Recipient,
                IsGroup = true,
                ChannelData = channelData,
                TenantId = channelData.Tenant.Id,
                Activity = MessageFactory.Text(message)
            };
            var response = await _client.Conversations.CreateConversationAsync(conversationParameter);