node.js - 当机器人在 Teams 中发送消息时,如何收到通知?

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

我使用 Microsoft Bot Framework v4 Nodejs SDK(botbuilder-sdk for nodejs)为 Microsoft Teams 开发了一个机器人。我们以这样一种方式实现机器人:当我们使用 REST API 调用从我们的某个 CRM 接收数据时,数据会发布到 Microsoft Teams 上的 channel 。但是,当我这样做时,我们没有在设备上收到通知。有人遇到过这样的问题吗?

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

enter image description here

当我们收到该自适应卡片时,我们不会在事件源或任何设备上收到通知。

我已经完成了您上面描述的所有步骤。我还完成了故障排除步骤。但是,它仍然没有给我发卡的通知。但是,当我发起与机器人的对话时,我会在机器人响应时收到通知。

/image/Bi4fc.png

/image/ab6uP.png

在此图片中,当我启动 TMS 机器人时,我收到一条通知!信息。但是,我没有收到接下来两条消息的通知。

最佳答案

编辑:OP 和我交换了几封电子邮件来得到这个答案。一般来说,这个答案对于完成 Teams Proactive 消息传递来说是很好的信息,但主要答案在最后一节“简化代码”中。

这是一个很长的答案,涵盖了很多领域,只是因为我不能 100% 确定我知道您没有收到哪种通知。

疑难解答

  • Troubleshooting Guide
    • 特别注意许多需要启用通知的区域
      • 特别是,用户可能需要“关注”和/或“收藏”该 channel 才能接收来自该 channel 的通知
  • 如果用户打开了桌面应用,他们将在其中收到通知,并且不会在手机上收到通知,除非他们在桌面应用上处于非事件状态超过 3 分钟。否则,这可能是 Teams 中的错误。

聊天通知

如果您已按照上面链接的问题排查指南进行操作,您的用户应该会收到聊天通知。如果没有,您可以尝试更新您的 MS Teams 桌面或移动客户端。正如 @KyleDelaney 提到的,@ 提及用户和/或 channel 可能会有所帮助

事件源通知

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

  1. 在消息中包含文本摘要
  2. 包含将 notifications.alert 设置为 true 的 channelData

这段代码将实现这一点:

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 扩展目前处于测试阶段,但似乎可以满足您的需求。我相信您在使用上述内容时没有收到通知的原因是您的机器人正在 channel 中创建新的回复链,而不是直接回复用户。我相信您可以在没有扩展的情况下完成所有这些操作(通过手动编辑事件/上下文属性),但扩展应该会让这一切变得更容易。

这是我用来在 channel 内获取工作通知的代码:

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 错误,但在这种情况下,它似乎不会创建通知。经过大量测试后,您真正需要做的就是将不同的通知发送到不同的 channel 。它基本上相当于设置turncontext.activity 的几个属性并信任serviceUrl。根本不接触事件 ID 或使用 Teams 扩展。下面的代码是我如何从模拟器发送消息,然后将卡片发送到不同的团队 channel :

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

注意:要接收通知,您和您的用户必须关注该 channel 。

关于node.js - 当机器人在 Teams 中发送消息时,如何收到通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54770102/

相关文章:

node.js - 设计模式 : Combining http requests with pluggable Redis caching mechanism

linux - 在 Ubuntu 12.04 中编译使用 glew 库的项目时出错

service - 安卓穿戴: Listen to incoming notifications

c# - 你如何在消息事件异步中检测事件对话框

node.js - req.session 没有方法 'touch' ?

node.js - Sendgrid在nodejs中发送邮件403响应禁止错误

用于订阅/发布 MQTT(真正的小型消息代理)的 C# 客户端库

Javascript 通知解决方案库 : desktop, 可听、弹出、标题栏闪烁等

c# - 将机器人框架 Luis 与 QnA 作为 Intent 集成,然后在进入 QnA 后重新询问用户

c# - 通过覆盖 MessageReceived 在 LuisDialog 中自动翻译消息