Pule o boilerplate: clone um bot que já funciona
- Envio de uma mensagem comum;
- Envio de mídia: imagem / arquivo / vídeo;
- Envio de contato (cartão de visita vCard);
- Envio de produto;
- Criação de grupos no WhatsApp;
- Envio de convite para o grupo;
- Envio de mensagem em grupo no WhatsApp;
- Recebimento e processamento de mensagens recebidas;
- Resposta a um comando desconhecido (para implementação de menu, instruções ou mensagem de boas-vindas).
git clone https://github.com/Whapi-Cloud/nodejs-whatsapp-chatbot
cd nodejs-whatsapp-chatbot
package.json:
npm install
Estrutura do projeto
- /files — mídia de exemplo que o bot pode enviar (imagem, PDF, vídeo, vCard). Troque quando quiser.
- config.js —
token,botUrl,porte IDs opcionais degroup/product. - index.js — registra o webhook, escuta em
/hook/messagese mapeia os números 1–9 para ações.
Conecte seu número de WhatsApp
Escaneie o QR code na sua conta
config.js como token. As chamadas a https://gate.whapi.cloud usam Bearer.
Antes de iniciar o bot
- Token do canal colado no
config.js. - Um segundo celular para testar: o bot ignora mensagens do número conectado.
- URL HTTPS pública. No local use ngrok; em produção, qualquer host com HTTPS.
Dê ao bot uma URL HTTPS pública
/hook/messages no seu servidor -> o bot lê o comando e responde. Você não cola a URL no painel; o bot registra a partir do config.js na subida.config.js como botUrl; na subida o repositório registra pela API de configurações do canal.Túnel local com ngrok
port padrão no config.js é 80 (não use 443). Baixe o ngrok e rode ngrok http 80 — ou a porta que você definiu no config.js.https://. Defina botUrl como esse host mais /hook, por exemplo botUrl: "https://84c7-151-33-282-113.ngrok-free.app/hook".
/hook. O servidor escuta POST em /hook/messages; botUrl é o prefixo gravado nas configurações do canal.node index.js, o bot envia PATCH /settings com essa URL e o evento messages. As mensagens do WhatsApp chegam no seu processo. Você pode ignorar os campos de webhook no painel, a menos que queira ver o que foi registrado.O que a produção precisa
botUrl, reinicie o bot para registrar o webhook de novo.Iniciar o bot
token e botUrl no config.js e, na raiz do projeto, rode node index.js. Você deve ver o log de listening. De um celular diferente, envie qualquer texto para o número conectado. O bot responde com um menu numerado.Menu de comandos
- Mensagem de texto simples
- Enviar imagem
- Enviar documento
- Enviar vídeo
- Enviar contato
- Enviar produto
- Criar grupo
- Texto simples para o grupo
- Obter os ids dos seus três grupos
Envie só o número, por exemplo 1. Qualquer outra coisa devolve esta lista.
product e group no config.js. Pule-os no primeiro teste. Quando precisar, liste IDs com GET /groups e GET /business/products.Solução de problemas
O bot não responde
from_me. Confira o token, se botUrl termina em /hook, se o ngrok (ou o host) ainda está no ar e se o processo imprimiu a mensagem de listening.O bot envia mensagens em loop
if (message.from_me) continue. Sem isso o bot responde às próprias mensagens e não para.Funciona em alguns chats e em outros não
Enviar mensagens de WhatsApp pelo Node.js
fetch para https://gate.whapi.cloud com o Bearer.Enviar uma mensagem de texto
const response = await fetch('https://gate.whapi.cloud/messages/text', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
to: '[email protected]',
body: 'Hello from the cloned bot'
})
});
const data = await response.json();
console.log(data);
Enviar um documento
const response = await fetch('https://gate.whapi.cloud/messages/document', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
to: '[email protected]',
media: 'https://example.com/file.pdf',
caption: 'Document from the bot'
})
});
const data = await response.json();
console.log(data);
Trabalhar com grupos do WhatsApp
/groups.Listar seus grupos
const response = await fetch('https://gate.whapi.cloud/groups', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_TOKEN'
}
});
const { groups } = await response.json();
console.log(groups);
Contar participantes do grupo
groups.forEach(group => {
console.log(`Group Name: ${group.name}`);
console.log(`Participants: ${group.participants.length}`);
});
Lidar com mensagens de grupo
@g.us. Webhooks recebidos usam o mesmo sufixo; o bot clonado já ramifica nisso quando um comando mira um grupo.
// Do bot clonado: mensagens de grupo usam chat_id terminando em @g.us
const messages = req.body.messages;
messages.forEach(message => {
if (message.chat_id.endsWith('@g.us')) {
console.log(`Group message: ${message.text?.body}`);
}
});
config.group. Defina esse ID antes de usar esses números.Mantenha online
node index.js rodando numa máquina com URL HTTPS pública e defina botUrl como https://seu-host/hook. Este bot é um processo Express de longa duração, não uma função serverless de um disparo — um VPS ou qualquer host Node com HTTPS basta. Reinicie se mudar o botUrl para registrar o webhook de novo.Firebase
- Crie um projeto no Firebase Console;
- Instale o Firebase CLI, seguindo as instruções;
- Initialize o Firebase no diretório do seu projeto usando o comando firebase init;
- Implante seu bot usando o comando firebase deploy --only functions.
AWS (Amazon Web Services)
- Registre-se ou entre no Console de Gerenciamento da AWS;
- Crie uma nova função Lambda através do console da AWS, escolhendo o API Gateway como gatilho;
- Carregue o código do seu bot na função Lambda;
- Configure o API Gateway para interação do seu bot com o mundo externo.
Heroku
- Crie uma conta no Heroku;
- Instale o Heroku CLI e faça login;
- Crie um novo aplicativo no Heroku através do console ou usando o comando heroku create;
- Associe seu repositório Git ao Heroku e faça o deploy usando os comandos git push heroku master;
- Configure o URL do webhook fornecido pelo Heroku.
Próximos passos
status · verificador de números · docs da API · agent skills