向 Teams 中的频道发送主动消息

Dam*_*vic 6 node.js botframework microsoft-teams

所以,

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

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

我探索了源代码,并channelData硬编码到nullinside 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?
});
Run Code Online (Sandbox Code Playgroud)

有没有人用 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();
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Dam*_*vic 5

好的,所以,这就是我让它工作的方式。我把它贴在这里以供将来参考。

免责声明:我仍然不知道如何使用它,botbuilder正如我最初的问题所问的那样,这个答案将使用ConnectorClient,这是可以接受的(至少对我来说)。根据希尔顿的指示和我之前看到的 GitHub 问题( https://github.com/OfficeDev/BotBuilder-MicrosoftTeams/issues/162#issuecomment-434978847),我终于让它工作了。MS 文档没有那么有用,因为它们总是使用context在您的 Bot 响应消息或活动时可用的变量,并且它们在 Bot 运行时在内部保留这些上下文的记录。但是,如果您的 Bot 由于某种原因重新启动,或者您想将数据存储在数据库中以备后用,这就是您要走的路。

所以,代码(NodeJS):

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();
Run Code Online (Sandbox Code Playgroud)

注意:正如希尔顿指出的那样,serviceUrl还需要从您的数据库中加载,以及频道 ID。当您的机器人被添加到团队/频道/组时,您最初收到的活动中可用channelId,您还需要这些活动,并且您需要存储它们以备将来参考(不要像示例中那样对它们进行硬编码)。

因此,没有单独的createConversationsendActivity,一切都在一次调用中。

感谢希尔顿您的时间,以及我手模糊图像 给 MS Docs :)

希望这对其他人有帮助