Обработка прерываний по ссылкам / рефералам из Facebook (Bot Framework v4) - PullRequest
1 голос
/ 10 февраля 2020

Рассмотрим этот сценарий:

  1. Поэтому, когда пользователь щелкает ссылку m.me с параметрами реферала, он перенаправляется на бота-мессенджера, показывает некоторое приветственное сообщение и затем спрашивает пользователя, хотят ли они продолжить или не через ConfirmPrompt.
  2. Пользователь не нажал ни да / нет НО повторно щелкает ссылку с параметром реферала, что может привести к ошибке с тех пор (и я не знаю, как ее зафиксировать), ошибка на уровне onTurn.

Может кто-нибудь любезно объяснить, что случилось с этим видом деятельности и как правильно с ним справиться (просто перезапустив весь мой диалог для параметров рефералов)

БЛАГОДАРЮ ВАС !!! PS. Я использую NodeJs SDK для своего бота, (среда фреймворка V4)

Отредактировано: (спасибо, что задали хороший вопрос о примере кода для полного понимания сценария, я также добавлю несколько скриншотов для визуализации проблемы )

Таким образом, этот код находится на одном из этапов водопада в ReferralDialog, который специально запрашивает подтверждение пользователя.

await step.context.sendActivity("Doesn’t that sound easy?");
await step.context.sendActivity({ type: 'typing'});
return await step.prompt(CONFIRM_PROMPT, 'Now, would you like to apply?', ['yes', 'no']);

следующий этап водопада содержит фрагменты кода этого:

if(step.result)
        {
            await step.context.sendActivity("And to protect your privacy from prying eyes, I will bring you outside of messenger to a secure East West owned chat environment");


           return await step.endDialog();
        }
        else
        {
            await step.context.sendActivity("Thank you ! If you change your mind, please click the link your referrer sent you again to re-enter the program.");
            return await step.endDialog();
        }

Внутри основного диалога (фрагменты): // через fb, но с ref (уже взаимодействовал)

else if(channelData &&  channelData.referral && channelData.referral.ref && stepContext.context.activity.channelId === 'facebook')
    {
return await stepContext.beginDialog(REFERRAL_DIALOG, userData);}

Таким образом, предполагалось, что: если пользователь скажет, нажимает либо да / нет, то будет быть сообщением для этого: (но какой-то сумасшедший пользователь снова щелкает по реферальной ссылке)

Итак, теперь у нас есть эта ошибка:

Сообщение об ошибке

2-е и 3-е изображение для того, что бот отвечает: Приглашение Messenger Ошибка Messenger

Сообщение об ошибке, встречающееся в индексе. js имеет этот код: (Его предустановка из рамок, я никогда не изменяю / делаю что-то на этот код)

// Catch-all for errors.
adapter.onTurnError = async (context, error) => {
    // This check writes out errors to console log .vs. app insights.
    // NOTE: In production environment, you should consider logging this to Azure
    //       application insights.
    console.error(`\n [onTurnError] unhandled error: ${ error }`);

    // Send a trace activity, which will be displayed in Bot Framework Emulator
    await context.sendTraceActivity(
        'OnTurnError Trace',
        `${ error }`,
        'https://www.botframework.com/schemas/error',
        'TurnError'
    );

    // Send a message to the user
    let onTurnErrorMessage = 'The bot encounted an error or bug.';
    await context.sendActivity(onTurnErrorMessage, onTurnErrorMessage, InputHints.ExpectingInput);
    onTurnErrorMessage = 'To continue to run this bot, please fix the bot source code.';
    await context.sendActivity(onTurnErrorMessage, onTurnErrorMessage, InputHints.ExpectingInput);
    await context.sendActivity(error);
    // Clear out state
    await conversationState.delete(context);
};

И единственный код toLowerCase моего бота можно найти в CancelAndHelpDialog (Также я не определил, но добавил что-то:

class CancelAndHelpDialog extends ComponentDialog {
    async onContinueDialog(innerDc) {
        const result = await this.interrupt(innerDc);
        if (result) {

            console.log("Bot was interrupted");
            return result;
        }
        return await super.onContinueDialog(innerDc);
    }

    async interrupt(innerDc) {
        console.log("Interrupt");
        let interruptData=innerDc.context.activity;
        if (interruptData && interruptData.text) {
            console.log("uhhhhhhhhhmmm" + typeof innerDc.context.activity.text);
                const text = innerDc.context.activity.text.toLowerCase();

                switch (text) {
                case 'help':
                case '?': {
                    const helpMessageText = 'Call our customer service 8888-1700 for further assistance.';
                    await innerDc.context.sendActivity(helpMessageText, helpMessageText, InputHints.ExpectingInput);
                    return { status: DialogTurnStatus.waiting };
                }
                case 'cancel':
                case 'quit': {
                    const cancelMessageText = 'Cancelling...';
                    await innerDc.context.sendActivity(cancelMessageText, cancelMessageText, InputHints.IgnoringInput);
                    return await innerDc.cancelAllDialogs();
                }
            }
        }
    }
}

Это действительно странно почему все мои console.log (), которые я добавил в CancelAndHelpDialog, не будут показаны, и, что более важно (повторюсь), у меня нет другого кода toLowerCase, кроме этого диалога.

Спасибо!

РЕДАКТИРОВАТЬ: Поскольку проблема заключалась в том, что он становится ошибкой для пользователя, я нашел способ изменить onContinueDialog и перепроверить пользователей, чтобы они щелкнули ссылку. хе-хе

async onContinueDialog(innerDc) {
        console.log("This is at oncontinue Dialog");
        console.log("\n\r This is the channel Data" + JSON.stringify(innerDc.context.activity.channelData));

        let interruptData=innerDc.context.activity;
        if(interruptData.channelData.referral && interruptData.channelData.referral.ref)
        {
            await innerDc.context.sendActivity("Sorry I didn't catch it. Kindly click the link again.");   
            return await innerDc.cancelAllDialogs();
        }
        else
        {
            const result = await this.interrupt(innerDc);
            console.log("The result: " + JSON.stringify(result));
            if (result) {

                console.log("Bot was interrupted");
                return result;
            }
            return await super.onContinueDialog(innerDc);
        }
    }

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

1 Ответ

1 голос
/ 30 марта 2020

Ранее мой бот использовал Bot Framework 4.7.2, где он содержит ошибку для канала Facebook. Обновление до 4.8.0 избавит от ошибки «Ошибка типа: невозможно прочитать свойство« toLowerCase »из неопределенного».

...