当前位置: 首页 > 知识库问答 >
问题:

如何在节点JS中使用facebook messenger发送图像API?

淳于亦
2023-03-14

我正在用facebook信使API在nodejs中构建一个facebook机器人。我试图通过直接上传heroku服务器本身的图像文件(而不是通过URL),从机器人发送图像,但它不起作用。

以下是控制台的错误日志。

调用Send API 400错误请求失败{消息:'(#100)上载的文件数不正确。必须只上载一个文件。',类型:'OAuthException',代码:100,error_subcode:2018005,FBTrace_ID:'E32OGM/OFXD'}

官方的facebook文档只包含一个curl格式的示例,我不知道如何将这个curl复制成节点格式。

curl  \   -F 'recipient={"id":"recipientId"}' \   -F 'message={"attachment":{"type":"image", "payload":{}}}' \   -F 'filedata=@resource/pdf_img/sample.jpg;type=image/jpeg' \   "https://graph.facebook.com/v2.6/me/messages?access_token=PAGE_ACCESS_TOKEN"
//file_loc = __dirname+"/resource/pdf_img/sample.jpg"
function sendImageMessage(recipientId, file_loc){
    let fs = require('fs');
    var readStream = fs.createReadStream(file_loc);
    var messageData = {
        recipient : {
            id : recipientId
        },
        message : {
            attachment : {
                type : "image",
                payload :{}
            }
        },
        filedata:readStream
    }
    callSendAPI(messageData);
}
function callSendAPI(messageData) {
    request({
        uri: "https://graph.facebook.com/v2.6/me/messages",
        qs: {access_token: process.env.PAGE_ACCESS_TOKEN},
        method: "POST",
        json: messageData
    }, function(error, response, body) {
        if (!error && response.statusCode == 200) {
            var recipientId = body.recipient_id;
            var messageId = body.message_id;

            if (messageId) {
                console.log("Successfully sent message with id %s to recipient %s", 
                    messageId, recipientId);
            } else {
                console.log("Successfully called Send API for recipient %s", 
                    recipientId);
            }
        } else {
            console.error("Failed calling Send API", response.statusCode, response.statusMessage, body.error);
        }
    });
} 

请任何帮助修复我的节点实现或翻译卷曲到节点将不胜感激。

共有1个答案

李胡媚
2023-03-14

您可以在请求模块中使用forms/form-data/(它集成了模块'form-data')。但是所有的请求都需要严格化。因此,根据您的示例,以下内容应该完成该工作>>

function sendImageMessage(recipientId, file_loc){
    let fs = require('fs');
    var readStream = fs.createReadStream(file_loc);
    var messageData = {
        recipient : {
            id : recipientId
        },
        message : {
            attachment : {
                type : "image",
                payload :{}
            }
        },
        filedata:readStream
    }
    callSendAPI(messageData);
}

function callSendAPI(messageData) {
    var endpoint = "https://graph.facebook.com/v2.6/me/messages?access_token=" + process.env.PAGE_ACCESS_TOKEN;
    var r = request.post(endpoint, function(err, httpResponse, body) {
        if (err) {return console.error("upload failed >> \n", err)};
        console.log("upload successfull >> \n", body); //facebook always return 'ok' message, so you need to read error in 'body.error' if any
    });
    var form = r.form();
    form.append('recipient', JSON.stringify(messageData.recipient));
    form.append('message', JSON.stringify(messageData.message));
    form.append('filedata', messageData.filedata); //no need to stringify!
}

详情请参阅https://github.com/request/request#forms

 类似资料:
  • 为空。对如何发送图像有什么建议吗? 谢了。

  • 我正在使用谷歌云视觉检测图像上的文本。这种方法在80%的情况下有效。另外20%,我得到了这个错误: 当我在谷歌上搜索这个问题时,似乎我需要发送特定的标题和我的请求来解决这个问题,基本上就像这里指定的:https://cloud.google.com/vision/docs/ocr#specify_the_language_optional 但是,我不知道如何用我正在使用的Node.js代码发送这些

  • 我正在Node上开发一个web应用程序。js(express 4),用户可以通过上传到服务器来设置他们的个人资料图像。我们已经限制了文件mimetype和最大文件大小,因此用户上传的png或jpeg图像不能超过200KB。 问题是,我们希望将上传的图像分辨率(服务器端)调整为200x200,以提高页面加载并节省磁盘空间。经过一些研究,所有答案都指向使用基于ImageMagick或GraphicsM

  • 我正在使用Mongoostic,它工作得很好,但我面临的问题是,如何从方法并将其传递给方法? 例如: 你们是怎么解决这个问题的?这是一个非常基本的搜索,用户搜索时,它会将用户重定向到另一个页面,在那里它要么显示已找到的结果,要么未找到。

  • 我是一名服务器端开发人员,学习vanilla JS的诀窍。我需要澄清我的概念,即为我在JS中创建的图像对象发送Ajax POST请求——这个问题与此有关。 想象一下一个网络应用,用户上传照片供他人查看。在上传每个图像时,我使用vanilla JS确认图像的mime类型(通过解释幻数),然后调整图像大小以达到优化目的。 调整大小后,我会: 返回的图像对象必须通过Ajax请求发送到后端。比如: 然而,

  • 我已经在一个项目上工作了很长一段时间,我一直在使用Firebase。我已经实现了应用程序所需的所有Firebase功能。但我唯一的困惑是,FCM。 基本上,我有两个应用程序链接到Firebase项目。一个是消费者应用程序,另一个是管理员应用程序。现在,我正试图通知管理员何时有新订单到达,或何时有用户想与他们聊天。我已经成功地通过消费者应用程序使用node js和Firebase功能通知用户,但我无