我使用Microsoft Bot Framework v4 Nodejs SDK(用于nodejs的botbuilder-sdk)为Microsoft Teams开发了一个bot。我们以这样一种方式实现了机器人:当我们使用来自我们的一个CRM的REST API调用接收数据时,数据将被发布到Microsoft Teams上的频道。但是,当我这样做时,我们不会在设备上收到通知。有人遇到过这样的问题吗?
我最初保存上下文状态。每次我们从CRM接收数据时,我都会增加消息的活动ID(将其作为新消息发送而不是回复)并使用context.sendActivity()将其发送给Microsoft团队。
当我们收到该自适应卡时,我们不会在活动源或任何设备上收到通知。
我已经完成了你上面描述的所有步骤。我也经历了故障排除步骤。但是,它仍然没有给我卡的通知。但是,当我发起与机器人的对话时,我会在机器人响应时收到通知。
https://i.stack.imgur.com/Bi4fc.png
https://i.stack.imgur.com/ab6uP.png
在这张图片中,当我开始使用TMS Bot时,我会收到通知!信息。但是,我没有收到下两条消息的通知。
编辑:OP和我已经交换了几封电子邮件以获得答案。总的来说,这个答案是完成团队主动消息传递的好信息,但主要答案在最后一节简化代码中。
这是一个很长的答案,涵盖了很多领域,仅仅因为我不是100%确定我知道你没有收到什么样的通知。
如果您已按照上面链接的“问题排查指南”进行操作,则您的用户应接收聊天通知如果没有,您可以尝试更新MS Teams桌面或移动客户端。正如@KyleDelaney所说,@
提及用户和/或频道可能会有所帮助
你也可以create Activity Feed Notifications。它的要点是你需要:
text
和summary
channelData
设置为true的notifications.alert
这段代码将实现:
const msg = MessageFactory.text('my message');
msg.summary = 'my summary';
msg.channelData = {
notification: {
alert: true,
},
};
return await dc.context.sendActivity(msg);
结果:
注意:如果您的机器人只创建通知但没有对话,您可以从creating a notifications-only bot中受益。
import * as adaptiveCard from '../src/adaptiveCard.json';
...
const card = CardFactory.adaptiveCard(adaptiveCard);
const activity = {
attachments: [card],
text: 'Test Card',
summary: 'my summary',
channelData: {
notification: {
alert: true,
},
},
};
await turnContext.sendActivity(activity);
结果:
BobBuilder V4的团队扩展目前处于测试阶段,但似乎可以满足您的需求。我相信你在使用上述内容时没有收到通知的原因是因为你的机器人正在通道中创建一个新的回复链而不是直接回复给用户。我相信你可以在没有扩展的情况下完成所有这些工作(通过手动编辑活动/上下文属性),但扩展应该更容易。
这是我用来在频道中获取工作通知的代码:
在index.js
(或app.js
):
import * as teams from 'botbuilder-teams';
[...]
// Change existing to use "new teams.TeamsAdapter..."
const adapter = new teams.TeamsAdapter({
appId: endpointConfig.appId || process.env.microsoftAppID,
appPassword: endpointConfig.appPassword || process.env.microsoftAppPassword,
});
无论您在何处发送消息:
import * as teams from 'botbuilder-teams';
import * as adaptiveCard from '../src/adaptiveCard.json';
...
const card = CardFactory.adaptiveCard(adaptiveCard);
const activity = {
attachments: [card],
text: 'Test Card',
summary: 'my summary',
channelData: {
notification: {
alert: true,
},
},
};
const adapter = context.adapter as teams.TeamsAdapter;
await adapter.createReplyChain(context, [activity]);
我和OP之间来回发送过电子邮件,关键问题是他需要从下面添加trustServiceUrl
代码。通常情况下,这会出现500错误,但在这种情况下,它似乎不会创建通知。经过重大测试后,您需要做的就是向不同的渠道发送不同的通知。它基本上相当于设置turncontext.activity的几个属性并信任serviceUrl。根本没有触摸活动ID或使用团队扩展。我的下面的代码是我如何从模拟器发送消息然后将卡发送到不同的团队频道:
public onTurn = async (turnContext: TurnContext) => {
const dc = await this.dialogs.createContext(turnContext);
const dialogResult = await dc.continueDialog();
// Route message from Emulator to Teams Channel - I can send "1", "2", or "3" in emulator and bot will create message for Channel
let teamsChannel;
switch (turnContext.activity.text) {
// You can get teamsChannel IDs from turnContext.activity.channelData.channel.id
case '1':
teamsChannel = '19:[email protected]';
break;
case '2':
teamsChannel = '19:[email protected]';
break;
case '3':
teamsChannel = '19:[email protected]';
break;
default:
break;
}
if (teamsChannel) {
const card = CardFactory.adaptiveCard(adaptiveCard);
const activity = {
attachments: [card],
summary: 'my summary',
text: 'Test Card',
};
const serviceUrl = 'https://smba.trafficmanager.net/amer/';
turnContext.activity.conversation.id = teamsChannel;
turnContext.activity.serviceUrl = serviceUrl;
// This ensures that your bot can send to Teams
MicrosoftAppCredentials.trustServiceUrl(serviceUrl);
await turnContext.sendActivity(activity);
} else {
[...Normal onTurn Code...]
await this.conversationState.saveChanges(turnContext);
}
注意:要接收通知,您和您的用户必须遵循该频道。
我已经完成了你上面描述的所有步骤。我也经历了故障排除步骤。但是,它仍然没有给我卡的通知。但是,当我发起与机器人的对话时,我会在机器人响应时收到通知。
https://i.stack.imgur.com/Bi4fc.png
https://i.stack.imgur.com/ab6uP.png
在这张图片中,当我开始使用TMS Bot时,我会收到通知!信息。但是,我没有收到下两条消息的通知。