Pular para conteúdo

SLACK_SEND_MESSAGE - Enviar Mensagem para Canal

O que é esta Tool?

A SLACK_SEND_MESSAGE é a tool responsável por enviar mensagens para canais públicos ou privados do Slack usando a API oficial do Slack via Slack Bot.

Por que esta Tool existe?

Enviar mensagens para o Slack requer autenticação via Bot Token e tratamento correto de canais. A SLACK_SEND_MESSAGE existe para:

  1. Notificações automatizadas: Enviar alertas, notificações e atualizações para equipes
  2. Integração com workflows: Conectar sistemas externos com canais do Slack
  3. Mensagens formatadas: Suporte a Markdown e Blocks API do Slack
  4. Comunicação assíncrona: Enviar mensagens sem interação manual

Como funciona internamente?

Quando a SLACK_SEND_MESSAGE é executada, o sistema:

  1. Autentica usando o Bot Token configurado
  2. Valida o canal (channel ID ou nome do canal)
  3. Formata a mensagem (texto simples, Markdown ou Blocks)
  4. Envia via API usando endpoint chat.postMessage
  5. Se erro: Retorna erro detalhado (canal não encontrado, sem permissão, etc.)
  6. Se sucesso: Retorna timestamp da mensagem (ts) e dados do canal

Código interno (productivity-executors.service.ts - implementação futura):

async executeSlackSendMessage(data: any, variables: Record<string, any>): Promise<any> {
  const { channel, text, botToken, blocks, threadTs } = data;

  const slackApiUrl = 'https://slack.com/api/chat.postMessage';
  const headers = {
    'Authorization': `Bearer ${botToken}`,
    'Content-Type': 'application/json',
  };

  const payload = {
    channel: channel,
    text: text,
    blocks: blocks || undefined,
    thread_ts: threadTs || undefined,
  };

  const response = await axios.post(slackApiUrl, payload, { headers });

  if (!response.data.ok) {
    throw new Error(`Slack API error: ${response.data.error}`);
  }

  return {
    success: true,
    ts: response.data.ts,
    channel: response.data.channel,
    message: 'Message sent to Slack successfully',
  };
}

Quando você DEVE usar esta Tool?

Use SLACK_SEND_MESSAGE sempre que precisar de enviar mensagens para canais do Slack:

Casos de uso

  1. Notificações de vendas: "Nova venda realizada! Cliente: João - Valor: R$ 1.500"
  2. Alertas de sistema: "⚠️ Servidor #3 atingiu 90% de CPU"
  3. Atualizações de pipeline: "Lead convertido em cliente - CRM atualizado"
  4. Reports automatizados: "📊 Report diário: 150 tickets resolvidos hoje"
  5. Integrações: Enviar dados de formulários, webhooks, APIs externas
  6. Threads: Responder em threads existentes usando thread_ts

Quando NÃO usar SLACK_SEND_MESSAGE

  • Mensagens diretas: Use SLACK_SEND_DM para DMs individuais
  • Upload de arquivos: Use SLACK_UPLOAD_FILE para enviar arquivos
  • Criar canais: Use SLACK_CREATE_CHANNEL para criar novos canais

Parâmetros Detalhados

botToken (string, obrigatório)

O que é: Token de autenticação do Slack Bot (começa com xoxb-).

Como obter:

  1. Acesse https://api.slack.com/apps
  2. Crie um App ou selecione um existente
  3. Vá em OAuth & Permissions
  4. Adicione os scopes necessários: chat:write, chat:write.public
  5. Instale o App no workspace
  6. Copie o Bot User OAuth Token (xoxb-...)

Flow completo para testar:

