0

我只想發送消息給所有具有nodejs的訂閱者。 這是我的代碼(我已經隱藏下面的PSID):Facebook Messenger:如何使用nodejs發送多條消息

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

什麼是響應其餘包含哪些內容? – Lix

+0

@Lix我已經添加了上面的回覆。請看看:) – xRobot

+0

通過這個端點發送消息需要一個POST請求,而不是GET。您需要在JSON批處理數據中指定請求方法。 – CBroe

回答

1

按照FB dev docs(他們的地方規定的文檔內,不是很明顯)

注意URLEncoding爲體PARAM

而且,多個POST請求(批處理請求):

雖然GET和DELETE操作必須只具有relative_url和方法領域中,POST和PUT操作可以含有可選機構字段。

和>>

這應該被格式化爲原始HTTP POST體中的字符串,類似於一個URL查詢字符串。

此外,這種類型的請求應該作爲multipart/form-data。

然後,批量請求要求爲: (1)爲multipart/form-data; (2)由'body'中的URLEncoding字符串組成參數; (3)批量請求應該是原始HTTP POST正文字符串。

節點。js 請求模塊可以發送表格數據(通過表格數據模塊)。見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

嘗試移動res.send( '你好')您的請求回調中:

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); 
     } 
    }); 
+0

我得到了相同的錯誤問題 – xRobot

相關問題