SEND_MEDIA - Enviar Mídia Genérica
O que é este Node?
O SEND_MEDIA é o node responsável por enviar arquivos de mídia genéricos via WhatsApp Business API (imagens, vídeos, documentos ou áudios).
Por que este Node existe?
Comunicação visual é essencial. O SEND_MEDIA existe para:
- Flexibilidade: Enviar qualquer tipo de mídia com um único node
- Compartilhamento: Enviar arquivos, fotos, vídeos
- Legendas: Adicionar texto explicativo à mídia
- Múltiplos formatos: Suportar diversos tipos de arquivo
- IDs ou URLs: Aceitar mídia por link ou ID já enviado
Como funciona internamente?
Quando o SEND_MEDIA é executado, o sistema:
- Detecta tipo de mídia: Determina se é image, video, document ou audio
- Valida fonte: Verifica se tem mediaUrl ou mediaId
- Constrói payload: Cria objeto com tipo correto e parâmetros
- Adiciona caption: Inclui legenda se fornecida
- Envia para API: POST para Graph API v18.0
- Retorna resultado: message_id e status
Código interno (whatsapp-meta-executor.service.ts:393-434):
private async sendMedia(data: WhatsAppMetaNodeData): Promise<any> {
const mediaType = this.getMediaType(data.operation!);
const mediaUrl = this.getMediaUrl(data);
const mediaId = this.getMediaId(data);
const caption = this.getMediaCaption(data);
const mediaObject: any = {};
if (mediaId) {
mediaObject.id = mediaId;
} else {
mediaObject.link = mediaUrl;
}
if (caption) {
mediaObject.caption = caption;
}
if (data.operation === 'send_document' && data.documentFilename) {
mediaObject.filename = data.documentFilename;
}
const payload = {
messaging_product: 'whatsapp',
to: data.recipientPhone,
type: mediaType,
[mediaType]: mediaObject
};
const response: AxiosResponse = await axios.post(
`${this.WHATSAPP_API_BASE}/${data.phoneNumberId}/messages`,
payload,
{
headers: {
'Authorization': `Bearer ${data.accessToken}`,
'Content-Type': 'application/json'
}
}
);
return response.data;
}
Quando você DEVE usar este Node?
Use SEND_MEDIA quando precisar enviar qualquer tipo de mídia:
Casos de uso
- Enviar comprovante: PDF, imagem de boleto
- Catálogo de produtos: Fotos de itens
- Tutoriais: Vídeos explicativos
- Áudio: Mensagens de voz pré-gravadas
- Documentos: Contratos, manuais, relatórios
Quando NÃO usar SEND_MEDIA
- Tipos específicos: Prefira SEND_IMAGE, SEND_VIDEO, SEND_DOCUMENT para clareza
- Stickers: Use SEND_STICKER ao invés
- Localização: Use SEND_LOCATION ao invés
Parâmetros Detalhados
mediaUrl (string, condicional)
O que é: URL pública do arquivo de mídia a ser enviado. Obrigatório se mediaId não fornecido.
Padrão: Nenhum
Flow completo para testar:
{
"name": "Teste SEND_MEDIA - Media URL",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "whatsapp_1",
"type": "whatsapp_meta",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Enviar Mídia",
"parameters": {
"operation": "send_media",
"accessToken": "EAAxxxxxxxx",
"phoneNumberId": "123456789",
"recipientPhone": "5511999999999",
"mediaUrl": "https://exemplo.com/imagem.jpg",
"mediaCaption": "Confira esta imagem!"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Mídia enviada com sucesso!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "whatsapp_1" },
{ "source": "whatsapp_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: URL deve ser HTTPS e publicamente acessível. WhatsApp fará download do arquivo.
mediaId (string, condicional)
O que é: ID de mídia já enviada previamente ao WhatsApp. Obrigatório se mediaUrl não fornecido.
Padrão: Nenhum
Flow completo para testar:
{
"name": "Teste SEND_MEDIA - Media ID",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "whatsapp_1",
"type": "whatsapp_meta",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Enviar Mídia por ID",
"parameters": {
"operation": "send_media",
"accessToken": "EAAxxxxxxxx",
"phoneNumberId": "123456789",
"recipientPhone": "5511999999999",
"mediaId": "1234567890123456",
"mediaCaption": "Reenviando arquivo"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Mídia reenviada via ID!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "whatsapp_1" },
{ "source": "whatsapp_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Use ID retornado de envio anterior para reenviar mesmo arquivo sem re-upload.
mediaCaption (string, opcional)
O que é: Texto descritivo que acompanha a mídia (legenda).
Padrão: Nenhum
Flow completo para testar:
{
"name": "Teste SEND_MEDIA - Caption",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "whatsapp_1",
"type": "whatsapp_meta",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Enviar com Legenda",
"parameters": {
"operation": "send_media",
"accessToken": "EAAxxxxxxxx",
"phoneNumberId": "123456789",
"recipientPhone": "5511999999999",
"mediaUrl": "https://exemplo.com/produto.jpg",
"mediaCaption": "🎁 Produto em Destaque\n\nCaneca Personalizada\nR$ 29,90\n\nCompre já!"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Mídia com legenda enviada!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "whatsapp_1" },
{ "source": "whatsapp_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Caption aparece como texto abaixo da mídia no WhatsApp.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| operation | string | Sim | Deve ser "send_media" |
| accessToken | string | Sim | Token de acesso da WhatsApp Business API |
| phoneNumberId | string | Sim | ID do número WhatsApp Business |
| recipientPhone | string | Sim | Número do destinatário |
| mediaUrl | string | Condicional | URL da mídia (obrigatório se sem mediaId) |
| mediaId | string | Condicional | ID da mídia (obrigatório se sem mediaUrl) |
| mediaCaption | string | Não | Legenda da mídia |
Exemplo 1: Enviar Catálogo de Produtos
Objetivo: Enviar múltiplas imagens de produtos com descrição.
JSON para Importar
{
"name": "Catálogo WhatsApp - SEND_MEDIA",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "message_1",
"type": "message",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Saudação",
"parameters": {
"message": "🛍️ Bem-vindo à nossa loja!\n\nConfira nossos produtos em destaque:"
}
}
},
{
"id": "delay_1",
"type": "delay",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Aguardar",
"parameters": {
"duration": 2,
"unit": "seconds"
}
}
},
{
"id": "whatsapp_1",
"type": "whatsapp_meta",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Produto 1",
"parameters": {
"operation": "send_media",
"accessToken": "EAAxxxxxxxx",
"phoneNumberId": "123456789",
"recipientPhone": "5511999999999",
"mediaUrl": "https://loja.com/images/produto1.jpg",
"mediaCaption": "🎧 Fone Bluetooth Premium\nR$ 149,90\nFrete Grátis!\n\nCódigo: FON001"
}
}
},
{
"id": "delay_2",
"type": "delay",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Aguardar",
"parameters": {
"duration": 2,
"unit": "seconds"
}
}
},
{
"id": "whatsapp_2",
"type": "whatsapp_meta",
"position": { "x": 1100, "y": 100 },
"data": {
"label": "Produto 2",
"parameters": {
"operation": "send_media",
"accessToken": "EAAxxxxxxxx",
"phoneNumberId": "123456789",
"recipientPhone": "5511999999999",
"mediaUrl": "https://loja.com/images/produto2.jpg",
"mediaCaption": "⌚ Smartwatch Pro\nR$ 299,90\n12x sem juros\n\nCódigo: SMT002"
}
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 1300, "y": 100 },
"data": {
"label": "Finalizar",
"parameters": {
"message": "💬 Interessou? Responda com o código do produto!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1500, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "delay_1" },
{ "source": "delay_1", "target": "whatsapp_1" },
{ "source": "whatsapp_1", "target": "delay_2" },
{ "source": "delay_2", "target": "whatsapp_2" },
{ "source": "whatsapp_2", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Saída esperada:
Sistema: 🛍️ Bem-vindo à nossa loja! Confira nossos produtos em destaque:
[Aguarda 2s]
[Imagem: produto1.jpg]
🎧 Fone Bluetooth Premium
R$ 149,90
Frete Grátis!
Código: FON001
[Aguarda 2s]
[Imagem: produto2.jpg]
⌚ Smartwatch Pro
R$ 299,90
12x sem juros
Código: SMT002
Sistema: 💬 Interessou? Responda com o código do produto!
Exemplo 2: Enviar Comprovante
Objetivo: Enviar comprovante de pagamento em PDF após confirmação.
JSON para Importar
{
"name": "Envio de Comprovante - SEND_MEDIA",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Dados Pagamento",
"parameters": {
"variableName": "payment",
"value": {
"customerPhone": "5511999999999",
"orderId": "ORD-12345",
"amount": "R$ 350,00",
"receiptUrl": "https://sistema.com/receipts/12345.pdf"
}
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Notificar",
"parameters": {
"message": "✅ Pagamento confirmado!\n\nPedido: {{payment.orderId}}\nValor: {{payment.amount}}\n\nEnviando comprovante..."
}
}
},
{
"id": "whatsapp_1",
"type": "whatsapp_meta",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Enviar Comprovante",
"parameters": {
"operation": "send_media",
"accessToken": "EAAxxxxxxxx",
"phoneNumberId": "123456789",
"recipientPhone": "{{payment.customerPhone}}",
"mediaUrl": "{{payment.receiptUrl}}",
"mediaCaption": "📄 Comprovante de Pagamento\n\nPedido: {{payment.orderId}}\nValor: {{payment.amount}}\n\nGuarde este documento para referência futura."
}
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Concluir",
"parameters": {
"message": "🎉 Obrigado pela compra!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "message_1" },
{ "source": "message_1", "target": "whatsapp_1" },
{ "source": "whatsapp_1", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Saída esperada:
Sistema: ✅ Pagamento confirmado!
Pedido: ORD-12345
Valor: R$ 350,00
Enviando comprovante...
[PDF: comprovante-12345.pdf]
📄 Comprovante de Pagamento
Pedido: ORD-12345
Valor: R$ 350,00
Guarde este documento para referência futura.
Sistema: 🎉 Obrigado pela compra!
Resposta do Node
{
"messaging_product": "whatsapp",
"contacts": [
{
"input": "5511999999999",
"wa_id": "5511999999999"
}
],
"messages": [
{
"id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABIYFjNBMzYxNzQyQ0JGRjREMTU0QzFEAA=="
}
]
}
Formatos Suportados
Imagens
- JPG/JPEG, PNG
- Máximo: 5MB
Vídeos
- MP4, 3GPP
- Máximo: 16MB
Documentos
- PDF, DOC, DOCX, XLS, XLSX, PPT, PPTX
- Máximo: 100MB
Áudios
- AAC, MP3, AMR, OGG (codec Opus)
- Máximo: 16MB
Boas Práticas
✅ SIM:
- Use HTTPS para mediaUrl
- Otimize tamanho de arquivos antes de enviar
- Use mediaId para reenviar mesmo arquivo (economiza bandwidth)
- Inclua caption descritivo para contexto
- Valide formato e tamanho antes de enviar
❌ NÃO:
- Não envie URLs HTTP (apenas HTTPS aceito)
- Não ultrapasse limites de tamanho por tipo
- Não envie arquivos protegidos por senha
- Não use URLs que expiram rapidamente
- Não envie mídia sem verificar formato suportado
Dicas
💡 Cache de mídia: WhatsApp armazena mídia por 30 dias. Use mediaId para reenvios.
💡 URLs públicas: Certifique-se que URL não requer autenticação.
💡 Tamanho: Comprima imagens/vídeos grandes para melhor performance.
💡 Caption limits: Imagens e vídeos suportam caption, áudios não.
💡 Download timeout: WhatsApp tem 5 segundos para baixar arquivo da URL.
Próximo Node
→ SEND_IMAGE - Enviar especificamente imagens → SEND_DOCUMENT - Enviar especificamente documentos → SEND_VIDEO - Enviar especificamente vídeos → SEND_AUDIO - Enviar especificamente áudios