node.js - 如何让我的机器人向 Microsoft Teams channel 发布消息?

标签 node.js botframework microsoft-teams

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

它目前在本地运行并通过 ngrok 公开。我已使用 Microsoft Bot Framework 注册了该机器人。

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

目前,机器人只是将它收到的任何内容重复给用户,但我想要它做的是发布到 Microsoft Teams channel 。我希望它发布到 Teams channel - 不是用户 - 无需用户先提示。因此,例如给定特定条件(例如,由一天中的某个时间、拉取请求等事件触发),它会在 channel 中发布消息。

我已阅读有关 sending proactive messages 的文档,我收集到,为了向团队 channel 发送消息,机器人需要知道用户的“地址”。此信息存储在 session.message.address 对象中,并从当前对话中获取。但是,就我而言,我没有“电流保护”,因为我不想只响应用户,我想主动在 channel 中发帖。

那么,如何为 Teams channel 永久设置必要的凭据/地址/ session 数据?

我调查过的事情:

  • 网络 Hook 。我在我的 Teams channel 中配置了一个 webhook,我可以使用 curl 轻松地向它发送消息(使用 webhook url)。因此,我可以向 Teams channel 发送一条仅包含 URL 的简单消息(无需身份验证),但我不确定如何将此 URL 放入我的机器人中。

  • How do we maintain different session for different users in Microsoft Bot Framework?我不确定这里的答案是否回答了我的问题。我的问题是机器人正在发起“对话”,而不是 Teams 用户,因此我需要能够自己设置 session 数据,以便机器人知道去哪里。

应用程序.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);
});

最佳答案

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

注意:如果您在 Bot 的 Controller 代码之外调用它,那么您需要在 serviceUrl 上调用 TrustServiceUrl,如下所示:

    MicrosoftAppCredentials.TrustServiceUrl(serviceUrl, DateTime.MaxValue);
    var connectorClient = new ConnectorClient(new Uri(serviceUrl));

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

关于node.js - 如何让我的机器人向 Microsoft Teams channel 发布消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47458405/

相关文章:

c# - Bot 在 MS TEAMS channel 中尝试发送自适应卡时抛出 "Operation returned an invalid status code ' RequestEntityTooLarge'”异常

javascript - 重复ChoicePrompt清除UserState

azure-pipelines - MS Teams 无法订阅“构建完成”- 出现问题,请稍后重试

microsoft-teams - 为什么 Microsoft Teams 中自适应卡片的宽度会水平挤压消息

botframework - 从外部服务关闭团队消息传递扩展模式

node.js - Bower 在 Azure 部署上失败

node.js - 在后台执行某些操作并在完成时通知用户

c# - 从消息 Controller c# 访问对话数据

node.js - 源代码控制集成 - 只读文件 - 无法编译?

javascript - Node js 的 npm 操纵杆问题