我基本上是在尝试与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”。 这使我想到一个问题:实际上有可能在没有任何团队上下文的情况下(只是聊天)发起与团队的对话吗?
预先感谢, 马丁
答案 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);