是否可以在没有团队上下文的情况下为Microsoft团队启动Bot框架的主动对话



我基本上是在尝试创建一个与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.哪个服务URL是正确的?我发现了一些提示,包括以"https://smba.trafficmanager.net…"但它们都不起作用,我总是收到一个异常"坏请求">

第二个问题:我需要一个Teams Context(Teams ID)来发布消息吗?或者(就像我在skype中的例子一样)是否可以启动与用户的聊天?

编辑:我尝试添加channelData(teamsChannelId)并使用了服务URL"https://smba.trafficmanager.net/emea-client-ss.msg"-然后我得到了响应代码"禁止"。这就引出了一个问题:在没有任何团队背景的情况下(只是聊天),是否真的可以发起团队对话?

提前感谢,Martin

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

以下代码将适用于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也适用于电子邮件-事实并非如此。MS团队的频道帐户是神秘的,而且是特定于频道的。

这意味着:要在消息收件人的ChannelAccount中使用的用户ID仅存在于频道上下文中。对于直接1:1聊天,我的用户似乎在每次聊天中都有不同的ID。

我的结论是:问题不在于Bot框架,而在于MS Teams,它根本不支持从自动化组件启动聊天。正如我从其他类似的帖子中得出的结论,它是故意不支持的,以防止垃圾邮件(不幸的是,它非常不一致——这显然不适用于Skype for Business)。

@kolbi理想的解决方案是使用Botframework V4,这里有一种方法类似于您试图实现的,但使用Botframework V4版本编写。这是一篇关于实现这一目标的详细博客文章(发起对话,并主动回复特定对话)

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);

最新更新