Skip to content

Configuração WhatsApp com Evolution API

Guia completo para integrar WhatsApp ao ifriend-agents usando Evolution API.

📋 Visão Geral

A Evolution API é uma solução open-source que permite conectar ao WhatsApp usando: - WhatsApp Web (Baileys): Conexão gratuita via QR Code - WhatsApp Cloud API: API oficial do Meta para empresas

Este guia foca na implementação Baileys (gratuita e self-hosted).

🎯 Pré-requisitos

  • Docker instalado
  • Servidor com IP público ou ngrok para webhooks
  • WhatsApp instalado no celular

🚀 Instalação Evolution API

Opção 1: Docker Run (Desenvolvimento)

docker run -d \
    --name evolution_api \
    -p 8080:8080 \
    -e AUTHENTICATION_API_KEY=sua-chave-secreta-aqui \
    atendai/evolution-api:latest

Opção 2: Docker Compose (Recomendado)

Crie docker-compose-evolution.yml:

version: '3.8'

services:
  evolution-api:
    image: atendai/evolution-api:latest
    container_name: evolution_api
    restart: always
    ports:
      - "8080:8080"
    environment:
      # === Autenticação ===
      AUTHENTICATION_API_KEY: ${EVOLUTION_API_KEY}

      # === Database (Opcional - Para persistência) ===
      DATABASE_ENABLED: true
      DATABASE_PROVIDER: postgresql
      DATABASE_CONNECTION_URI: postgresql://user:pass@postgres:5432/evolution
      DATABASE_SAVE_DATA_INSTANCE: true
      DATABASE_SAVE_DATA_NEW_MESSAGE: true

      # === Webhooks ===
      WEBHOOK_GLOBAL_URL: ${WEBHOOK_URL}/whatsapp/webhook
      WEBHOOK_GLOBAL_ENABLED: true
      WEBHOOK_GLOBAL_WEBHOOK_BY_EVENTS: true

      # === Logs ===
      LOG_LEVEL: INFO
      LOG_COLOR: true

    volumes:
      - evolution_instances:/evolution/instances
      - evolution_store:/evolution/store

  postgres:
    image: postgres:15-alpine
    container_name: evolution_postgres
    restart: always
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: evolution
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  evolution_instances:
  evolution_store:
  postgres_data:

Execute:

export EVOLUTION_API_KEY="sua-chave-secreta"
export WEBHOOK_URL="https://seu-dominio.com"

docker-compose -f docker-compose-evolution.yml up -d

🔧 Criar Instância WhatsApp

1. Verifique se API está rodando

curl http://localhost:8080

Resposta esperada:

{
  "status": 200,
  "message": "Welcome to the Evolution API, it is working!",
  "version": "2.x.x"
}

2. Crie uma instância

curl -X POST http://localhost:8080/instance/create \
  -H "apikey: sua-chave-secreta" \
  -H "Content-Type: application/json" \
  -d '{
    "instanceName": "ifriend-bot",
    "token": "token-da-instancia-opcional",
    "qrcode": true,
    "webhook": {
      "url": "https://seu-dominio.com/whatsapp/webhook",
      "enabled": true,
      "events": ["messages.upsert", "messages.update", "connection.update"]
    }
  }'

3. Obtenha QR Code

curl -X GET http://localhost:8080/instance/connect/ifriend-bot \
  -H "apikey: sua-chave-secreta"

Você receberá:

{
  "instance": {
    "instanceName": "ifriend-bot",
    "status": "open",
    "qrcode": {
      "code": "1@xxx...",
      "base64": "data:image/png;base64,..."
    }
  }
}

4. Escaneie QR Code

  • Abra o WhatsApp no celular
  • Vá em Configurações > Aparelhos conectados
  • Toque em Conectar um aparelho
  • Escaneie o QR Code (base64 ou acesse http://localhost:8080/manager)

⚙️ Configuração ifriend-agents

Adicione ao seu .env:

# WhatsApp Evolution API
WHATSAPP_BASE_URL=http://localhost:8080
WHATSAPP_API_KEY=sua-chave-secreta
WHATSAPP_INSTANCE_NAME=ifriend-bot

# Habilitar WhatsApp
MESSAGING_PLATFORMS=slack,whatsapp

🧪 Testar Integração

1. Envie mensagem de teste

curl -X POST http://localhost:8080/message/sendText/ifriend-bot \
  -H "apikey: sua-chave-secreta" \
  -H "Content-Type: application/json" \
  -d '{
    "number": "5511999999999",
    "text": "Teste Evolution API"
  }'

