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