【问题标题】:How can I send a file to Facebook Send API using npm's Request without uploading the file?如何在不上传文件的情况下使用 npm 的请求将文件发送到 Facebook Send API?
【发布时间】:2016-11-25 20:30:54
【问题描述】:

我正在实现一个使用 Facebook 发送 API 的机器人。根据documentation,可以使用请求发送文件。该文档提供了两种方法,一种是向文件发送 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: '***' 
 }

【问题讨论】:

  • 你在你的问题中遗漏了一些非常重要的东西:究竟什么不起作用?你调试了吗?回调中有任何信息吗?它被调用了吗? “这是我的解决方案,但它不起作用”对于stackoverflow来说有点过于宽泛了。
  • 现在添加。谢谢。

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


【解决方案1】:

您收到的错误是因为"attachment":{} 需要位于名为 message 的对象内。您必须使用 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 文件

【讨论】:

    【解决方案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”的示例代码。您正在使用“表单”,这似乎是用于常规数据。

    【讨论】:

    • 我明确表示不想上传文件。为了使用这个示例函数,我必须有一个文件的 URL。我没有文件的网址,我想直接上传。
    • 文件必须在服务器上,为什么不使用url呢?为什么你没有网址?我不明白。
    • 不知道你为什么投反对票,我只是想帮助一个更简单的解决方案。无论如何,这不是一个错误的解决方案,它会起作用 - 只需一个 url。用户无论如何都会得到文件,所以为什么不这样做呢?
    • 编辑了答案,见最后几句。它应该是 formData,而不是 form——至少 request 模块的官方文档是这么说的。
    • 不是每个人都将 Node.js 作为 Web 服务器运行。上传文件而不是提供 URL 是非常有意义的。
    猜你喜欢
    • 1970-01-01
    • 2020-04-08
    • 2020-10-11
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2023-03-11
    相关资源
    最近更新 更多