Pular para o conteúdo principal

Workflow de Auto-Resposta

Conceituacao

Este guia mostra como criar um chatbot de auto-resposta completo usando N8N e Ogmma API. O workflow recebe mensagens via webhook, analisa o conteudo e envia respostas automaticas baseadas em palavras-chave.

E o exemplo mais completo de integracao -- combina recebimento de webhooks com envio de mensagens em um unico workflow.


Caso de Uso

Um restaurante quer responder automaticamente a perguntas frequentes:

Palavra-chaveResposta
"horario" ou "funciona"Horario de funcionamento
"cardapio" ou "preco"Link para o cardapio
Qualquer outra mensagemMenu de opcoes

Arquitetura do Workflow

[Webhook: message.received]
→ [Set: extrair dados]
→ [Switch: palavras-chave]
├── "horario" → [HTTP Request: enviar horario]
├── "cardapio" → [HTTP Request: enviar cardapio]
└── default → [HTTP Request: enviar menu]

Passo 1: Configurar o Webhook

Adicione um Webhook node como trigger do workflow.

CampoValor
HTTP MethodPOST
Pathogmma-auto-reply
Response ModeImmediately
Response Code200

Registre a Production URL na Ogmma API para o evento message.received:

curl -X POST "https://oapi.ogmma.com.br/v1/webhooks" \
-H "Authorization: Bearer oapi_sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"url": "https://SEU-N8N.app.n8n.cloud/webhook/ogmma-auto-reply",
"events": ["message.received"],
"secret": "seu-secret-seguro"
}'

Para detalhes completos, consulte Receber Webhooks.


Passo 2: Extrair Dados da Mensagem

Adicione um Set node para extrair e normalizar os campos relevantes do payload.

Configuracao do Set Node

CampoValorExpressao
fromNumero do remetente{{ $json.data.from }}
textTexto em minusculas{{ $json.data.content.toLowerCase() }}
channelIdID do canal{{ $json.data.channelId }}
conversationIdID da conversa{{ $json.data.conversationId }}
Dica

Converter o texto para minusculas (.toLowerCase()) facilita a comparacao de palavras-chave, evitando que "HORARIO", "Horario" e "horario" precisem de regras separadas.


Passo 3: Logica Condicional (Switch)

Adicione um Switch node para rotear a mensagem baseado em palavras-chave.

Configuracao

CampoValor
ModeRules
Data TypeString
Value{{ $json.text }}

Regras

#OperacaoValorSaida
1Containshorario"Horario"
1Containsfunciona"Horario"
2Containscardapio"Cardapio"
2Containspreco"Cardapio"
3Fallback (default)"Menu"
Nota

Voce pode combinar varias condicoes na mesma saida usando "OR". No N8N, adicione multiplas condicoes dentro da mesma regra.


Passo 4: Enviar Respostas

Para cada saida do Switch, adicione um HTTP Request node que envia a resposta adequada.

4.1 Resposta "Horario"

CampoValor
MethodPOST
URLhttps://oapi.ogmma.com.br/v1/channels/{{ $('Set').item.json.channelId }}/messages/text
AuthenticationHeader Auth → Ogmma API
Body Content TypeJSON

Body:

{
"to": "={{ $('Set').item.json.from }}",
"text": "Nosso horario de funcionamento:\n\nSegunda a Sexta: 08:00 - 18:00\nSabado: 09:00 - 13:00\nDomingo: Fechado\n\nPrecisa de mais alguma coisa?"
}

4.2 Resposta "Cardapio"

Body:

{
"to": "={{ $('Set').item.json.from }}",
"text": "Acesse nosso cardapio completo:\nhttps://restaurante.com.br/cardapio\n\nPedidos pelo WhatsApp tambem sao aceitos!"
}

4.3 Resposta "Menu" (Default)

Body:

{
"to": "={{ $('Set').item.json.from }}",
"text": "Ola! Sou o assistente virtual. Como posso ajudar?\n\nDigite uma opcao:\n1. *horario* - Horario de funcionamento\n2. *cardapio* - Ver cardapio e precos\n3. *atendente* - Falar com um atendente\n\nOu escreva sua duvida que vou tentar ajudar!"
}

Workflow Completo

[Webhook]

[Set: extrair from, text, channelId]

[Switch: palavras-chave]
├── "horario/funciona" → [HTTP Request: horario]
├── "cardapio/preco" → [HTTP Request: cardapio]
└── default → [HTTP Request: menu]

Baixar auto-reply-basic.json


Variacoes

Com Delay (Simular Digitacao)

Adicione um Wait node de 2 segundos antes de cada HTTP Request para simular o tempo de digitacao humana:

[Switch] → [Wait: 2s] → [HTTP Request: enviar resposta]

Fora do Horario Comercial

Adicione um IF node apos o Webhook para verificar o horario:

// Expressao no IF node
{{ new Date().getHours() >= 8 && new Date().getHours() < 18 }}
[Webhook] → [Set] → [IF: horario comercial?]
→ Sim: [Switch: palavras-chave] → [respostas normais]
→ Nao: [HTTP Request: "Estamos fora do horario, retornaremos amanha"]

Ignorar Mensagens Proprias

Adicione um IF node para ignorar mensagens enviadas pelo proprio bot (evitar loops):

[Webhook] → [IF: event == "message.received"?]
→ Sim: [Set] → [Switch] → [respostas]
→ Nao: [No Operation] (ignorar)
Cuidado com Loops

Se o webhook estiver configurado para receber message.sent alem de message.received, o bot pode entrar em loop respondendo a si mesmo. Filtre sempre pelo tipo de evento ou pela direcao da mensagem.

Com Reacao antes de Responder

Adicione uma reacao (emoji) a mensagem recebida antes de enviar a resposta:

[Webhook] → [Set] → [HTTP Request: reagir com 👍] → [Wait: 1s] → [Switch] → [respostas]

HTTP Request para reagir:

POST .../messages/react

{
"messageId": "={{ $json.data.messageId }}",
"emoji": "👍"
}

Proximo Passo