4

我想将聊天控件嵌入到许多网站中,并且我想获取我嵌入的网站的 URL,以便我的机器人可以获取与网站 URL 匹配的数据。但是,当我嵌入从 WebChat 生成的 iframe 时,我总是得到相同的 ServiceUrl,即https://webchat.botframework.com/,它不是网站的 Url,所以我怎样才能将聊天控件嵌入到任何网站和我的机器人可以获取网站 URL,而不是 WebChat 或 DirectLine 的 URL。

这是我尝试过的:直线聊天控制

这是我使用已发布的机器人测试的结果:结果

我注意到,当我使用 Bot Framework Emulator 测试我的机器人时,它总是返回发件人的确切 Url(如果是本地测试,它将返回http://localhost:XXXX/)。那么我们怎么能这样做呢?

4

1 回答 1

7

我认为实现这一点的一种方法是使用 BackChannel,它增加了机器人与通过 WebChat 嵌入机器人的页面进行通信的能力。它将允许您:

  • 将事件发送到托管 WebChat 实例的页面
  • 侦听托管 WebChat 实例的页面中的事件

第一部分当然是 HTML 页面,它将包含您放在一起的内容,以及发送/监听事件的逻辑。可以在这里找到带有基本逻辑的示例页面,下面是带有事件相关代码的图像。

BackChannel 事件

现在,您需要准备好您的机器人来监听和发送事件。中有一个示例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 向机器人发送事件,并且机器人必须侦听该事件以获取值

于 2017-03-17T13:08:21.470 回答