{
  "name": "Teste Slack - Enviar Mensagem Simples",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "slack_1",
      "type": "slack_send_message",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Enviar para Slack",
        "parameters": {
          "botToken": "xoxb-seu-token-aqui",
          "channel": "C01234567",
          "text": "Olá do Lumina Flow Builder!"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "✅ Mensagem enviada para o Slack!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "slack_1" },
    { "source": "slack_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: A mensagem aparecerá no canal do Slack especificado.

channel (string, obrigatório)

O que é: ID do canal ou nome do canal onde a mensagem será enviada.

Formatos aceitos:

  • Channel ID: C01234567 (recomendado - mais confiável)
  • Channel name: #geral ou geral (com ou sem #)

Como obter o Channel ID:

  1. No Slack, clique com botão direito no canal
  2. Selecione View channel details
  3. Role até o final e copie o Channel ID

Flow completo para testar:

{
  "name": "Teste Slack - Channel ID vs Name",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "slack_1",
      "type": "slack_send_message",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Enviar por ID",
        "parameters": {
          "botToken": "xoxb-seu-token-aqui",
          "channel": "C01234567",
          "text": "Enviado usando Channel ID"
        }
      }
    },
    {
      "id": "slack_2",
      "type": "slack_send_message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Enviar por Nome",
        "parameters": {
          "botToken": "xoxb-seu-token-aqui",
          "channel": "geral",
          "text": "Enviado usando channel name"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "slack_1" },
    { "source": "slack_1", "target": "slack_2" },
    { "source": "slack_2", "target": "end_1" }
  ]
}

Teste: Mensagens aparecerão no canal #geral.

text (string, obrigatório)

O que é: Conteúdo da mensagem que será enviada.

Formatação Markdown:

*negrito*
_itálico_
~riscado~
`código`
```código em bloco```
<https://exemplo.com|Texto do link>

Emojis:

:smile: :rocket: :fire: :tada:

Flow completo para testar:

{
  "name": "Teste Slack - Mensagem Formatada",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "slack_1",
      "type": "slack_send_message",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Mensagem Rica",
        "parameters": {
          "botToken": "xoxb-seu-token-aqui",
          "channel": "C01234567",
          "text": "🚀 *Nova Venda Realizada!*\n\nCliente: João Silva\nValor: R$ 1.500,00\nStatus: ~Pendente~ *Aprovado*\n\n<https://crm.exemplo.com/venda/123|Ver detalhes>"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 500, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "slack_1" },
    { "source": "slack_1", "target": "end_1" }
  ]
}

blocks (array, opcional)

O que é: Array de blocos para mensagens interativas e visualmente ricas usando Slack Blocks API.

Padrão: undefined (usa apenas text)

Estrutura de Blocks:

{
  "blocks": [
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "*Título da Seção*\nTexto formatado"
      }
    },
    {
      "type": "divider"
    },
    {
      "type": "actions",
      "elements": [
        {
          "type": "button",
          "text": { "type": "plain_text", "text": "Aprovar" },
          "style": "primary",
          "action_id": "approve"
        }
      ]
    }
  ]
}

Teste: Use o Block Kit Builder do Slack: https://api.slack.com/block-kit/building

threadTs (string, opcional)

O que é: Timestamp da mensagem pai para responder em uma thread.

Padrão: undefined (cria nova mensagem no canal)

Como usar:

  1. Capture o ts de uma mensagem anterior
  2. Use esse valor em threadTs para responder na thread
{
  "parameters": {
    "botToken": "xoxb-...",
    "channel": "C01234567",
    "text": "Esta é uma resposta na thread",
    "threadTs": "1234567890.123456"
  }
}

Parâmetros

Campo Tipo Obrigatório Descrição
botToken string Sim Token de autenticação do Bot (xoxb-...)
channel string Sim ID ou nome do canal (#geral, C01234567)
text string Sim Texto da mensagem (suporta Markdown)
blocks array Não Blocks API para mensagens interativas
threadTs string Não Timestamp para responder em thread

Exemplo 1: Notificação de Venda

Objetivo: Notificar equipe de vendas sobre nova conversão

JSON para Importar

{
  "name": "Notificação Venda Slack",
  "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": "Dados da Venda",
        "parameters": {
          "variableName": "venda",
          "value": {
            "cliente": "Maria Santos",
            "valor": 2500,
            "produto": "Plano Premium"
          }
        }
      }
    },
    {
      "id": "slack_1",
      "type": "slack_send_message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Notificar Vendas",
        "parameters": {
          "botToken": "xoxb-seu-token-aqui",
          "channel": "vendas",
          "text": "💰 *Nova Venda Realizada!*\n\n👤 Cliente: {{venda.cliente}}\n💵 Valor: R$ {{venda.valor}}\n📦 Produto: {{venda.produto}}\n\n✅ Parabéns à equipe!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "slack_1" },
    { "source": "slack_1", "target": "end_1" }
  ]
}

Saída esperada no Slack:

💰 Nova Venda Realizada!

👤 Cliente: Maria Santos
💵 Valor: R$ 2500
📦 Produto: Plano Premium

✅ Parabéns à equipe!

Exemplo 2: Alerta de Sistema

Objetivo: Enviar alertas de monitoramento para canal de DevOps

JSON para Importar

