Бот-фреймворк получает ServiceUrl встроенной страницы управления чатом

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

Вот что я пробовал: Управление чатом через прямую линию

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

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


person Justin Van    schedule 16.03.2017    source источник
comment
Похоже, это не связано с Robot Framework, одноименным инструментом автоматизации тестирования.   -  person A. Kootstra    schedule 16.03.2017
comment
Я знаю, что это просто эмулятор для тестирования, но то, что я хочу знать, есть в любом случае, мы можем получить его, когда опубликуем бота   -  person Justin Van    schedule 16.03.2017
comment
Вы можете разместить свой собственный веб-чат. обратитесь по этой ссылке github.com/Microsoft/BotFramework-WebChat   -  person Satheesh    schedule 16.03.2017
comment
Я не склонен размещать свой собственный элемент управления веб-чатом, я хочу встроить его на веб-сайт моего клиента, и я хочу получить домен их веб-сайта   -  person Justin Van    schedule 16.03.2017
comment
Вы не можете; однако вы можете рассмотреть возможность использования backChannel для отправки чего-либо с веб-страницы боту через события   -  person Ezequiel Jadib    schedule 16.03.2017
comment
@EzequielJadib, хорошо, можешь показать мне, как сделать backChannel?   -  person Justin Van    schedule 17.03.2017
comment
@EzequielJadib Вы открыли для себя другие способы сделать это? Можно ли встроить URL в TurnContext?   -  person Nazariy Perepichka    schedule 15.10.2019


Ответы (1)


Я думаю, что способ добиться этого - использовать BackChannel, который добавляет возможность боту общаться со страницей, которая встраивает бота через WebChat. Это позволит вам:

  • Отправлять события на страницу, на которой размещен экземпляр WebChat.
  • Слушайте события со страницы, на которой размещен экземпляр WebChat.

Первая часть - это, конечно, HTML-страница, которая будет содержать то, что вы собрали, плюс логику для отправки / прослушивания событий. Образец страницы с базовой логикой можно найти здесь, а ниже - изображение с кодом, связанным с событиями.

События BackChannel

Теперь вам нужно подготовить своего бота для прослушивания и отправки событий. В Node.js есть образец, в котором показано, как это сделать.

Перенести это в 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-адресом страницы, и бот должен будет прослушать это событие, чтобы получить значение

person Ezequiel Jadib    schedule 17.03.2017
comment
Образцы ссылок не работают, обновите, если возможно. - person TomCat; 26.06.2019