# Troubleshooting: Áudio e Imagem não aparecem no Chatwoot (WhatsApp via WuzAPI) **Data:** 2026-02-28 **Branch:** fix-media-audio-v2 **Canal:** WhatsApp via WuzAPI --- ## Sintomas - Áudio exibe `00:00 / 00:00` e não toca - Imagem exibe "Esta imagem não está mais disponível" - Mensagens de texto chegam normalmente - Transcrição do áudio aparece corretamente, mas o áudio não toca --- ## ⚡ Diagnóstico Rápido (comece aqui) Antes de ler tudo, rode esses comandos na ordem. O primeiro que falhar identifica o bug. ```bash # 1. Arquivo chegou? Descriptografia OK? grep -E "WuzAPI Decrypt|SUCCESS|invalid format" log/development.log | tail -5 # 2. Arquivo está no disco? bin/rails runner "a = Attachment.last; puts a.file.blob.byte_size; puts File.binread(ActiveStorage::Blob.service.path_for(a.file.blob.key), 4).bytes.map{|b| '%02X'%b}.join(' ')" # 3. URL que o browser recebe é relativa ou absoluta? grep "data_url" log/development.log | tail -3 ``` **Interpretação:** | Resultado | Bug | |-----------|-----| | Sem `WuzAPI Decrypt:` nos logs | Bug 5 (PayloadParser sem `attachment_params`) | | `WuzAPI Decrypt Error: NoMethodError` | Bug 3 (`update!` em vez de `update`) | | Bytes: `31 88 d2` ou similares (não FF D8, 4F 67, 89 50) | Bug 2 (arquivo encriptado) | | URL absoluta `https://ngrok-url/...` | Bug 4 (ngrok interstitial — ver abaixo) | | URL relativa `/rails/active_storage/...` e bytes válidos | Bug de infra (Sidekiq parado, ngrok caído) | --- ## Diagnóstico — Root Causes Havia **seis bugs independentes** documentados ao longo do tempo. Os primeiros três são históricos. Os outros três surgiram com refatorações. --- ### Bug 1 — URL de mídia apontando para `localhost` hardcoded *(histórico)* **Arquivo:** `app/models/attachment.rb` **Problema:** `file_url` e `thumb_url` geravam URLs hardcoded com `localhost:3000`. O browser acessando via ngrok não consegue resolver `localhost:3000` diretamente. ```ruby # QUEBRADO: rails_storage_proxy_url(file, host: 'localhost:3000', protocol: 'http') ``` **Resolvido em:** commit `6b214b38d` — passou a usar `dev_url_options` que lê `FRONTEND_URL`. --- ### Bug 2 — Arquivo de mídia salvo criptografado *(histórico)* **Arquivo:** `app/services/whatsapp/incoming_message_wuzapi_service.rb` + `decryption_service.rb` **Problema:** O fluxo de download tinha 3 métodos em cascata: | Método | O que faz | Status | |--------|-----------|--------| | Method 1 | WuzAPI `/chat/downloadimage` endpoint | ❌ Sempre falhava com `502 Bad Gateway` | | Method 2 | `DecryptionService` com `Net::HTTP` | ❌ `Net::HTTP` não segue redirects → `nil` silencioso | | Method 3 | `Down.download` direto do CDN | ⚠️ Baixava mas salvava bytes **encriptados** | O arquivo no disco começava com bytes aleatórios (`31 88 d2...`) em vez de `FF D8 FF` (JPEG) ou `4F 67 67 53` (OGG). **Correção:** Unificar Methods 2+3: `Down.download` (que segue redirects) → descriptografar → salvar. **Resolvido em:** commit `6b214b38d` --- ### Bug 3 — `OpenSSL::Cipher#update!` não existe em Ruby *(histórico)* **Arquivo:** `app/services/whatsapp/decryption_service.rb` ```ruby # QUEBRADO: decipher.update!(data) + decipher.final # CORRETO: decipher.update(data) + decipher.final ``` **Resolvido em:** commit `6b214b38d` --- ### Bug 4 — ngrok interstitial bloqueia mídia no browser *(recorrente — leia com atenção)* **Arquivo:** `app/models/attachment.rb` **Problema:** Mesmo com o Bug 1 corrigido, a URL da mídia era gerada como absoluta com o host do ngrok: ``` https://SEU-NGROK.ngrok-free.dev/rails/active_storage/blobs/proxy/.../file.ogg ``` O ngrok exibe uma **página HTML de aviso** para qualquer request de browser sem o cookie ngrok válido. Quando `` ou `