3

Smooch ポストバック ペイロードに基づいて、スクリプトをある状態から別の状態に移行しようとしています。エラーコードH12が表示されます。

例を考えてみましょうhttps://github.com/smooch/smooch-bot-example

スクリプトhttps://github.com/smooch/smooch-bot-example/blob/master/script.jsを次のように変更するとします。

start: {
    receive: (bot) => {
        return bot.say('Hi! I\'m Smooch Bot! Continue? %[Yes](postback:askName) %[No](postback:bye) );
    }
},
bye: {
    prompt: (bot) => bot.say('Pleasure meeting you'),
    receive: () => 'processing'
},

その意図は、ボットの状態がポストバック ペイロードに応じて遷移することです。

問題は、どうすればそれを実現できるかということです。

私のアプローチは追加でした

stateMachine.setState(postback.action.payload)

github.com/smooch/smooch-bot-example/blob/master/heroku/index.js の handlePostback メソッドに

ただし、エラーコードH12がスローされました。私も実験しました

stateMachine.transition(postback.action,postback.action.payload)

無駄に。

4

3 に答える 3

4

文字列ではなく [object Object] でも同じ問題が発生しました。これはstate、関数で取得または設定するものが文字列ではなくオブジェクトに含まれているためです... smooch-bot-example GitHub リポジトリindex.jsの既存のhandlePostback関数を置き換えて、内部のこのコードで修正しました。

function handlePostback(req, res) {

const stateMachine = new StateMachine({
    script,
    bot: createBot(req.body.appUser)
});

const postback = req.body.postbacks[0];
if (!postback || !postback.action) {
    res.end();
};

const smoochPayload = postback.action.payload;

// Change conversation state according to postback clicked
switch (smoochPayload) {
    case "POSTBACK-PAYLOAD":
        Promise.all([
            stateMachine.bot.releaseLock(),
            stateMachine.setState(smoochPayload), // set new state
            stateMachine.prompt(smoochPayload) // call state prompt() if any
        ]);
        res.end();
    break;

    default:
        stateMachine.bot.say("POSTBACK ISN'T RECOGNIZED") // for testing purposes
            .then(() => res.end());
};
}

次に、内部script.jsで行う必要があるのは、正確なポストバック ペイロードに対応する状態を定義することだけです。ユーザーを他の状態に移動させるポストバックが複数ある場合は、次のcaseようにリストに追加します。

case "POSTBACK-PAYLOAD-1":
case "POSTBACK-PAYLOAD-2":
case "POSTBACK-PAYLOAD-3":
case "POSTBACK-PAYLOAD-4":
Promise.all([
        stateMachine.bot.releaseLock(),
        stateMachine.setState(smoochPayload), // set new state
        stateMachine.prompt(smoochPayload) // call state prompt() if any
    ]);
    res.end();
break;

break;必要な結果が同じである場合は、それぞれの最後に記述しないでくださいcase(ここでは、状態を設定し、対応するメッセージを表示します)。

他のポストバックを別の方法で処理したい場合は、break;ステートメントの後にケースを追加して、代わりに他のことを行うことができます。

お役に立てれば!

于 2016-07-27T08:52:37.510 に答える
0

ポストバックに基づいて会話を進めたい場合は、最初にボットのプロンプトからボタンを出力し (受信でボタンのクリックを処理できるように)、 でhandlePostback関数を変更しindex.js、次に でユーザーの「返信」を処理する必要があります。あなたの受信方法 - これを試してください -script.js次のように変更してください:

start: {
    prompt: (bot) => bot.say(`Hi! I'm Smooch Bot! Continue? %[Yes](postback:askName) %[No](postback:bye)`),
    receive: (bot, message) => {

      switch(message.text) {
        case 'Yes':
          return bot.say(`Ok, great!`)
            .then(() => 'hi')
          break;
        case 'No':
          return bot.say(`Ok, no prob!`)
            .then(() => 'bye')
          break;
        default:
          return bot.say(`hmm...`)
            .then(() => 'processing')
          break;          
      }
    }
},

hi: {
    prompt: (bot) => bot.say('Pleasure meeting you'),
    receive: () => 'processing'
},

bye: {
    prompt: (bot) => bot.say('Pleasure meeting you'),
    receive: () => 'processing'
},

次に、ポストバックを通常のメッセージのように扱うようにhandlePostback関数を変更します。index.js

function handlePostback(req, res) {

    const postback = req.body.postbacks[0];

    if (!postback || !postback.action)
        res.end();

    const stateMachine = new StateMachine({
        script,
        bot: createBot(req.body.appUser)
    });

    const msg = postback;

    // if you want the payload instead just do msg.action.paylod
    msg.text = msg.action.text;

    stateMachine.receiveMessage(msg)
      .then(() => res.end())
      .catch((err) => {
        console.error('SmoochBot error:', err);
        res.end();
      });
}

ユーザーがボタンをクリックすると、stateMachine にプッシュされ、返信のように処理されます。

于 2016-08-24T19:21:01.807 に答える