如何在不上传文件的情况下使用npm的请求将文件发送到Facebook Send API?

时间:2016-11-25 20:30:54

标签: javascript facebook npm-request facebook-send-api

我正在实施一个使用Facebook的Send API的机器人。根据{{​​3}},可以使用请求发送文件。该文档提供了两种方法,一种是将URL发送到文件,另一种是上传文件。我不想上传文件并给它一个URL,因为这是一个开源库,不想假设任何实现。

我确实想直接上传文件。上传文件的文档使用cURL作为示例,如下所示:

curl  \
  -F recipient='{"id":"USER_ID"}' \
  -F message='{"attachment":{"type":"file", "payload":{}}}' \
  -F filedata=@/tmp/receipt.pdf \
  "https://graph.facebook.com/v2.6/me/messages?access_token=PAGE_ACCESS_TOKEN"    

我目前的看法是看起来应该是这样的:

facebook_message.access_token = configuration.access_token;
var fileReaderStream = fs.createReadStream('./sampleData.json')
var formData = {
                "recipient": JSON.stringify({
                  "id":message.channel
               }),
               "attachment": JSON.stringify({
                  "type":"file", 
                  "payload":{}
               }),
               "filedata": fileReaderStream
               }

request({
         "method": 'POST',
         "json": true,
         "formData": formData,
         "uri": 'https://graph.facebook.com/v2.6/me/messages?access_token=' + configuration.access_token
        },
        function(err, res, body) {
               //***
        });

当我运行时,我收到以下回复:

{ 
  message: '(#100) Must send either message or state',
  type: 'OAuthException',
  code: 100,
  error_subcode: 2018015,
  fbtrace_id: '***' 
 }

2 个答案:

答案 0 :(得分:2)

您收到的错误是因为"attachment":{}需要位于名为message的对象中。您必须使用facebook send API发送消息或sender_action对象。

var formData = {
                "recipient": JSON.stringify({
                  "id":message.channel
               }),
               "message": JSON.stringify({
               "attachment": {
                  "type":"file",
                  "payload":{}
              }
          }),
               "filedata": fileReaderStream

               }

Facebook应该在此之后接受你的api调用,但是我无法显示使用你的代码发送的jpg文件。也许它适用于您的JSON文件

答案 1 :(得分:0)

官方示例应用包括通过网址上传文件的功能:https://github.com/fbsamples/messenger-platform-samples/blob/master/node/app.js

这是相关功能:

function sendFileMessage(recipientId) {
  var messageData = {
    recipient: {
      id: recipientId
    },
    message: {
      attachment: {
        type: "file",
        payload: {
          url: SERVER_URL + "/assets/test.txt"
        }
      }
    }
  };

  callSendAPI(messageData);
}

如果您真的想要这么做,请查看请求模块文档:https://www.npmjs.com/package/request#forms 在本节中使用“formData”查看示例代码。您正在使用“表单”,这似乎是常规数据。