Pular para conteúdo

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:

  1. Download de arquivos: Obter mídia enviada por usuários
  2. Processamento: Analisar imagens, documentos recebidos
  3. Armazenamento: Salvar arquivos em sistema próprio
  4. Análise: Processar imagens com OCR, reconhecimento
  5. Backup: Guardar evidências, comprovantes enviados

Como funciona internamente?

Quando o GET_MEDIA é executado, o sistema:

  1. Requer mediaId: ID da mídia a ser baixada (do webhook)
  2. Faz requisição: GET para obter URL de download
  3. Retorna URL: URL temporária para baixar arquivo
  4. Download opcional: URL expira em tempo limitado
  5. 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:

  1. Adicione campo mediaId aos parâmetros
  2. Implemente lógica de download via API Graph
  3. 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