actualmente estoy tratando de hacer un envoltorio delgado alrededor de la API de Whatsapp Cloud. Uno de los problemas que estoy enfrentando actualmente es que la carga de archivos multimedia no funciona.
Mirando a través de la documentación para cargar archivos , parece que espera una carga útil multipart/form-data en el punto final.
Aquí está mi implementación actual
import FormData from 'form-data'; import fs from 'fs'; import axios from 'axios'; const formData = new FormData(); formData.append('file', fs.createReadStream('path/to/my/file.jpg')); formData.append('messaging_product', 'whatsapp'); formData.append('type', 'image/jpeg'); await axios.post('https://graph.facebook.com/v14.0/PHONE_NO_ID/media', formData, { headers: { 'Authorization': ACCESS_TOKEN } }); Mirando el error que devuelve, parece que de alguna manera me falta el campo messaging_product a pesar de que lo agregué correctamente en formData.
{ "error": { "message": "(#100) The parameter messaging_product is required.", "type": "OAuthException", "code": 100, "fbtrace_id": "FBTRACE_ID" } } La colección Postman funciona para cargar archivos multimedia, por lo que creo que el problema es el campo de file de formData. ¿Es fs.createReadStream en un archivo equivalente a cómo Postman maneja la carga de archivos?
EDITAR: La pregunta se resolvió, los problemas no se agregaban en los encabezados generados por formData, ¡Gracias Phil a continuación!
Me encanta la documentación... dicen que el type es un parámetro obligatorio y luego muestran un ejemplo de curl sin él 🤦.
Además, file no es el...
Ruta al archivo almacenado en su directorio local
sino un binario codificado en mime.
En cualquier caso, el type debe ser parte de la codificación MIME a través de los metadatos content-type y luego debe reenviar el encabezado del tipo de contenido generado por FormData .
También es posible que te falte el esquema de token de autenticación de Bearer .
const PHONE_NO_ID = "something"; const ACCESS_TOKEN = "something"; const formData = new FormData(); formData.append("file", fs.createReadStream("path/to/my/file.jpg"), { contentType: "image/jpeg", }); formData.append("messaging_product", "whatsapp"); try { const { data: { id: mediaId }, } = await axios.post( `https://graph.facebook.com/v14.0/${PHONE_NO_ID}/media`, formData, { headers: { Authorization: `Bearer ${ACCESS_TOKEN}`, // "Bearer" prefix ...formData.getHeaders(), // merge in FormData headers }, } ); console.log("media ID", mediaId); } catch (err) { console.error("upload", err.toJSON()); }