Bot Framework получить ServiceUrl встроенной страницы управления чатом

Я хочу встроить элемент управления чатом на многие веб-сайты и получить URL-адрес встроенного веб-сайта, чтобы мой бот мог получить данные, соответствующие URL-адресу веб-сайта. Однако, когда я встраиваю iframe, сгенерированный из WebChat, я всегда получаю один и тот же ServiceUrl, и это https://webchat.botframework.com/, это не URL-адрес веб-сайта, так как я могу встроить элемент управления чатом в любой веб-сайт и мой бот могут получить URL-адрес веб-сайта, а не URL-адрес веб-чата или DirectLine.

Вот что я попробовал: Прямой контроль чата

Вот результат, который я протестировал с моим опубликованным ботом: Результат

Я заметил, что когда я тестировал своего бота с помощью эмулятора Bot Framework, он всегда возвращает точный URL-адрес отправителя (в случае локального тестирования он возвращает http://localhost:XXXX/). Итак, как мы можем сделать это?

1 ответ

Решение

Я думаю, что для достижения этого можно было бы использовать BackChannel, который добавляет боту возможность общаться со страницей, которая встраивает бот через 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-адресом страницы, и бот должен будет прослушать это событие, чтобы получить значение

Другие вопросы по тегам