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

Posted

技术标签:

【中文标题】如何自动将用户信息传递给 Bot Framework 对话实例,而不将其作为显式消息发布在聊天窗口中?【英文标题】:How do I automatically pass user information to the Bot Framework conversation instance without posting it as an explicit message in the chat window? 【发布时间】:2016-06-14 06:30:00 【问题描述】:

[与 Microsoft Bot 框架有关的问题]

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

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

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

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

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

示例场景:我的聊天机器人是 Facebook 页面上的聊天窗口。我需要聊天机器人知道用户是谁并说,例如,“你好用户名”而不提示获取用户名

【问题讨论】:

能否请您发布您最终做了什么?还是接受答案?我实际上正在寻找同样的问题:) 【参考方案1】:

在这种情况下,您必须创建自己的对话窗口,以便您发布和获取 Message 对象。

索引.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("");
)

希望对你有帮助。

【讨论】:

您的解决方案可以工作,但我需要先确认一些事情 - 我可以向 /api/conversations 发出 Post 请求,获取对话 ID 和令牌 ID,然后返回 iframe 元素吗?在这个问题***.com/questions/36492682/… 中讨论了类似的东西【参考方案2】:

我能够将用户 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>`

在我的机器人中,轮流上下文用于访问用户 ID 和名称,可在类 DialogBot.cs 中的方法 OnMessageActivityAsync(ITurnContext&lt;IMessageActivity&gt; turnContext, CancellationToken cancellationToken) 和类 QnABot.cs 中的 OnMembersAddedAsync(IList&lt;ChannelAccount&gt; membersAdded, ITurnContext&lt;IConversationUpdateActivity&gt; turnContext, CancellationToken cancellationToken) 中使用。

在这些方法中,turnContext.Activity.From.Id 包含传入的用户 ID,turnContext.Activity.From.Name 包含传入的用户名。

如果您使用 DirectLine 嵌入机器人,我相信机器人也应该能够以与上述相同的方式访问用户 ID 和用户名,如下面的代码 sn-p 来自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'));

【讨论】:

【参考方案3】:

Microsoft Bot Framework 使用Message 类在您的机器人和用户之间交换消息。它具有不同的属性。有一些由框架填充并取决于框架。但是,很少有可以让您控制对话状态的方法。

BotUserDataBotConversationDataBotPerUserInConversationData 允许您交换动态数据。三者各有其意义。结帐official documentation了解详情。

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

【讨论】:

如何获取机器人实例的对话/用户 ID?具体来说,此代码将在网页上,而不是在机器人控制器中,源自用户会话。谢谢 通常,机器人 MessagesController 返回一个包含所有重要信息的 JSON 对象。您可以使用 JSON.stringify 转换接收到的字符串,并在 JavaScript 中使用对象的属性。请记住,WebApiConfig 中的默认配置会将所有属性的名称转换为小写 谢谢,但我还是有点困惑。我的浏览器中有这个 -

以上是关于如何自动将用户信息传递给 Bot Framework 对话实例,而不将其作为显式消息发布在聊天窗口中?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Laravel 手动自动完成搜索,如何将信息传递给视图中的 div

如何将AWS实例的详细信息传递给jenkins作业,以便该作业在实例中ssh和执行

如何将网络聊天发送到国家/地区?

如何将request.user / user传递给Django中的消息

如何创建一个`context.Provider` /`context.Consumer`-like结构来传递bot应用程序中的值?

node js jwt如何将令牌传递给其他路由以稍后检查登录的用户信息