如何让我的机器人将消息发布到Microsoft Teams频道?

and*_*ies 5 node.js botframework microsoft-teams

我有一个与docs quickstart中演示的机器人相同的机器人。无论用户说什么(现在),它都会重复执行。

它当前在本地运行,并通过ngrok公开。我已经在Microsoft Bot Framework中注册了该机器人。

我已经在Microsoft Bot Framework中配置了Microsoft Teams频道,并且已经将我的机器人加载到了Teams中。我的机器人可以接收来自 Teams用户的消息。

目前,该机器人只是将收到的所有内容重复发送给用户,但我要执行的操作是发布到Microsoft Teams频道。我希望它发布到Teams频道- 而不是用户 -无需用户首先提示。因此,例如,在给定特定条件(例如,由某些事件(例如一天中的时间,提取请求等)触发)的情况下,它将在通道中发布消息。

我已经阅读了有关发送主动消息的文档,并且为了将消息发送到团队通道,我收集了该机器人需要知道用户的“地址”。此信息存储在session.message.address对象中,并从当前对话中获取该信息。但是,就我而言,我没有“当前保留”功能,因为我不想只回应用户,所以我想主动发布在频道中。

那么,如何为团队频道永久设置必要的凭据/地址/会话数据?

我调查过的事情:

  • Webhooks。我已经在Teams频道中配置了一个Webhook,并且可以使用轻松地(使用webhook网址)向其发送消息curl。因此,我可以向团队频道发送一条简单的消息,其中仅包含一个网址(无需身份验证),但是我不确定如何将该网址发送到我的机器人中。

  • 我们如何在Microsoft Bot Framework中为不同的用户维护不同的会话?我不确定这里的答案是否能回答我的问题。我的问题是,机器人正在发起“对话”,而不是Teams用户,因此我需要能够自己设置会话数据,以便机器人知道要去哪里。

App.js:

require('dotenv').config();
var restify = require('restify');
var builder = require('botbuilder');

// Setup Restify Server
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
   console.log('%s listening to %s', server.name, server.url); 
});

// Create chat connector for communicating with the Bot Framework Service
var connector = new builder.ChatConnector({
    appId: process.env.MICROSOFT_APP_ID,
    appPassword: process.env.MICROSOFT_APP_PASSWORD    
});

// Listen for messages from users 
server.post('/api/messages', connector.listen());

// Receive messages from the user and respond by echoing each message back (prefixed with 'You said:')
var bot = new builder.UniversalBot(connector, function (session) {
    session.send("You said: %s", session.message.text);
});
Run Code Online (Sandbox Code Playgroud)

小智 5

对于任何想为c#做到这一点的人,以下是对我有用的解决方案:

    var channelData = context.Activity.GetChannelData<TeamsChannelData>();
    var message = Activity.CreateMessageActivity();
    message.Text = "Hello World";

    var conversationParameters = new ConversationParameters
    {
         IsGroup = true,
         ChannelData = new TeamsChannelData
          {
             Channel = new ChannelInfo(channelData.Channel.Id),
         },
         Activity = (Activity) message
    };

    var connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl));
    var response = await 
    connectorClient.Conversations.CreateConversationAsync(conversationParameters);
Run Code Online (Sandbox Code Playgroud)

注意:如果要在Bot的控制器代码之外调用此代码,则需要在serviceUrl上调用TrustServiceUrl,如下所示:

    MicrosoftAppCredentials.TrustServiceUrl(serviceUrl, DateTime.MaxValue);
    var connectorClient = new ConnectorClient(new Uri(serviceUrl));
Run Code Online (Sandbox Code Playgroud)

答案来源:https : //github.com/OfficeDev/BotBuilder-MicrosoftTeams/issues/162


Bil*_*SFT 2

这绝对是可能的。我们将这些称为主动消息,并且可以主动向用户和渠道发送消息。

\n\n

对于后者,请参阅https://github.com/OfficeDev/microsoft-teams-sample-complete-node上的示例,特别是此文件ProactiveMsgToChannelDialog.ts

\n\n

要将主动消息发送到渠道,您需要使用 Microsoft Teams SDK(如这些示例所示)。

\n\n

最后但并非最不重要的一点是,您需要将机器人添加到团队中,以便向团队中的某个频道发送消息,这需要清单。

\n

  • @BillBliss-MSFT 这个答案看起来像是对用户发送的消息做出反应,而不是真正主动。例如,在步骤 1 中,您需要一个会话,并且要为其提供消息 (!isMessageFromChannel(session.message)),步骤 2 也需要一个会话。安迪的问题是如何从某些非消息传递事件触发:“(例如,由某些事件触发,例如一天中的时间、拉取请求等)它在频道中发布消息”。那可能吗? (2认同)