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 
} 

이 기본 구조 인, 지금은 하나의 포스트 백에 대한 응답으로 여러 메시지를 보내려고합니다. 좀 파고 들었는데, 해결책이 메시지 배열을 만드는 것일 수도 있다는 것을 알게되었습니다. 하지만 어떻게해야합니까? 내 '응답'이 기능을 통해 생성되고 있으며, 메시지 구조는 다음과 같이해야하기 때문에 (내 생각) : 나는 내 질문에 설명 할 수있는 희망

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

, 나는 더 자세한 정보를 제공 할 수 있는지 알려 주시기 바랍니다 !

답변

0

좋은 질문. Node.js에 익숙하지 않다면 그렇게하는 방법이 너무 명확하지 않고 Facebook의 Send API 문서에 잘 설명되어 있지 않습니다.

첫 번째로 관찰 한 것처럼 배열을 사용하여 여러 메시지를 보내는 방식은 효과가 없습니다. Facebook은 하나의 요청으로 최대 100 건의 API 호출을 전송할 수있는 솔루션을 가지고 있지만 내 의견으로는 귀하의 상황에서는 이것이 필요하지 않습니다. 그것에 대해 자세히 알아 보려면 Batched Request Documentation을 확인하십시오. 구현 방법이 귀하의 구현과 다르다는 것을 알게 될 것입니다.

작동하는 한 가지 해결책은 callSendAPI 함수를 여러 번 호출하는 것입니다. 그러나이 솔루션에는 하나의 큰 단점이 있습니다 : 전송 된 메시지의 실제 순서를 제어 할 수 없습니다. 예를 들어, 두 개의 개별 메시지를 보내려는 경우 은 어떤 메시지가 먼저 사용자에게 전송되는지 보장 할 수 없습니다.

이 문제를 해결하려면 callSendAPI 함수를 연결하여 첫 번째 메시지가 이미 전송 된 후에야 다음 callSendAPI 호출이 발생하도록 보장해야합니다. NodeJS에서 으로 콜백 또는 약속을 사용하여이 작업을 수행 할 수 있습니다. 둘 중 하나에 익숙하지 않은 경우 this 콜백을, this 약속을 읽을 수 있습니다.

callSendAPI 기능을 수정해야하며 특히 POST 요청을 Facebook에 보내는 부분을 수정해야합니다. 약속을 및 모듈 node-fetch을 사용하여 문제에 대한 해결책을 제시합니다.

0

callSendAPI 기능을 수정하지 마십시오. handlePostback 함수 호출에서 callSendAPI 번을 여러 번 호출하십시오.

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

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

나는 다시 한 게시물에 복수 응답을 구현하는 방법을 제압 아래의 링크를 유용하다고.

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). 링크는 일정 시간이 지나면 사라지는 경향이있어 답을 쓸모 없게 만듭니다. 여기에 요점을 진술하고 링크를 참고 자료로 사용하십시오. – MrT