{
  "name": "Alert Sistema Slack",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "slack_1",
      "type": "slack_send_message",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Alerta Crítico",
        "parameters": {
          "botToken": "xoxb-seu-token-aqui",
          "channel": "devops-alerts",
          "text": "🚨 *ALERTA CRÍTICO*\n\n🖥️ Servidor: api-prod-01\n📊 CPU: 95%\n💾 Memória: 88%\n⏰ Timestamp: 2025-01-15 10:30:00\n\n@channel Por favor, verificar imediatamente!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 500, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "slack_1" },
    { "source": "slack_1", "target": "end_1" }
  ]
}

Saída esperada no Slack:

🚨 ALERTA CRÍTICO

🖥️ Servidor: api-prod-01
📊 CPU: 95%
💾 Memória: 88%
⏰ Timestamp: 2025-01-15 10:30:00

@channel Por favor, verificar imediatamente!

Exemplo 3: Report Diário

Objetivo: Enviar relatório automatizado todos os dias

JSON para Importar

{
  "name": "Report Diário Slack",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "slack_1",
      "type": "slack_send_message",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Report",
        "parameters": {
          "botToken": "xoxb-seu-token-aqui",
          "channel": "reports",
          "text": "📊 *Report Diário - 15/01/2025*\n\n✅ Tickets resolvidos: 150\n⏳ Tickets pendentes: 45\n📈 Taxa de resolução: 77%\n⭐ Satisfação média: 4.5/5\n\n_Report gerado automaticamente às 18:00_"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 500, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "slack_1" },
    { "source": "slack_1", "target": "end_1" }
  ]
}

Resposta da Tool

{
  "success": true,
  "ts": "1234567890.123456",
  "channel": "C01234567",
  "message": "Message sent to Slack successfully"
}

Setup do Slack App

1. Criar Slack App

  1. Acesse https://api.slack.com/apps
  2. Clique em Create New App
  3. Escolha From scratch
  4. Nome: "Lumina Flow Builder"
  5. Workspace: Selecione seu workspace

2. Configurar Permissões (Scopes)

Em OAuth & Permissions, adicione Bot Token Scopes:

Obrigatórios:

  • chat:write - Enviar mensagens como bot
  • chat:write.public - Enviar em canais públicos sem ser membro

Opcionais:

  • channels:read - Ler informações de canais públicos
  • groups:read - Ler informações de canais privados

3. Instalar App no Workspace

  1. Clique em Install to Workspace
  2. Autorize as permissões
  3. Copie o Bot User OAuth Token (xoxb-...)

4. Adicionar Bot aos Canais

Para canais privados:

  1. Abra o canal no Slack
  2. Digite /invite @Lumina Flow Builder
  3. Confirme

Para canais públicos: Não é necessário (scope chat:write.public)

Boas Práticas

SIM:

  • Usar Channel IDs ao invés de nomes (mais confiável)
  • Formatar mensagens com Markdown para melhor legibilidade
  • Incluir emojis para destacar informações importantes
  • Usar @channel ou @here com moderação (notifica todos)
  • Armazenar Bot Token em variáveis de ambiente (segurança)
  • Usar Blocks API para mensagens interativas
  • Capturar ts para responder em threads

NÃO:

  • Não exponha o Bot Token no código
  • Não envie mensagens muito longas (limite: 4000 caracteres)
  • Não abuse de @channel (causa fadiga de notificações)
  • Não envie informações sensíveis sem criptografia

Dicas

💡 Channel ID vs Name: Use sempre Channel ID (C01234567) para evitar erros se o canal for renomeado

💡 Markdown: Use *negrito* para destacar informações importantes

💡 Threads: Salve o ts retornado para criar threads organizadas

💡 Blocks API: Para mensagens complexas com botões e campos, use blocks: https://api.slack.com/block-kit

💡 Rate Limits: Slack permite 1 mensagem por segundo. Para alto volume, implemente throttling

💡 Testes: Use https://api.slack.com/methods/chat.postMessage/test para testar payloads

Erros Comuns

not_in_channel

Causa: Bot não foi adicionado ao canal privado Solução: Adicione o bot com /invite @Lumina Flow Builder

channel_not_found

Causa: Channel ID inválido ou canal não existe Solução: Verifique o Channel ID no Slack

invalid_auth

Causa: Bot Token inválido ou expirado Solução: Gere novo token em api.slack.com/apps

token_revoked

Causa: App foi desinstalado do workspace Solução: Reinstale o app no workspace

Próxima Tool

SLACK_SEND_DM - Enviar mensagem direta → SLACK_UPLOAD_FILE - Upload de arquivos → SLACK_CREATE_CHANNEL - Criar canal