1

Messengerで1回のユーザー起動のポストバックに対して複数の返信を送信したいとします。私はMessengerのdeveloper documentationに従っており、実際にこれを行う方法を見つけることができませんでした。Facebookメッセンジャーボットの単一のポストバックで複数の返信メッセージを送信

私のコードの構造は、私が受け取ったポストバックを識別し、「応答を見つけるために、事前に定義されたペイロードのセットと比較する「handlePostback」機能を持って、彼らはサイト上で与えてくれたチュートリアルと非常によく似ています 'JSONオブジェクトです。この応答は 'callSendAPI'に与えられ、このJSONオブジェクトをメッセンジャーAPIにメッセージを戻す基本的なフォーマットに置きます。これは、基本的な構造であること

function handlePostback(sender_psid,receivedPostback) 
{ if(payload== 'defined_payload') { 
    response = { 
    text: 'Some text' 
    }; 
callSendAPI(sender_psid,response); 
} 

function callSendAPI(sender_psid,response) { 
let body = { 
recipient: { 
id= sender_psid 
}, 
message: response 
}; 
// Followed by code for POST request to the webhook 
} 

、今私は1ポストバックへの応答として複数のメッセージを送りたいです。私はいくつかの掘り下げを行い、解決策はメッセージ[]配列を作成することであることがわかった。しかし、私はこれをどのようにして行うのですか?私の「応答」は、その関数によって生成されている、とのメッセージの構造は次のようになりますので(私が思う):私は私の質問を説明することを願ってい

let body = { 
recipient: { 
id=sender_psid 
}, 
messages: [ { 
    response1 
    }, 
    { 
    response2 
    } 
] 
}; 

が、私はより詳細な情報を提供できるなら、私に知らせてください!

答えて

0

良い質問。あなたがNode.jsに慣れていない場合、それを行う方法はそれほど明白ではなく、これはFacebookのSend API Documentationでうまく説明されていません。

まず、アレイを使用して複数のメッセージを送信するというアプローチは、動作しません。 Facebookは1回のリクエストで最大100のAPIコールを送信するためのソリューションを提供していますが、私の意見では、これはあなたの状況には必要ないと考えています。詳細については、Batched Request Documentationを参照してください。実装があなたと異なる場合があります。

解決策の1つは、callSendAPIの機能を複数回呼び出すことです。 しかし、この解決策には大きな欠点が1つあります。:送信されるメッセージの実際の順序を制御することはできません。たとえば、2つの別々のメッセージを送信する場合は、を最初にユーザに送信することは保証できません。

この問題を解決するには、callSendAPIファンクションを、最初のメッセージが既に送信された後で初めて次のcallSendAPIコールが発生することを保証する方法でチェーンする必要があります。これは、NodeJSでによってコールバックまたは約束を使用して行うことができます。どちらかに慣れていない場合は、コールバックの場合はthis、約束の場合はthisと読むことができます。

あなたのcallSendAPI機能、特にPOSTリクエストをFacebookに送信する部分を変更する必要があります。 約束とモジュールnode-fetchを使用して、問題の解決策を提示します。

const fetch = require('node-fetch'); 
 

 
function handlePostback(sender_psid,receivedPostback){ 
 
    if (payload == 'defined_payload') { 
 
    response = { 
 
     text: 'Some text' 
 
    }; 
 
    response2 = //... Another response 
 
    response3 = //... Another response 
 
    callSendAPI(sender_psid,response).then(() => { 
 
    return callSendAPI(sender_psid, response2).then(() => { 
 
     return callSendAPI(sender_psid, response3); // You can add as many calls as you want 
 
     }); 
 
    }); 
 
    } 
 
} 
 

 
function callSendAPI(sender_psid,response) { 
 
    let body = { 
 
    recipient: { 
 
     id= sender_psid 
 
    }, 
 
    message: response 
 
    }; 
 
    const qs = 'access_token=' + encodeURIComponent(FB_PAGE_TOKEN); // Here you'll need to add your PAGE TOKEN from Facebook 
 
    return fetch('https://graph.facebook.com/me/messages?' + qs, { 
 
    method: 'POST', 
 
    headers: {'Content-Type': 'application/json'}, 
 
    body: JSON.stringify(body), 
 
    }); 
 
}

0

callSendAPI機能を変更しないでください。 handlePostback関数呼び出しでcallSendAPIを複数回呼び出します。

callsendAPI(sender_psid,response1); 
callsendAPI(sender_psid,response2); 
0

私は、単一のポスト背面に複数の応答を実装する方法を整理するには、以下のリンク便利を見つけました。

https://codingislove.com/build-facebook-chat-bot-javascript/

あなたが言ったように、配列は動作するはずです。これは質問に答えるかもしれないが、複数の応答メッセージ

var multipleResponse = { 
    messages: [{ 
     response1 
    }, 
    { 
     response2 
    }] 
}; 

を持つ配列変数を作成し、関数に配列変数をプッシュすることは

function callSendAPI(sender_psid,response) { 

    let body = { 
     recipient: { 
      id= sender_psid 
     }, 
     message: [] 
    }; 
    // Followed by code for POST request to the webhook 
} 

最後に、あなたの関数配列

body.message.push(multipleResponse.messages); 
+0

に配列をプッシュします、[SOの回答は外部リンクのみに依存するべきではありません](https://stackoverflow.com/help/how-to-answer)。一定時間が経過するとリンクが消えてしまい、答えが役に立たなくなります。ここにSOの主な点を述べ、そのリンクを参考にしてください。 – MrT

関連する問題