Есть ли способ отправить информацию из чат-бота Microsoft на сайт в зависимости от результата разговора - PullRequest
0 голосов
/ 08 января 2019

Я использую 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 ]

0 голосов
/ 09 января 2019

Чтобы показать информацию на веб-странице, которая зависит от результата разговора, вам нужно настроить бота на отправку действий, содержащих 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 Samples - в частности, образец номер 15 .

Надеюсь, это поможет!

0 голосов
/ 08 января 2019

Я надеюсь, что вы настроили чатбота по прямому каналу, и он в рабочем состоянии.

Чтобы получить ответ от бота, вы можете прослушать события активности прямого канала.

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
        }
    });

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

Я рекомендую вам прочитать это-

https://github.com/Microsoft/BotFramework-DirectLineJS

https://docs.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-direct-line-3-0-receive-activities?view=azure-bot-service-4.0

...