所以
我进行了广泛搜索,阅读了关于该主题的所有内容,但我仍然失败了。我已经设法向用户发送了主动消息,在团队中回复了主题,等等。但是我无法在团队频道中发送主动消息(创建新帖子)。
是否有可用的示例(我找不到任何示例)?用于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();
我在做什么错了?
答案 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
一起添加到团队/频道/组中时,会在最初收到的活动中找到它,并且需要将其存储以备将来参考(不要像该示例)。
因此,没有单独的channelId
和createConversation
,都是一次通话。
感谢希尔顿为您提供的时间,以及我的手的模糊图片: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);
,在某些情况下(如果您遇到安全问题,可以尝试一下)。
该-应该-满足您的需求,因此请尝试一下,如果您仍然遇到困难,请告诉我。