Search code examples
node.jsfacebook-graph-apifacebook-javascript-sdkfacebook-messengerfacebook-messenger-bot

Facebook Messenger: How to send multiple messages with nodejs


I just want to send a messages to all the subscribers with nodejs. This is my code ( I have hidden the PSID below ):

app.get('/helloguys', function (req, res) {

  var messageData = {
    batch: [
      {recipient: {id: "..."}},{recipient: {id: "..."}}
    ],
    message: {
      text: "Hi guys :)",
      metadata: "DEVELOPER_DEFINED_METADATA"
    }
  };

  request({
    uri: 'https://graph.facebook.com/v2.6/me/messages',
    qs: { access_token: token },
    method: 'POST',
    json: messageData

  }, function (error, response, body) {
       if (!error && response.statusCode == 200) {
         console.log("Ok", response.statusCode);
       } else {
         console.error("Failed calling Send API", response.statusCode, response.statusMessage, body.error);
       }
  });  

  res.send('Hi :)')

})

I get this in the nodejs console:

Ok 200

but users don't receive the message.

Why ?

EDIT for Lix:

body: 
2017-10-18T13:38:43.538998+00:00 app[web.1]:    [ { code: 400,
2017-10-18T13:38:43.538999+00:00 app[web.1]:        headers: [Object],
2017-10-18T13:38:43.538999+00:00 app[web.1]:        body: '{"error":{"message":"Unsupported get request. Please read the Graph API documentation at https:\\/\\/developers.facebook.com\\/docs\\/graph-api","type":"GraphMethodException","code":100,"error_subcode":33,"fbtrace_id":"Dd6+kHN7Tl+"}}' },

EDIT for CBroe:

  var messageData = {
    batch: [
      {method:"POST", message: "Hello", recipient: {id: "1552389158161227"}},{method:"POST", message: "Hello", recipient: {id: "1419003191530571"}}
    ]
  };

It doesn't work

EDIT for CBroe 2:

app.get('/helloguys', function (req, res) {

  var batch = [
      {method:"POST", body: "message=Test status update&recipient=..."},
      {method:"POST", body: "message=Test status update&recipient=..."}
    ];

  request({
    uri: 'https://graph.facebook.com/v2.6/me/messages',
    qs: { access_token: token },
    method: 'POST',
    json: batch

  }, function (error, response, body) {
       if (!error && response.statusCode == 200) {
         console.log("ok", response.statusCode, response.statusMessage, response);
         res.send('hi')
       } else {
         console.error("Failed calling Send API", response.statusCode, response.statusMessage, body.error);
       }
  });  

})

And now I get:

2017-10-18T15:36:05.981999+00:00 app[web.1]: Failed calling Send API 400 Bad Request { message: '(#100) The parameter recipient is required',
2017-10-18T15:36:05.982009+00:00 app[web.1]:   type: 'OAuthException',
2017-10-18T15:36:05.982010+00:00 app[web.1]:   code: 100,
2017-10-18T15:36:05.982011+00:00 app[web.1]:   fbtrace_id: 'EJLQgP9UoMT' }

Solution

  • As per FB dev docs (they stated somewhere within the docs, and not very obvious)

    Note the URLEncoding for the body param

    Also, multiple POST requests (batched requests):

    While GET and DELETE operations must only have a relative_url and a method field, POST and PUT operations may contain an optional body field.

    And >>

    This should be formatted as a raw HTTP POST body string, similar to a URL query string.

    Also, this type of request should be made as multipart/form-data.

    Then, batch request requirements are: (1) to be multipart/form-data; (2) consist of URLEncoding strings in 'body' parameter; (3) batch request should be raw HTTP POST body string.

    Node.js request module could send form-data (through form-data module). See docs

    So, your code should be like this >>

    app.get('/helloguys', function (req, res) {
    
      var batchUrl = 'https://graph.facebook.com';
      var r = request.post(batchUrl, function(error, response, body) {
        if (error) {return console.log("error\n", error)};
        console.log("successfull\n", body) //but fb sends error in body message, so check body.error for any errors
      });
    
      var form = r.form();
      var multipleMessages = [];
      var message = "message=" + encodeURIComponent(JSON.stringify(
              {
                "text": "​Hi guys :)"
              }
      ));
    
      //loop throught user IDs (PSIDs)
      for (var i=0; i<users; i++) {
        var recipient = "recipient=" + encodeURIComponent(JSON.stringify({"id": users[i].id}));
    
        var batchMessage = {
          "method": "POST",
          "relative_url":"v2.6/me/messages",
          "body": recipient + "&" + message
        };
        multipleMessages.push(batchMessage);
      }
    
      form.append("access_token", token)
      form.append("batch", JSON.stringify(multipleMessages)); 
    
      res.send('Hi :)')
    
    })