feat(n8n): reconstroi o fluxo em cima do Webhook do Canal (resolve imagem)

O 'Webhook do Canal' do Z-PRO (fora do ChatFlow, opcao 'Mensagens
recebidas') manda o payload completo da mensagem, incluindo msg.image.url
para fotos -- resolve a limitacao que bloqueava imagem. Novo endpoint
orcamento-exames-canal-zpro substitui o antigo orcamento-exames-zpro
(removido). Download da imagem autenticado com Bearer usando o bmToken do
proprio payload. Volta ao envio assincrono via sub-workflow enviar_texto,
ja que esse webhook e uma notificacao (nao e capturado/reenviado pelo
Z-PRO como no ChatFlow). Prompt volta a aceitar foto normalmente.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Eric
2026-08-21 10:16:09 -03:00
co-authored by Claude Sonnet 5
parent fd77afad61
commit deeefe2b40
2 changed files with 182 additions and 86 deletions
@@ -281,15 +281,63 @@ ferramenta nesse ponto. Corrigido o prompt do `AI Agent` pra não prometer
mais "mande uma foto" ao cliente (antes disso ele pedia foto mesmo sem
nunca conseguir processar nenhuma).
### Descoberta 5: "Webhook do Canal" resolve a imagem (solução final)
O Z-PRO tem, nas configurações do canal, uma opção **"Webhook do Canal"**
independente do ChatFlow: `Habilitar Webhook do Canal` + `URL de destino` +
toggle `Mensagens recebidas` (dispara a cada mensagem recebida pelo canal,
"em paralelo ao webhook geral do tenant"). Payload real capturado:
```json
{
"method": "message",
"msg": {
"from": "5575...",
"id": "wamid....",
"timestamp": "...",
"type": "image",
"image": { "mime_type": "image/jpeg", "id": "...", "url": "https://lookaside.fbsbx.com/whatsapp_business/attachments/?..." }
},
"ticket": {
"protocol": "...", "id": 469774, "status": "pending",
"contact": { "name": "...", "number": "..." },
"whatsapp": { "bmToken": "EAA..." }
}
}
```
Pra mensagem de texto, `msg` vem como `{ "type": "text", "text": { "body": "..." } }`
em vez de `image`. O workflow foi reconstruído em cima desse webhook:
- Novo endpoint: `orcamento-exames-canal-zpro` (path completamente separado
do antigo `orcamento-exames-zpro`, que foi removido).
- Campos extraídos: `sessionId` (`ticket.protocol`), `telefone` (`msg.from`),
`nomeContato` (`ticket.contact.name`), `entrada` (`msg.text.body`),
`imagemUrl` (`msg.image.url`), `tipoMidia` (`msg.type`), `mediaToken`
(`ticket.whatsapp.bmToken`).
- A URL da imagem é do WhatsApp/Meta (`lookaside.fbsbx.com`) e exige
autenticação — o node "Baixar imagem" manda `Authorization: Bearer
{{ mediaToken }}` usando o `bmToken` do próprio payload.
- Como esse webhook é uma notificação assíncrona (não é capturado e
reenviado pelo Z-PRO como no mecanismo do ChatFlow), o envio da resposta
voltou a ser feito via API, reaproveitando o sub-workflow
`enviar_texto` (mesma lógica da primeira versão do desenho).
- **Importante:** esse webhook dispara em paralelo a qualquer coisa que o
ChatFlow também dispare para a mesma mensagem. Por isso as interações
"Webhook Avançado" e "Mensagem" dos passos `Menu Orçamento` / `Menu
Orçamento 2` no ChatFlow precisam ser removidas (ação do usuário, fora do
n8n) — senão o cliente recebe duas respostas pra cada mensagem.
- O prompt do `AI Agent` voltou a aceitar/pedir foto normalmente, já que a
imagem agora chega de verdade.
### Ainda em aberto
Falta o usuário confirmar se existe, fora do construtor de ChatFlow (em
Configurações/Integrações do canal ou da empresa), um webhook de propósito
geral que dispare para toda mensagem recebida no canal — mecanismo
diferente do "Webhook Avançado" dentro de um ChatFlow. Se não existir,
verificar com o suporte do Z-PRO se há algum outro caminho suportado pela
plataforma. Até lá, o workflow funciona **somente com texto** — o cliente
digita os nomes dos exames, e a IA monta o orçamento normalmente.
- Confirmar, depois de remover os passos antigos do ChatFlow, que não há
mais resposta duplicada.
- Validar ponta a ponta com uma foto real de pedido de exames (a extração
do `imagemUrl`/`mediaToken` foi validada com uma imagem de teste, mas o
fluxo completo — download autenticado + IA de visão — ainda não foi
testado de ponta a ponta após esta reconstrução).
## Fora de escopo (por enquanto)