Facebook Messenger:如何使用 nodejs 发送多条消息

Facebook Messenger: How to send multiple messages with nodejs

我只想向所有使用 nodejs 的订阅者发送消息。 这是我的代码(我隐藏了下面的 PSID):

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 :)')

})

我在 nodejs 控制台中得到这个:

Ok 200

但用户没有收到消息。

为什么?

为 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+"}}' },

为 CBroe 编辑:

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

没用

编辑 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);
       }
  });  

})

现在我得到:

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' }

尝试在请求回调中移动 res.send('Hi'):

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

根据FB dev docs(他们在文档中的某处说明,不是很明显)

Note the URLEncoding for the body param

此外,多个 POST 请求(批处理请求):

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.

和>>

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

此外,此类请求应作为 multipart/form-data。

那么,批量请求需求为: (1) 成为 multipart/form-data; (2) 由'body'参数中的URLEncoding字符串组成; (3) 批量请求应该是raw HTTP POST body string.

Node.js request 模块可以发送表单数据(通过 form-data 模块)。参见 docs

那么,你的代码应该是这样的>>

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 :)')

})