如何自动将用户信息传递给 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<IMessageActivity> turnContext, CancellationToken cancellationToken)
和类 QnABot.cs
中的 OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> 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
类在您的机器人和用户之间交换消息。它具有不同的属性。有一些由框架填充并取决于框架。但是,很少有可以让您控制对话状态的方法。
BotUserData
、BotConversationData
和 BotPerUserInConversationData
允许您交换动态数据。三者各有其意义。结帐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应用程序中的值?