Teams 中的主动消息传递机器人,无需事先提及机器人

Proactive messaging bot in Teams without mentioning the bot beforehand

我正在使用 Microsoft 机器人框架创建机器人并将其集成到团队中。 机器人的部分要求包括每天主动向用户发送一次消息。据我了解,我只能向机器人后添加到 team/groupChat 的用户发送消息,或者直接向机器人发送消息。 我的问题是——我能以某种方式绕过这个限制吗? 我的一个朋友向我介绍了 graphAPI 的一项新功能,作为新测试版的一部分 - https://docs.microsoft.com/en-us/graph/api/user-add-teamsappinstallation?view=graph-rest-beta&tabs=http.

对我来说,它似乎与解决方案无关,因为我没有在响应中返回任何数据,所以如果我没有 conversationReference 对象,我仍然无法向用户发送消息。

目前我的解决方案是在添加消息时简单地在频道中广播一条消息,要求用户通过发送消息来"register"。有人有其他建议吗?

编辑:仅当您希望主动向不在安装机器人的 channel/groupChat 中的用户发送消息时,才需要您引用的图表 API。如果您只需要主动向已安装机器人的人发送消息,mdrichardson 的回答是最简单的方法。

我们发现了您引用的 Graph API beta 端点的几个问题,这些问题应在短期内解决。同时解决方法如下:

通话中:

POST https://graph.microsoft.com/beta/me/teamwork/installedApps/
  {"teamsapp@odata.bind":"https://graph.microsoft.com/beta/appcatalogs/teamsapps/APP-GUID"} 
  • 将在用户的个人范围内安装应用程序。
  • 已知问题:目前,如果应用程序包含机器人,则安装不会导致在机器人和用户之间创建线程。但是,为确保创建任何丢失的聊天线程,请调用:

    GET https://graph.microsoft.com/beta/me/chats?$filter=installedApps/any(x:x/teamsApp/id eq 'APP-GUID')

通话中:

GET https://graph.microsoft.com/beta/me/chats?$filter=installedApps/any(x:x/teamsApp/id eq 'APP-GUID')
  • 获取用户与包含机器人的应用程序之间的聊天。
  • 已知问题:调用此 API 将导致向机器人发送对话更新事件,即使对话没有更新。您的机器人基本上会获得两个安装事件,您需要确保您不会发送两次欢迎消息。

我们还将使用这些图表 APIs

为主动消息流添加更详细的文档

最简单的方法是:

  1. 为团队安装机器人
  2. -- 第 3 步中的 link 有另一种方法可以向底部执行此操作

那些 link 中有很多代码,与其在这里 copy/paste 相比,直接访问它们更好。

步骤 3 的末尾还提到了 trustServiceUrl,如果您在尝试发送主动消息时 运行 遇到 permissions/auth 问题,您可能会发现它很方便。


为节点编辑:

安装必要的包

npm i -S npm install botbuilder-teams@4.0.0-beta1 botframework-connector

注意:@<version>很重要!

准备适配器

index.js

const teams = require('botbuilder-teams');

adapter.use(new teams.TeamsMiddleware());

获取花名册

// Get Team Roster
const credentials = new MicrosoftAppCredentials(process.env.MicrosoftAppId, process.env.MicrosoftAppPassword);
const connector = new ConnectorClient(credentials, { baseUri: context.activity.serviceUrl });
const roster = await connector.conversations.getConversationMembers(context.activity.conversation.id);

发送主动消息

const { TeamsContext } = require('botbuilder-teams');

// Send Proactive Message
const teamsCtx = TeamsContext.from(context);
const parameters = {
    members: [
        roster[0] // Replace with appropriate user
    ],
    channelData: {
        tenant: {
            id: teamsCtx.tenant.id
        }
    }
};
const conversationResource = await connector.conversations.createConversation(parameters);
const message = MessageFactory.text('This is a proactive message');
await connector.conversations.sendToConversation(conversationResource.id, message);

Trust the ServiceUrl, as Necessary

了解一下。在消息发送之前你会想要这个。

MicrosoftAppCredentials.trustServiceUrl(context.activity.serviceUrl);