2016-11-25 95 views
2

我正在實現一個使用Facebook的發送API的機器人。根據documentation可以使用請求發送文件。該文檔提供了兩種方法,一種是將URL發送到文件,另一種是上傳文件。我不想上傳文件並給它一個URL,因爲這是一個開放源代碼庫,不希望假設任何有關實現的內容。如何發送文件到Facebook使用npm的請求發送API而無需上傳文件?

我確實想直接上傳文件。上傳該文件的文檔使用cURL的例子,如下所示:

curl \ 
    -F recipient='{"id":"USER_ID"}' \ 
    -F message='{"attachment":{"type":"file", "payload":{}}}' \ 
    -F [email protected]/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: '***' 
} 
+1

你缺少一些在你的問題中非常重要的東西:究竟哪些不起作用?你調試過嗎?回調中的任何信息?它會被叫嗎? 「這是我的解決方案,但它不起作用」對於計算器來說有點過於寬泛。 – luschn

+0

現在添加。謝謝。 –

回答

-2

官方示例應用包括用於經由URL文件上傳的函數: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」示例代碼中部分。您正在使用「表單」,這似乎是針對常規數據。

+0

我明確表示我不想上傳文件。爲了使用這個示例函數,我必須有一個文件的URL。我沒有該文件的URL,我想直接上傳。 –

+0

該文件必須在服務器上,那麼爲什麼不使用url呢?你爲什麼沒有網址?我不明白。 – luschn

+0

不知道爲什麼你低估了,我只是想幫助一個更簡單的解決方案。無論如何,這並不是一個錯誤的解決方案,它只會帶來一個url。無論如何,用戶都會得到這個文件,爲什麼不這樣做呢? – luschn

2

您收到的錯誤是因爲"attachment":{}需要在名爲消息的對象內。您必須使用Facebook發送API發送消息或sender_action對象。

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

       } 

的Facebook應該接受你的API調用後,這一點,但是我無法顯示使用驗證碼發送jpg文件。也許它會與你的JSON文件一起工作