Получение Facebook Messenger для отображения последующих запросов QnA в BotFramework v4 с использованием Node.js - PullRequest
0 голосов
/ 30 июня 2019

Я пытаюсь выяснить, как заставить Facebook Messenger показывать последующие приглашения от QnA Maker, используя BotFramework v4 и Node.js.

Мне удалось получить дополнительные подсказки, показывающиев WebChat: image

Я справился с этим после того, как следовал великому совету Мэтта Станнетта в этой теме: Как реализовать карточки в вопросе QnA, в котором есть последующие запросы ииспользует их в карточках

Однако, когда дело доходит до их появления в Facebook Messenger, я действительно борюсь.

Я надеялся, что это будет так же просто, как определитьВ моем коде onMessage есть несколько быстрых ответов channelData for Facebook, так как мне просто нужно, чтобы Facebook передавал простую текстовую информацию.Я думал, что смогу сделать это подобным образом, я получил подсказки, показывающие для Webchat, код ниже:

this.onMessage(async (context, next) => {
        this.logger.log('Processing a Message Activity');

        const qnaResults = await this.qnaMaker.getAnswers(context);

        // Show choices if the Facebook Payload from ChannelData is not handled
        if (!await this.processFacebookPayload(context, context.activity.channelData)) {
            if (context.activity.channelId == 'facebook') {
              if (qnaResults[0]) {
                const { answer, context: { prompts }} = qnaResults[0];

                let reply;
                if (prompts.length) {

                  const quickReply = {
                    channelData: {
                      "messaging_type":"RESPONSE",
                      "message":{
                        "text":"test1", //answer,
                        "quick_replies":[
                          {
                            "content_type":"text",
                            "title":"test2",//prompts.map({ displayText }),
                            "payload":"test3",//prompts.map({ displayText })
                          }
                        ]
                      }
                    }
                  }

                    reply = quickReply;
                  } else {
                    reply = answer;
                  }

                  await context.sendActivity(reply);

              // If no answers were returned from QnA Maker, reply with help.
              } else {
                  await context.sendActivity('I\'m sorry, I don\'t have an answer for that. Please ask me something else, such as: \n\n "What Is Mental Health?" \n\n "What Is NeuroDiversity" \n\n "Help"');
              }

            } else {

            // If an answer was received from QnA Maker, send the answer back to the user.
            if (qnaResults[0]) {
              const { answer, context: { prompts }} = qnaResults[0];

              let reply;
              if (prompts.length) {

                const card = {
                  "type": "AdaptiveCard",
                  "body": [
                    {
                      "type": "TextBlock",
                      "text": answer,
                      wrap: true
                    }
                ],
                "actions": prompts.map(({ displayText }) => ({ type: "Action.Submit", title: displayText, data: displayText })),
                "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
                "version": "1.1"
                }

                  reply = { attachments: [CardFactory.adaptiveCard(card)] };
                } else {
                  reply = answer;
                }

                await context.sendActivity(reply);

            // If no answers were returned from QnA Maker, reply with help.
            } else {
                await context.sendActivity('I\'m sorry, I don\'t have an answer for that. Please ask me something else, such as: \n\n "What Is Mental Health?" \n\n "What Is NeuroDiversity" \n\n "Help"');
            }
            }

        }

        // By calling next() you ensure that the next BotHandler is run.
        await next();
    });

Это не работает, хотя.Я получаю ответы QnA на все вопросы, которые я задаю, у которых в QnA Maker не задано последующее приглашение, поэтому я знаю, что утверждение IF правильно идентифицирует Facebook как канал и что ответ имеет последующие приглашениясвязано с этим.Я думаю, что у меня просто нет правильного кода для быстрых ответов в Facebook.

Кто-нибудь может помочь?

Заранее спасибо!

1 Ответ

0 голосов
/ 30 июня 2019

Мне удалось получить несколько быстрых быстрых ответов, изменив мои quickReply channelData:

const quickReply = {
                    channelData: {
                        text: answer,
                        quick_replies: [
                          {
                            content_type: "text",
                            title: "Prompt 1",
                            payload: "Prompt 1"
                          },{
                            content_type: "text",
                            title: "Prompt 2",
                            payload: "Prompt 2"
                          }
                        ]
                    }
                  }

Затем можно создать переменную для вставки последующего приглашения в данные канала:

var qnaPrompts = null;
if(qnaResults[0].context != null){
   qnaPrompts = qnaResults[0].context.prompts;
}

Затем вам нужно повторно сопоставить массив с новым массивом в правильном формате для быстрых ответов:

var qnaPromptsArray = qnaPrompts.map(obj =>{
   return {content_type: "text", title: obj.displayText, payload: obj.displayText}
});

Теперь это отображает запрос последующего QnA в качестве быстрого ответа вFacebook Messenger, если вы обновляете quickReply следующим образом:

const quickReply = {
   channelData: {
      text: answer,
      quick_replies: qnaPromptsArray
   }
}

Последнее, что нужно решить, - это как переформатировать полезную нагрузку обратно в QnA в формат, который он принимает.Для этого вам нужно настроить ваш turnContext на строку в Activity.Text следующим образом, а затем вызвать QnA:

turnContext.activity.text = quickReply.payload;
const qnaResults = await this.qnaMaker.getAnswers(turnContext);
...