Node.js 如何让我的机器人向Microsoft Team频道发布消息?

Node.js 如何让我的机器人向Microsoft Team频道发布消息?,node.js,botframework,microsoft-teams,Node.js,Botframework,Microsoft Teams,我有一个机器人,它与中演示的机器人相同。它会重复用户所说的任何内容(目前) 它目前正在本地运行,并与ngrok一起公开。我已在Microsoft bot框架中注册了bot 我已经在MicrosoftBot框架中配置了MicrosoftTeams频道,并且已经将我的Bot侧向加载到了团队中。我的机器人可以接收来自团队用户的消息 目前,bot只会将收到的内容重复给用户,但我希望它做的是发布到Microsoft Team频道。我希望它在没有用户提示的情况下发布到团队频道-而不是用户。例如,给定某个条件

我有一个机器人,它与中演示的机器人相同。它会重复用户所说的任何内容(目前)

它目前正在本地运行,并与ngrok一起公开。我已在Microsoft bot框架中注册了bot

我已经在MicrosoftBot框架中配置了MicrosoftTeams频道,并且已经将我的Bot侧向加载到了团队中。我的机器人可以接收来自团队用户的消息

目前,bot只会将收到的内容重复给用户,但我希望它做的是发布到Microsoft Team频道。我希望它在没有用户提示的情况下发布到团队频道-而不是用户。例如,给定某个条件(例如,由某个事件触发,如一天中的某个时间、拉取请求等),它会在通道中发布消息

我已经阅读了有关的文档,我收集到为了向团队频道发送消息,bot需要知道用户的“地址”。此信息存储在
会话.message.address
对象中,它从当前会话中获取此信息。然而,在我的例子中,我没有“当前保护”,因为我不想只回复用户,我想主动发布在一个频道中

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

我调查过的事情:
  • 网络钩子。我已经在我的团队频道中配置了一个webhook,我可以使用
    curl
    很容易地向它发送消息(使用webhook url)。因此,我可以向团队频道发送一条简单的消息,只需一个url(无需验证),但我不确定如何将此url导入我的机器人

  • 我不确定这里的答案是否回答了我的问题。我的问题是,机器人正在启动“对话”,而不是团队用户,因此我需要能够自己设置会话数据,以便机器人知道去哪里

App.js:
这绝对是可能的。我们称之为主动消息,可以主动向用户和渠道发送消息

对于后者,请参见处的示例,特别是此文件

要向频道发送主动消息,您需要使用Microsoft Team SDK(与这些示例一样)


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

希望这对您有用。。下面的代码在启动聊天之前主动将消息发送到会话

 bot.on('conversationUpdate', function (message) {  
       if (message.membersAdded[0].id === message.address.bot.id) {             
             var reply = new builder.Message()    
                   .address(message.address)               
                   .text("Hello"");        
             bot.send(reply);    
       }
    }); 

对于任何想知道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);

答案来源:

谢谢比尔。所以我推测我在
src/utils/DialogIds.ts
(proactivemsgtochanneldialoggid)中设置了通道的“地址/id”?在MS团队中我在哪里可以找到此ID?它与
src/utils/DialogIds.ts
无关。在
proactivemsgtochanneldialgid
中,逻辑是用户键入频道名称,然后调用
teamsChatConnector.fetchChannelList
来迭代团队的频道列表,并找到名称与用户类型匹配的频道(如果有)然后使用其ID发布到该通道。查看
proactivemsgtochanneldialgid
中回调函数的逻辑,特别是第38-74行。其中一个参数是
result
,它是一个通道对象数组,包括
.id
.name
-
.id
是您想要的。@andydavies您能让这个工作吗?我也在尝试做类似的事情。@Haymak3r不,我没有管理好它,然后我被转移到了其他事情上(这是一项工作任务)。但如果答案对你有效,请让我知道,我会接受它为“已回答”。或者,如果您以另一种方式管理它,请将其放在这里,我会将其标记为已接受。@BillBliss MSFT此答案看起来像是对用户发送的消息的反应,而不是真正的主动。例如,在步骤1中,您需要一个会话,并且为了使会话具有消息(!isMessageFromChannel(session.message)),步骤2还需要一个会话。Andy的问题是如何从一些非消息事件中触发:“(例如,由某个事件触发,如一天中的某个时间、拉取请求等),它在一个频道中发布消息”。有可能吗?iGroup的作用是什么?我已经尝试删除它,它的工作如预期。我下面的github链接,但无法找到如何获得渠道信息,如ID等?我知道如何获取传入的Web钩子URL,这在这里是不相关的;var id=channelData.Channel.id;
    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);
    MicrosoftAppCredentials.TrustServiceUrl(serviceUrl, DateTime.MaxValue);
    var connectorClient = new ConnectorClient(new Uri(serviceUrl));