2. Verifique webhook

Configure um endpoint temporário com ngrok:

ngrok http 8000

Atualize o webhook da instância:

curl -X PUT http://localhost:8080/webhook/set/ifriend-bot \
  -H "apikey: sua-chave-secreta" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://seu-ngrok.ngrok.io/whatsapp/webhook",
    "enabled": true,
    "events": ["messages.upsert"]
  }'

Envie mensagem para o número WhatsApp conectado e veja o webhook ser chamado.

📡 Formato do Webhook

Quando alguém envia mensagem, você receberá:

{
  "event": "messages.upsert",
  "instance": "ifriend-bot",
  "data": {
    "key": {
      "remoteJid": "5511999999999@s.whatsapp.net",
      "fromMe": false,
      "id": "3EB0ABC123456789"
    },
    "message": {
      "conversation": "Olá, preciso de ajuda!"
    },
    "messageType": "conversation",
    "messageTimestamp": 1706545234,
    "pushName": "João Silva"
  }
}

🎨 Formatação de Mensagens

WhatsApp suporta markdown básico:

# Negrito
*texto em negrito*

# Itálico
_texto em itálico_

# Riscado
~texto riscado~

# Monoespaçado
```código```

# Exemplo completo
await adapter.send_message(OutgoingMessage(
    text="*Atenção!*\n\n_Sua reserva foi confirmada._\n\n```ID: 12345```",
    channel_id="5511999999999"
))

🔍 Monitoramento

Ver status da instância

curl http://localhost:8080/instance/connectionState/ifriend-bot \
  -H "apikey: sua-chave-secreta"

Ver logs

docker logs -f evolution_api

Listar instâncias

curl http://localhost:8080/instance/fetchInstances \
  -H "apikey: sua-chave-secreta"

🚨 Troubleshooting

Instância desconecta constantemente

  • Verifique internet estável
  • Desabilite modo economia de bateria no celular
  • Use database persistence (PostgreSQL)

Mensagens não chegam

  • Confirme webhook URL está acessível
  • Verifique eventos habilitados no webhook
  • Teste webhook com curl

QR Code não aparece

  • Verifique se instância já está conectada
  • Delete instância e crie nova:
    curl -X DELETE http://localhost:8080/instance/delete/ifriend-bot \
      -H "apikey: sua-chave-secreta"
    

Erro "Instance not found"

  • Confirme nome da instância
  • Verifique se criação foi bem sucedida
  • Liste todas instâncias

🔐 Segurança

  1. API Key forte: Use senha complexa para AUTHENTICATION_API_KEY
  2. HTTPS: Use reverse proxy (nginx/caddy) com SSL
  3. Firewall: Restrinja acesso à porta 8080
  4. Webhook assinado: Valide origem dos webhooks

Exemplo nginx:

server {
    listen 443 ssl;
    server_name evolution.seudominio.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

📚 Recursos Adicionais

🎯 Funcionalidades Avançadas

Enviar imagem

curl -X POST http://localhost:8080/message/sendMedia/ifriend-bot \
  -H "apikey: sua-chave-secreta" \
  -H "Content-Type: application/json" \
  -d '{
    "number": "5511999999999",
    "mediatype": "image",
    "media": "https://exemplo.com/imagem.jpg",
    "caption": "Olha que foto legal!"
  }'

Enviar áudio

curl -X POST http://localhost:8080/message/sendWhatsAppAudio/ifriend-bot \
  -H "apikey: sua-chave-secreta" \
  -H "Content-Type: application/json" \
  -d '{
    "number": "5511999999999",
    "audio": "https://exemplo.com/audio.mp3"
  }'

Indicador de presença

curl -X POST http://localhost:8080/chat/presence/ifriend-bot \
  -H "apikey: sua-chave-secreta" \
  -H "Content-Type: application/json" \
  -d '{
    "number": "5511999999999",
    "presence": "composing"
  }'

Tipos de presença: - available: Online - unavailable: Offline - composing: Digitando... - recording: Gravando áudio - paused: Pausou digitação


Configuração completa! Seu bot WhatsApp está pronto para uso. 🎉