将主动消息发送到团队中的频道

时间:2020-03-22 15:54:02

标签: node.js botframework microsoft-teams

所以

我进行了广泛搜索,阅读了关于该主题的所有内容,但我仍然失败了。我已经设法向用户发送了主动消息,在团队中回复了主题,等等。但是我无法在团队频道中发送主动消息(创建新帖子)。

是否有可用的示例(我找不到任何示例)?用于NodeJS的MS Docs似乎显示了一个向团队中的每个用户发送消息的示例,而不是渠道本身的消息。

我探究了源代码,并将channelData硬编码到null内的botFrameworkAdapter.js中,这只会增加混乱。

因此,基本代码是:

const builder = require('botbuilder');
const adapter = new builder.BotFrameworkAdapter({
    appId: 'XXX',
    appPassword: 'YYY'
});

const conversation = {
  channelData: {
    //I have all this (saved from event when bot joined the Team)
  },
  ...
  // WHAT THIS OBJECT NEEDS TO BE TO SEND A SIMPLE "HELLO" TO A CHANNEL?
  // I have all the d
};

adapter.createConversation(conversation, async (turnContext) => {
  turnContext.sendActivity('HELLO'); //This may or may not be needed?
});

有人用Node完成此操作吗?如果是这样,谁能给我展示一个有效的示例(带有正确构造的conversation对象)?

*编辑*

正如希尔顿在以下答案中所建议的那样,我尝试直接使用ConnectorClient,但返回的资源不可用(/v3/conversations

这是我正在使用的代码(实际上只是为了发送演示消息而已):

const path = require('path');
const { ConnectorClient, MicrosoftAppCredentials } = require('botframework-connector');

const ENV_FILE = path.join(__dirname, '.env');
require('dotenv').config({ path: ENV_FILE });

const serviceUrl = 'https://smba.trafficmanager.net/emea/';

async function sendToChannel() {
    MicrosoftAppCredentials.trustServiceUrl(serviceUrl);

    var credentials = new MicrosoftAppCredentials(process.env.MicrosoftAppId, process.env.MicrosoftAppPassword);
    var client = new ConnectorClient(credentials, { baseUri: serviceUrl });

    var conversationResponse = await client.conversations.createConversation({
        bot: {
            id: process.env.MicrosoftAppId,
            name: process.env.BotName
        },
        isGroup: true,
        conversationType: "channel",
        id: "19:XXX@thread.tacv2"
    });

    var acivityResponse = await client.conversations.sendToConversation(conversationResponse.id, {
        type: 'message',
        from: { id: process.env.MicrosoftAppId },
        text: 'This a message from Bot Connector Client (NodeJS)'
    });

}

sendToChannel();

我在做什么错了?

2 个答案:

答案 0 :(得分:3)

好的,这就是我的工作方式。我将其张贴在这里以供将来参考。

免责声明 :我仍然不知道如何与最初问题中所问的botbuilder一起使用,该答案将使用{ {1}},这是可以接受的(至少对我而言)。根据希尔顿的指示和我先前看到的GitHub问题(https://github.com/OfficeDev/BotBuilder-MicrosoftTeams/issues/162#issuecomment-434978847),我终于使它工作了。 MS Documentation并不是很有帮助,因为它们始终使用ConnectorClient变量,该变量在Bot响应消息或活动时可用,并且在Bot运行时会在内部保留这些上下文的记录。但是,如果您的Bot由于某种原因而重新启动,或者您想要将数据存储在数据库中以供以后使用,则可以采用这种方式。

因此,代码(NodeJS):

context

注意 :正如希尔顿指出,const path = require('path'); const { ConnectorClient, MicrosoftAppCredentials } = require('botframework-connector'); const ENV_FILE = path.join(__dirname, '.env'); require('dotenv').config({ path: ENV_FILE }); const serviceUrl = 'https://smba.trafficmanager.net/emea/'; async function sendToChannel() { MicrosoftAppCredentials.trustServiceUrl(serviceUrl); var credentials = new MicrosoftAppCredentials(process.env.MicrosoftAppId, process.env.MicrosoftAppPassword); var client = new ConnectorClient(credentials, { baseUri: serviceUrl }); var conversationResponse = await client.conversations.createConversation({ bot: { id: process.env.MicrosoftAppId, name: process.env.BotName }, isGroup: true, conversationType: "channel", channelData: { channel: { id: "19:XXX@thread.tacv2" } }, activity: { type: 'message', text: 'This a message from Bot Connector Client (NodeJS)' } }); } sendToChannel(); 还需要从您的数据库中加载,以及频道ID。当您将Bot与serviceUrl一起添加到团队/频道/组中时,会在最初收到的活动中找到它,并且需要将其存储以备将来参考(不要像该示例)。

因此,没有单独的channelIdcreateConversation,都是一次通话。

感谢希尔顿为您提供的时间,以及我的手的模糊图片:MS Docs:)

希望这对其他人有帮助

答案 1 :(得分:1)

(我要替换以前的答案,因为我认为这更适合这种情况)。

我已经对此进行了更多研究,并进行了Fiddler跟踪,以使您得到更完整的答案。我不是Node专家,所以我不确定这是否会翻译 100%,但让我们看看。

基本上,您想发送到以下端点: https://smba.trafficmanager.net/emea/v3/conversations/19:[RestOfYourChannelId]/activities

,您将发布如下消息:

{
  "type": "message",
  "from": {
    "id": "28:[rest of bot user id]",
    "name": "[bot name]"
  },
  "conversation": {
    "isGroup": true,
    "conversationType": "channel",
    "id": "19:[RestOfYourChannelId]"
  },
  "text": "Test Message"
}

但是,要发布到该端点,您需要对其进行正确的身份验证。可以做到这一点,并直接与端点进行通信,但是使用内置机制实际上更容易。这意味着在第一次将漫游器安装到通道时获取并存储对话参考。 This file显示了如何执行此操作(在this.onConversationUpdate函数中查看它如何获取和存储talkingReference)。在同一样本中的另一个文件中,它显示了如何使用会话引用来实际发送主动消息-请参阅here,其中它使用adapter.continueConversation

Microsoft机器人团队的一名成员也在here上以类似的详细方式显示了这一点。他还添加了MicrosoftAppCredentials.trustServiceUrl(ref.serviceUrl);,在某些情况下(如果您遇到安全问题,可以尝试一下)。

该-应该-满足您的需求,因此请尝试一下,如果您仍然遇到困难,请告诉我。