DEV Community

Eric Nacif
Eric Nacif

Posted on

Como criar um Bot de WhatsApp com Node.js do zero (template pronto)

Faz um tempo que eu queria criar um template sólido para bots de WhatsApp — algo que fosse além do "hello world" e servisse de base real para projetos de atendimento automatizado.

O resultado foi o template-bot-whatsapp: um boilerplate modular, com sistema de fluxos, menus interativos e pronto para integrar com IA.

Neste artigo vou te mostrar como ele funciona e como usar.


O que você vai conseguir fazer

  • Criar menus interativos por número (1, 2, 3...)
  • Manter sessões separadas por usuário
  • Centralizar todos os textos do bot em um arquivo
  • Integrar com OpenAI, Gemini ou Claude em poucos passos

Estrutura do projeto

template-bot-whatsapp/
├── src/
│   ├── flows/
│   │   ├── router.js        # Toda mensagem passa por aqui
│   │   └── mainMenu.js      # Fluxo do menu principal
│   ├── commands/
│   │   └── ping.js          # Exemplo de comando por palavra-chave
│   ├── middlewares/
│   │   └── logger.js        # Log no terminal
│   └── utils/
│       └── messages.js      # Todos os textos em um só lugar
├── index.js
└── .env.example
Enter fullscreen mode Exit fullscreen mode

Como rodar

git clone https://github.com/ericnacif/template-bot-whatsapp.git
cd template-bot-whatsapp
npm install
node index.js
Enter fullscreen mode Exit fullscreen mode

Escaneie o QR Code que aparece no terminal com o WhatsApp. A sessão é salva localmente — você só faz isso uma vez.


Como funciona o sistema de fluxos

O bot usa sessões por usuário combinadas com roteamento por etapas. Cada pessoa tem seu próprio estado de conversa, totalmente independente.

Usuário: oi
Bot: Menu principal — opções 1, 2, 3

Usuário: 1
Bot: Submenu de informações

Usuário: 0
Bot: Volta ao menu principal
Enter fullscreen mode Exit fullscreen mode

O roteador central (router.js) recebe todas as mensagens e decide para qual fluxo encaminhar:

// src/flows/router.js
async function router(message, sessions) {
    const body = message.body.toLowerCase().trim();
    const from = message.from;

    if (['oi', 'olá', 'menu', 'start'].includes(body)) {
        return mainMenu(message, sessions);
    }

    const session = sessions.get(from);
    if (session) {
        return mainMenu(message, sessions);
    }
}
Enter fullscreen mode Exit fullscreen mode

Textos centralizados

Todos os textos ficam em src/utils/messages.js. Assim você nunca precisa caçar strings espalhadas pelo código:

const MESSAGES = {
    mainMenu: `👋 Olá! Como posso ajudar?

*1* - Produtos
*2* - Suporte
*3* - Encerrar`,

    goodbye: `Até logo! Se precisar, é só chamar. 😊`,
};
Enter fullscreen mode Exit fullscreen mode

Integrando com IA

A estrutura está pronta para isso. Instale o SDK e crie um novo fluxo:

npm install openai
Enter fullscreen mode Exit fullscreen mode
// src/flows/iaFlow.js
const OpenAI = require('openai');
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

async function iaFlow(message) {
    const completion = await openai.chat.completions.create({
        model: 'gpt-4o-mini',
        messages: [{ role: 'user', content: message.body }],
    });
    return message.reply(completion.choices[0].message.content);
}

module.exports = { iaFlow };
Enter fullscreen mode Exit fullscreen mode

Depois registre no router.js como qualquer outro fluxo. Funciona da mesma forma com Gemini ou Claude.


Repositório

O template está disponível no GitHub com documentação completa:

👉 github.com/ericnacif/template-bot-whatsapp

Se te ajudou, deixa uma ⭐ — isso ajuda o projeto a chegar em mais devs!

Top comments (0)