Есть ли способ отправить информацию из чат-бота Microsoft на сайт в зависимости от результата разговора
Я использую Microsoft Bot Framework с Node.js для реализации чат-бота. Я пытаюсь использовать этого чат-бота в опросе "LimeSurvey" (вы можете использовать HTML-код для интеграции бота в опрос, так что вы можете предположить, что это обычный веб-сайт). В зависимости от результата разговора, я хочу показать на этом сайте разную информацию. Допустим, разговор может иметь 10 разных результатов. Можно ли как-то сообщить о "результате" разговора на веб-сайте и показать различную информацию в зависимости от этого? Было бы достаточно, чтобы иметь возможность отправить число от 1 до 10 на веб-сайт. Я могу использовать iframe для интеграции бота или сделать это, как вы можете видеть в коде ниже:
<!DOCTYPE html>
<html>
<body>
<div id="webchat" role="main"></div>
<script src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script>
<script>
window.WebChat.renderWebChat({
directLine: window.WebChat.createDirectLine({ secret: 'M_BOT_SECRET_FROM_AZURE_PORTAL' }),
userID: 'YOUR_USER_ID'
}, document.getElementById('webchat'));
</script>
</body>
</html>
2 ответа
Чтобы отображать информацию на веб-странице, которая зависит от результата разговора, вам необходимо настроить своего бота для отправки действий, которые содержат channelData с результатом, и добавить слушателя для действий, которые содержат результат, в ваш компонент WebChat.
Во-первых, в вашем боте, когда вы дойдете до конца потока разговора и получите результат, отправьте действие пользователю с name
атрибут и channelData
который содержит результат. В name
Атрибут будет использоваться для фильтрации всех входящих действий на стороне разговора. Код вашего бота должен выглядеть так:
await turnContext.sendActivity({
name: 'result',
channelData: {
payload: {
result: turnContext.activity.text
}
}
});
Теперь мы собираемся добавить настраиваемое промежуточное ПО в наш компонент WebChat для обработки входящих действий. Когда действия получены, мы можем фильтровать их поname
атрибут, а затем выполните правильное действие на основе значения результата из channelData
. Ваш веб-чат должен выглядеть так:
<script src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script>
<div id="webchat" role="main"></div>
<script>
(async function () {
// To talk to your bot, you should use the token exchanged using your Direct Line secret.
// You should never put the Direct Line secret in the browser or client app.
// It is being included here only for simplicity
// https://docs.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-direct-line-3-0-authentication
const res = await fetch('https://directline.botframework.com/v3/directline/tokens/generate', {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + secret
},
json: true
});
const { token } = await res.json();
// We are adding a new middleware to customize the behavior of DIRECT_LINE/INCOMING_ACTIVITY.
const store = window.WebChat.createStore(
{},
({ dispatch }) => next => action => {
if (action.type === 'DIRECT_LINE/INCOMING_ACTIVITY') {
// Get activity from action
const { activity } = action.payload;
// Check if the name attribute in the activity is `result`
if (activity.name === 'result'){
// Get result from channel data
const { result } = activity.channelData.payload;
switch (result) {
case 'result1':
alert(result)
// TODO: Action 1
break;
case 'result2':
// TODO: Action 2
break;
default:
// TODO: Default Action
}
}
}
return next(action);
}
);
window.WebChat.renderWebChat({
directLine: window.WebChat.createDirectLine({ token }),
// We will use a custom version of Redux store, which we added middleware to handle backchannel messages.
store
}, document.getElementById('webchat'));
document.querySelector('#webchat > *').focus();
})().catch(err => console.error(err));
</script>
Обратите внимание, что вам не следует хранить секрет Direct Line в браузере или клиентском приложении. Он включен сюда только для простоты. Я также рекомендовал бы взглянуть на образцы BotFramework-WebChat, особенно на образец номер 15.
Надеюсь это поможет!
Я надеюсь, что вы настроили чатбота по прямому каналу, и он в рабочем состоянии.
Чтобы получить ответ от бота, вы можете прослушать события активности прямого канала.
const botConnection = new BotChat.DirectLine({
domain: params['domain'],
secret: <secret_key>,
token: <any_params>,
webSocket: params['webSocket'] && params['webSocket'] === 'true' // defaults to true
});
BotChat.App({
bot: bot,
botConnection: botConnection,
user: user,
locale: userDetail.userLanguage,
}, document.getElementById('chatBot'));
//listening to activities sent and received
botConnection.activity$
.subscribe(function(activity){
if(activity.type == "message" && activity.text == <some_response_from_bot>){
//your logic to show on the web page
}
});
Таким образом, в слушателе вы можете отслеживать все сообщения об активности и принимать меры в отношении того, что делать. В вашем случае показывают разные результаты в зависимости от разговора.
Я рекомендую вам прочитать эти