Bot Framework v4-Bot发起对话

时间:2019-03-05 16:55:55

标签: botframework microsoft-teams

我正在使用Bot Framework SDK v4 for NodeJS为Microsoft Teams开发一个机器人。机器人可以自动在频道中发起对话,而不是由用户发起对话吗?当用户发起对话时,我的机器人可以正常工作。关于如何进行此操作的任何建议?

4 个答案:

答案 0 :(得分:0)

MS团队称其为“主动消息”(注意:Bot Framework通常将“主动消息”定义为向用户发送与您当前参考无关的消息)。团队将其中的一些内容混为一谈类别)。您可以从Teams官方文档中详细了解how to use proactive messaging。或者,更具体地说,是creating a channel conversation

要点是,您需要先capture a conversationUpdate and check for a new member added to the conversationfetch the team roster,然后send the proactive message

注意:对于MS Teams,用户或团队将必须首先添加漫游器:

  

只要您的机器人在个人或团队范围内拥有通过先前添加获得的用户信息,机器人就可以与单个Microsoft Teams用户创建新的对话。该信息使您的机器人可以主动通知他们。例如,如果您的机器人被添加到团队中,它可以查询团队花名册并在个人聊天中向用户发送个人消息,或者用户可以@提及其他用户以触发该机器人向该用户发送直接消息。

一些开发人员在使用主动消息传递时遇到401: Unauthorized错误,特别是如果机器人由于某种原因而重新启动并且机器人试图重新发起主动消息时。您可以阅读有关防止by using trustServiceUrl from this Sample的更多信息(这是我的分支,用于提交请求请求以使用trustServiceUrl信息更新主动样本)。

答案 1 :(得分:0)

您可以使用Botframework V4和Teams Extensions V4中的连接器Client发起全新的对话。在nodejs中,您将在this Github Issue的注释之一中找到解决方案。对于在 C#中寻求解决方案的任何人,here is a detailed blog post都涉及在Botframework的C#版本中完成此任务。

在nodejs中:

var conversationReference = TurnContext.getConversationReference(context.activity)
connectorClient = await createConnectorClient(context)

var conversationParameters = {
isGroup: true,
bot: conversationReference.bot,
channelData: (await teamsCtx.getTeamsChannelData()),
tenantId: teamsCtx.tenant.id,
activity: MessageFactory.text("Queue Summary Placeholder") as Activity
} as ConversationParameters

await connectorClient.conversations.createConversation(conversationParameters)

在C#中

ConnectorClient _client = new ConnectorClient(new Uri(turnContext.Activity.ServiceUrl), await GetMicrosoftAppCredentialsAsync(turnContext), new HttpClient());
            var channelData = turnContext.Activity.GetChannelData<TeamsChannelData>();

            var conversationParameter = new ConversationParameters
            {
                Bot = turnContext.Activity.Recipient,
                IsGroup = true,
                ChannelData = channelData,
                TenantId = channelData.Tenant.Id,
                Activity = MessageFactory.Text(message)
            };
            var response = await _client.Conversations.CreateConversationAsync(conversationParameter);

答案 2 :(得分:0)

真的,我们需要知道您何时希望机器人发送消息,机器人框架TeamsActivityHandler类提供了多个methods,您可以利用它们,例如:

  1. onMembersAdded(BotHandler):为成员添加的事件注册一个活动事件处理程序,该事件事件处理程序针对任何包含添加到对话的成员的传入对话更新活动而发出。

详细了解可以使用here的事件/方法。

答案 3 :(得分:0)

我最终弄清楚了它,然后编写了一个机器人控制器,可以使用以下代码按需调用。

let
    // a custom function to Surround a string with single quotes.    
    // A optional second argument lets you specify a different character
    quote_string = (input_string as text, optional character as text) =>
        let 
            character = if character = null then "'" else character,
            template = "#[quote]#[string]#[quote]",
            quoted_string = Text.Format(
                template,
                [
                    quote = character,
                    string = input_string
                ]
            )
        in
            quoted_string

in
    quote_string