当漫游器在团队中发送消息时,我如何获得通知?

时间:2019-02-19 15:46:15

标签: node.js notifications botframework microsoft-teams azure-bot-service

我使用Microsoft Bot Framework v4 Nodejs SDK(适用于nodejs的botbuilder-sdk)为Microsoft Teams开发了一个机器人。我们以以下方式实现了该机器人:当我们使用来自其中一个CRM的REST API调用接收数据时,该数据将发布到Microsoft Teams的渠道中。但是,当我这样做时,我们不会在设备上收到通知。有人遇到过这样的问题吗?

我最初保存上下文状态。每次我们从CRM接收数据时,我都会增加消息的活动ID(将其作为新消息而不是答复发送),并使用context.sendActivity()将其发送给Microsoft Teams。

enter image description here

当我们收到该自适应卡时,我们不会在活动供稿或任何设备上收到通知。

如上所述,我已经完成了所有步骤。我还完成了故障排除步骤。但是,它仍然没有通知我该卡。但是,当我与机器人进行对话时,当机器人响应时会收到通知。

https://i.stack.imgur.com/Bi4fc.png

https://i.stack.imgur.com/ab6uP.png

在此图中,当我启动TMS Bot时会收到通知!信息。但是,接下来的两条消息我都没有收到通知。

2 个答案:

答案 0 :(得分:1)

编辑:OP和我交换了一些电子邮件以得到答复。总体而言,此答案是完成Teams Proactive消息传递的良好信息,但主要答案在最后一节“简化代码”中。

这是一个很长的答案,涉及很多领域,仅仅是因为我不确定100%是否知道您没有收到哪种通知。

问题排查

  • Troubleshooting Guide
    • 特别注意需要启用通知的许多区域
      • 尤其是,用户可能需要“关注”和/或“收藏”频道以从中接收通知
  • 如果用户打开了桌面应用程序,则他们将在那里收到通知,除非他们在桌面应用程序上处于非活动状态超过3分钟,否则不会在手机上收到通知。否则,很可能是团队中的错误。

聊天通知

如果您遵循上面链接的《故障排除指南》,则您的用户应该会收到聊天通知。如果没有,您可以尝试更新您的MS Teams桌面或移动客户端。正如@KyleDelaney提到的那样,@提及用户和/或渠道可能会有所帮助

活动Feed通知

您也可以create Activity Feed Notifications。要点是您需要:

  1. 在邮件中包含textsummary
  2. 包含将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);

结果:

enter image description here enter image description here

注意:如果仅漫游器 创建通知且没有对话,则您可能会受益于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);

结果:

enter image description here enter image description here

使用Teams Extension

有一个适用于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时会收到通知!信息。但是,接下来的两条消息我都没有收到通知。