我使用Microsoft Bot Framework v4 Nodejs SDK(适用于nodejs的botbuilder-sdk)为Microsoft Teams开发了一个机器人。我们以以下方式实现了该机器人:当我们使用来自其中一个CRM的REST API调用接收数据时,该数据将发布到Microsoft Teams的渠道中。但是,当我这样做时,我们不会在设备上收到通知。有人遇到过这样的问题吗?
我最初保存上下文状态。每次我们从CRM接收数据时,我都会增加消息的活动ID(将其作为新消息而不是答复发送),并使用context.sendActivity()将其发送给Microsoft Teams。
当我们收到该自适应卡时,我们不会在活动供稿或任何设备上收到通知。
如上所述,我已经完成了所有步骤。我还完成了故障排除步骤。但是,它仍然没有通知我该卡。但是,当我与机器人进行对话时,当机器人响应时会收到通知。
https://i.stack.imgur.com/Bi4fc.png
https://i.stack.imgur.com/ab6uP.png
在此图中,当我启动TMS Bot时会收到通知!信息。但是,接下来的两条消息我都没有收到通知。
答案 0 :(得分:1)
编辑:OP和我交换了一些电子邮件以得到答复。总体而言,此答案是完成Teams Proactive消息传递的良好信息,但主要答案在最后一节“简化代码”中。
这是一个很长的答案,涉及很多领域,仅仅是因为我不确定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的Teams Extension,目前处于Beta版,但似乎可以满足您的需要。我相信您在使用上述方法时未收到通知的原因是,您的漫游器正在频道中创建新的回复链,而不是直接回复用户。我相信您无需扩展即可完成所有这些操作(通过手动编辑活动/上下文属性),但是扩展应使其更容易。
这是我用来在频道内获取工作通知的代码:
在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或完全没有使用Teams Extension。下面的代码是我如何从模拟器发送消息,然后可以将消息发送到不同的Teams频道的
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:8d60061c3d104exxxxxxxxxxxxxxxxxx@thread.skype';
break;
case '2':
teamsChannel = '19:0e477430ebad4exxxxxxxxxxxxxxxxxx@thread.skype';
break;
case '3':
teamsChannel = '19:55c1c5fb0d304exxxxxxxxxxxxxxxxx0@thread.skype';
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);
}
注意:要接收通知,您和您的用户必须跟随该频道。
答案 1 :(得分:0)
如上所述,我已经完成了所有步骤。我还完成了故障排除步骤。但是,它仍然没有通知我该卡。但是,当我与机器人进行对话时,当机器人响应时会收到通知。
https://i.stack.imgur.com/Bi4fc.png
https://i.stack.imgur.com/ab6uP.png
在此图中,当我启动TMS Bot时会收到通知!信息。但是,接下来的两条消息我都没有收到通知。