如何通过Facebook Messaging API发送PDF文件对象(Node.js)
解决方案:直接发送PDFKit生成的Buffer到Messenger机器人
你的问题核心是Messenger API不支持通过JSON payload直接传递文件Buffer,必须使用multipart/form-data格式上传文件。以下是修改后的完整代码和说明:
问题分析
你当前的代码错误地将PDF Buffer直接放入attachment.payload中,然后用JSON格式发送请求。但Messenger的文件上传接口要求通过表单数据(multipart)提交文件内容,同时附带消息元数据。
修改后的代码
1. 保留generatePDF.js不变
该文件生成PDF Buffer的逻辑是正确的,无需修改。
2. 修改main.js
const pdf = require('./generatePDF'); const formData = require('form-data'); // 需要安装:npm install form-data // 顶层代码需包裹在async函数中 (async () => { const name = "John"; const generated_pdf = await pdf.createPDF(name); await sendMedia(sender_psid, generated_pdf); // 替换sender_psid为实际用户ID })(); async function sendMedia(sender_psid, fileBuffer) { try { const form = new formData(); // 添加收件人信息(序列化为JSON字符串) form.append('recipient', JSON.stringify({ id: sender_psid })); // 添加消息结构(指定附件类型为file) form.append('message', JSON.stringify({ attachment: { type: "file", payload: { is_reusable: true } // 可选:允许后续复用该附件 } })); // 添加PDF文件Buffer,指定文件名和MIME类型 form.append('filedata', fileBuffer, { filename: 'custom.pdf', contentType: 'application/pdf' }); callSendAPI(form); } catch (e) { console.log("Error sending media: ", e); } } function callSendAPI(form) { form.submit({ url: `https://graph.facebook.com/v7.0/me/messages?access_token=${process.env.FB_PAGE_TOKEN}`, method: 'POST' }, (err, res) => { if (!err) { console.log('Message sent!!!'); res.resume(); // 处理响应流 } else { console.error("Unable to send message:", err); } }); }
关键修改点
- 使用
form-data模块构建multipart表单,将PDF Buffer作为filedata字段上传 recipient和message字段必须序列化为JSON字符串,作为表单的普通字段提交- 指定文件的
filename和contentType,确保Messenger能正确识别文件类型 - 利用
form-data的submit方法发送请求,替代原有的request JSON请求
注意事项
- 确保安装依赖:
npm install form-data - 若使用较新的Messenger API版本(如v18.0),可替换URL中的版本号,兼容性更好
is_reusable参数设为true后,API会返回附件ID,后续可直接通过ID发送,无需重复上传文件- 检查你的Facebook Page Token是否拥有
pages_messaging权限,且未过期
内容的提问来源于stack exchange,提问作者Dummy Cron
相关产品推荐
相关产品推荐

