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

时间:2019-08-14 14:05:54

标签: node.js botframework microsoft-graph microsoft-teams

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

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

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

2 个答案:

答案 0 :(得分:6)

最简单的方法是:

  1. 为团队安装机器人
  2. Query the Team Roster-步骤3中的链接提供了另一种方法来实现此目的
  3. Create a conversation with the user and send a proactive message

这些链接中有很多代码,最好只访问它们而不是在此处复制/粘贴它们。

第3步末尾还提到了trustServiceUrl,如果您在尝试发送主动消息时遇到权限/身份验证问题,可能会很方便。


编辑节点:

安装必要的软件包

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);

答案 1 :(得分:1)

编辑:仅当您希望主动向不在机器人所在的channel / groupChat中的用户发送消息时,才需要使用您引用的Graph API。如果您只需要主动向已经安装了bot的人发送消息,那么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"} 
  • 将在用户的个人范围内安装应用。
  • 已知问题:当前,如果应用程序包含机器人,则安装将不会导致在机器人与用户之间创建线程。但是,要确保创建任何缺少的聊天线程,请致电:

    获取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也会导致将对话更新事件发送给机器人。您的机器人实际上将获得两个安装事件,并且需要确保您不会两次发送欢迎消息。

我们还将使用这些Graph API为主动消息传递流添加更详细的文档