GET_MEDIA - Obter Arquivo de Mídia
O que é este Node?
O GET_MEDIA é o node responsável por baixar arquivos de mídia enviados pelos usuários via WhatsApp Business API.
Por que este Node existe?
Receber mídia é essencial. O GET_MEDIA existe para:
- Download de arquivos: Obter mídia enviada por usuários
- Processamento: Analisar imagens, documentos recebidos
- Armazenamento: Salvar arquivos em sistema próprio
- Análise: Processar imagens com OCR, reconhecimento
- Backup: Guardar evidências, comprovantes enviados
Como funciona internamente?
Quando o GET_MEDIA é executado, o sistema:
- Requer mediaId: ID da mídia a ser baixada (do webhook)
- Faz requisição: GET para obter URL de download
- Retorna URL: URL temporária para baixar arquivo
- Download opcional: URL expira em tempo limitado
- Erro se incompleto: Implementação requer parâmetro mediaId
Código interno (whatsapp-meta-executor.service.ts:634-638):
private async getMedia(data: WhatsAppMetaNodeData): Promise<any> {
// This would require a media ID to be passed
// Implementation depends on specific requirements
throw new Error('getMedia operation not fully implemented - requires media ID parameter');
}
Status de Implementação
⚠️ IMPLEMENTAÇÃO PARCIAL: Esta operação requer parâmetro mediaId adicional que não está totalmente implementado no código base atual.
Para usar esta funcionalidade:
- Adicione campo
mediaIdaos parâmetros - Implemente lógica de download via API Graph
- Retorne URL ou conteúdo do arquivo
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| operation | string | Sim | Deve ser "get_media" |
| accessToken | string | Sim | Token de acesso da WhatsApp Business API |
| phoneNumberId | string | Sim | ID do número WhatsApp Business |
| mediaId | string | Sim | ID da mídia a ser baixada ⚠️ Requer implementação |
Exemplo de Implementação Completa
private async getMedia(data: WhatsAppMetaNodeData): Promise<any> {
if (!data.mediaId) {
throw new Error('mediaId is required for getMedia operation');
}
// 1. Get media URL
const mediaInfoResponse = await axios.get(
`${this.WHATSAPP_API_BASE}/${data.mediaId}`,
{
headers: {
'Authorization': `Bearer ${data.accessToken}`
}
}
);
const mediaUrl = mediaInfoResponse.data.url;
const mimeType = mediaInfoResponse.data.mime_type;
// 2. Download media file
const mediaResponse = await axios.get(mediaUrl, {
headers: {
'Authorization': `Bearer ${data.accessToken}`
},
responseType: 'arraybuffer'
});
return {
mediaId: data.mediaId,
mimeType: mimeType,
size: mediaInfoResponse.data.file_size,
url: mediaUrl,
data: Buffer.from(mediaResponse.data).toString('base64')
};
}
Exemplo de Flow (Conceitual)
{
"name": "Download Mídia - GET_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": "MediaId do Webhook",
"parameters": {
"variableName": "webhook",
"value": {
"mediaId": "1234567890123456"
}
}
}
},
{
"id": "whatsapp_1",
"type": "whatsapp_meta",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Baixar Mídia",
"parameters": {
"operation": "get_media",
"accessToken": "EAAxxxxxxxx",
"phoneNumberId": "123456789",
"mediaId": "{{webhook.mediaId}}"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Mídia baixada com sucesso!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "whatsapp_1" },
{ "source": "whatsapp_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Como Obter mediaId
O mediaId vem do webhook quando usuário envia mídia:
{
"object": "whatsapp_business_account",
"entry": [{
"changes": [{
"value": {
"messages": [{
"type": "image",
"image": {
"id": "1234567890123456",
"mime_type": "image/jpeg",
"sha256": "..."
}
}]
}
}]
}]
}
Resposta Esperada
{
"mediaId": "1234567890123456",
"mimeType": "image/jpeg",
"size": 245680,
"url": "https://lookaside.fbsbx.com/whatsapp_business/attachments/?mid=...",
"data": "base64_encoded_file_data"
}
Boas Práticas
✅ SIM: - Implemente download completo antes de usar - Armazene mídia em seu storage (S3, etc) - Valide tipo de arquivo recebido - Processe mídia de forma assíncrona - Defina timeout para downloads grandes
❌ NÃO: - Não confie apenas na URL temporária (expira) - Não processe arquivos muito grandes de forma síncrona - Não ignore validação de tipo de arquivo - Não exponha URLs de download publicamente
Dicas
💡 Webhook: Configure webhook para receber mediaId quando usuário envia mídia 💡 Expiração: URL de download expira em tempo limitado (baixe imediatamente) 💡 Storage: Salve arquivos em S3, Google Cloud Storage ou similar 💡 Processamento: Use filas (SQS, RabbitMQ) para processar mídia grande 💡 Tipos suportados: Imagens, vídeos, áudios, documentos
Próximo Node
→ SEND_MEDIA - Enviar mídia → SEND_IMAGE - Enviar imagens → SEND_DOCUMENT - Enviar documentos