我想将聊天控件嵌入到许多网站,并且我想获取已嵌入网站的 Url,以便我的机器人可以获得与网站 URL 匹配的数据。但是,当我嵌入从 WebChat 生成的 iframe 时,我总是得到相同的 ServiceUrl,这就是https://webchat.botframework.com/ https://webchat.botframework.com/,它不是网站的 Url,那么我如何将聊天控件嵌入到任何网站,并且我的机器人可以获取网站 Url,而不是 WebChat 或 DirectLine 的 Url。
这是我尝试过的:直线聊天控制 https://codepaste.net/umd5gv
Here's the result I've tested with my published bot:
我注意到,当我使用 Bot Framework Emulator 测试我的机器人时,它总是返回发件人的确切 Url(在本地测试的情况下,它将返回http://本地主机:XXXX/ http://localhost:XXXX/)。那么我们怎样才能这样做呢?
我认为实现这一目标的一种方法是使用 BackChannel,它增加了机器人与通过 WebChat 嵌入机器人的页面进行通信的能力。它将允许您:
- 将事件发送到托管 WebChat 实例的页面
- 监听来自托管 WebChat 实例的页面的事件
当然,第一部分是 HTML 页面,其中包含您组合的内容,以及发送/侦听事件的逻辑。具有基本逻辑的示例页面可以找到here https://github.com/Microsoft/BotFramework-WebChat/blob/master/samples/backchannel/index.html下面是带有事件相关代码的图像。
现在,您需要准备您的机器人来侦听和发送事件。有一个sample https://github.com/ryanvolum/backChannelBot/blob/master/app.js in Node.js
,这展示了如何做到这一点。
将其移植到C#
,就像监听和发送事件类型的活动一样简单。示例代码(使用前面提到的 HTML 页面的事件):
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
if (activity.Type == ActivityTypes.Event &&
string.Equals(activity.Name, "buttonClicked", StringComparison.InvariantCultureIgnoreCase))
{
ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
// return our reply to the user
Activity reply = activity.CreateReply("I see that you just pushed that button");
await connector.Conversations.ReplyToActivityAsync(reply);
}
if (activity.Type == ActivityTypes.Message)
{
ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
// return our reply to the user
var reply = activity.CreateReply();
reply.Type = ActivityTypes.Event;
reply.Name = "changeBackground";
reply.Value = activity.Text;
await connector.Conversations.ReplyToActivityAsync(reply);
}
else
{
HandleSystemMessage(activity);
}
var response = Request.CreateResponse(HttpStatusCode.OK);
return response;
}
最重要的是,在 HTML 页面中,您必须向机器人发送一个带有页面 URL 的事件,机器人必须监听该事件才能获取值
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)