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

时间:2017-10-18 13:26:24

标签: node.js facebook-graph-api facebook-javascript-sdk facebook-messenger facebook-messenger-bot

我只想向所有具有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' }

2 个答案:

答案 0 :(得分:1)

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

  

请注意body param的 URLEncoding

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

  

虽然GET和DELETE操作只能有一个relative_url和一个方法字段,但POST和PUT操作可能包含一个可选的 body 字段。

和>>

  

这应格式化为原始HTTP POST正文字符串,类似于URL查询字符串。

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

然后,批量请求要求是: (1)是多部分/表格数据; (2)由' body' 参数中的URLEncoding字符串组成; (3)批处理请求应该是原始的HTTP POST正文字符串。

Node.js request 模块可以发送表单数据(通过表单数据模块)。见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 :)')

})

答案 1 :(得分:-1)

尝试在请求回调中移动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);
       }
  });