除少数例外情况外,您实际上不需要更改机器人代码即可部署到 Teams 频道。但是,我确实认为在开发过程中应该注意和考虑一些事情。首先,我假设您已经或知道如何从机器人服务打开频道。完成此操作后,您可以在 Teams 中测试您的机器人,甚至无需创建 Teams 应用,只需将 Microsoft 应用 ID 粘贴到聊天收件人:字段(显然不建议共享此 ID 进行一般测试)。
您可能需要的主要更改是删除提及。这些将与 QnA Maker 和/或 LUIS 混淆,因为它们包含在查询字符串中。我一直在做这个作为 onMessage 处理程序的第一步。我目前的机器人为此使用正则表达式,例如
if (context._activity.text) ( // Make sure there is activity text before trying to replace
context._activity.text = context._activity.text.replace(/(@|<at>)((Bot Name)|(Teams App Manifest Name))(<\/at>)? ?/g, '');
}
但是,我也看到 TurnContext 对象可以通过TurnContext.removeRecipientMention(context.activity);
我自己实际上并没有尝试过来做到这一点。如果它有效,如果您发现自己像我过去所做的那样更改机器人名称,那将非常有帮助......
我对我的机器人所做的另一个主要更改是创建带有菜单按钮的团队特定的自适应卡片。默认情况下,Action.Submit
将适用于 Web 频道,但不适用于 Teams 频道。一个典型的动作看起来像
{
"type": "ActionSet",
"actions": [
{
"type": "Action.Submit",
"title": "Get Order Status",
"data": "Get Order Status"
}
]
}
但是 Teams 无法处理此问题,并且会在单击按钮时出错(至少在使用标准 Activity 处理程序时,不确定使用 Activity 处理程序是否相同TeamsActivityHandler
。)相反,您应该在显示带有Action.Submit
操作的卡片之前检查通道并显示替代方案取而代之的卡。例如
if (context.activity.channelId == 'msteams') {
var welcomeCard = CardHelper.GetMenuCardTeams(welcomeMessage,'Y','Y');
} else {
var welcomeCard = CardHelper.GetMenuCard(welcomeMessage,'Y','Y');
}
然后你对 Teams 的操作看起来像
{
"type": "ActionSet",
"actions": [
{
"type": "Action.Submit",
"title": "Get Order Status",
"data": {
"msteams": {
"type": "imBack",
"value": "Get Order Status"
}
}
}
]
}
我已经尝试将这些结合起来,但效果不佳。您可以向处理程序添加一些内容以使 Teams 卡片在 Web 中工作,但文本不会像典型按钮那样插入到聊天中,而是本质上类似于反向通道事件。我更喜欢这种方法。
除此之外,您应该能够按原样运行您的机器人,但您的单独问题中提到的附件除外。我还没有让它工作,我相信这可能与不使用 TeamsActivityHandler 有关,但我不确定。
希望这会有所帮助。继续尝试,一旦机器人在 Teams 中运行,您就可以针对您面临的任何特定问题创建一个新问题。