如何自动将用户信息传递给 Bot Framework 对话实例而不将其作为显式消息发布在聊天 window 中?

How do I automatically pass user information to the Bot Framework conversation instance without posting it as an explicit message in the chat window?

[问题与 Microsoft Bot 框架有关]

我的机器人需要一些关于用户的信息,但我不希望用户自己提交,因为

  1. 他可能没有。 2. 我的网页肯定有,不用我问了。

本质上,我的聊天机器人嵌入在网页中。该网页的每个会话中都有信息,我需要提交给相应的聊天机器人控制器实例,而不会在聊天中显示明确的消息 window。

如何将信息传递给聊天机器人控制器?如果我需要对话 ID 来寻址机器人,我如何在我的网页 Javascripts 中以编程方式获取它?现在,我的聊天机器人已集成到网页中,带有可以在文档中找到的简单 iframe 行

http://docs.botframework.com/connector/embed-chat-control/#navtitle

示例场景:我的聊天机器人是 Facebook 页面上的聊天 window。我需要聊天机器人知道用户是谁,并在没有任何提示的情况下说 'Hello username' 以获取用户名

Microsoft Bot Framework 使用 Message class 来交换消息 between/among 您的机器人和用户。它具有不同的属性。有一些由框架填充并取决于框架。但是,很少有允许您控制对话状态的。

BotUserDataBotConversationDataBotPerUserInConversationData 是允许您交换动态数据的一种。三者各有各的意义。查看 official documentation 了解详情。

要获取有关不同频道的信息,请使用包含来自频道 (Facebook)

的原始消息的 ChannelData

在那种情况下,您必须创建自己的对话 window,允许您 post 并获取 Message 对象。

Index.html

<script src="script.js">
<ul class="chat" id="conversation">

</ul>
<input id="input-text" type="text" />
<button type="button"   id="btn-send">Send</button>

script.js

$('#btn-send').click(function () {

    // Convert text to Message object
    var message = {
        text: $('#input-text').val(),
        type: "Message"
    };

    // Create outgoing message html and add to list
    var htmlOutgoing = "<li>" + message.text + "</li>";
    $('#conversation').append(html);

    $.ajax({
        url: 'api/Messages/Post', // Change to your proper url
        dataType: "json",
        type: "POST",
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify(message),
        async: true,
        processData: false,
        cache: false,
        success: function (data) {
            // Create incoming message html and add to list
            var htmlIncoming = "<li>" + data.text + "</li>";
            $('#conversation').append(htmlIncoming);
        },
        error: function (xhr) {
            alert('error');
        }
    });

    $('#text-input').val("");
})

希望对您有所帮助。

我能够将用户 ID 和名称从 Web 应用程序传递到嵌入在 iframe 中的 C# Microsoft Bot Framework 机器人。用户 ID 和名称可以像这样在 iframe 中传递(替换您的机器人的 URL 和密码,以及您要传递的任何用户 ID 和名称:

<iframe src="https://webchat.botframework.com/embed/assistant-bot?s=[bot_secret]&userid=[user_id]&username=[user_name]"></iframe>`

在我的 bot 中,turn context 用于访问用户 ID 和名称,并且在 class DialogBot.cs 和 [=14= 中的方法 OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) 中可用] 在 class QnABot.cs.

在这些方法中,turnContext.Activity.From.Id 包含 passed-in 用户 ID,turnContext.Activity.From.Name 包含 passed-in 用户名。

我相信,如果您使用 DirectLine 嵌入机器人,那么机器人也应该能够以与上述相同的方式访问用户 ID 和用户名,如下面 Secured WebChat Control 发送给我的代码片段所示, 但我还没有机会尝试:

$.get('/api/token', function (token) {
    window.WebChat.renderWebChat({
        directLine: window.WebChat.createDirectLine({ token: token }),
        userID: '[user_id]',
        username: '[user_name]',
        locale: 'en-us',
        styleOptions: { hideUploadButton: true }
    }, document.getElementById('webchat'));
}