我想将聊天控件嵌入到许多网站中,我希望获得我嵌入的网站的网址,以便我的机器人可以获得与网站网址匹配的数据。但是,当我嵌入从WebChat生成的iframe时,我总是得到相同的ServiceUrl,那就是 https://webchat.botframework.com/ ,它不是网站的Url,所以如何嵌入聊天控件任何网站和我的机器人都可以获得网站网址,而不是网络网页或DirectLine的网址。
以下是我尝试过的内容:Direct-Line chat control
我注意到,当我使用Bot框架模拟器测试我的僵尸程序时,它总是返回发件人的确切URL(如果是本地测试,它将返回http://localhost:XXXX/)。那我们怎么能这样做呢?
答案 0 :(得分:7)
我认为实现这一目标的一种方法是使用BackChannel,它增加了机器人与通过WebChat嵌入机器人的页面进行通信的能力。它将允许您:
第一部分当然是HTML页面,它将包含您放在一起的内容,以及发送/收听事件的逻辑。可以找到带有基本逻辑的示例页面here,下面是带有事件相关代码的图像。
现在,您需要准备机器人以收听和发送事件。 Node.js
中有sample,显示了如何执行此操作。
在C#
中移植,就像收听和发送到Event类型的活动一样简单。该示例代码(使用前面提到的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和机器人必须收听该事件以获取值