Salta el boilerplate: clona un bot que ya funciona
- Enviar un mensaje normal;
- Enviar multimedia: imagen/archivo/video;
- Enviar un contacto (tarjeta de visita vCard);
- Enviar un producto;
- Crear un grupo de WhatsApp;
- Enviar una invitación al grupo;
- Enviar un mensaje a un grupo de WhatsApp;
- Recibir y procesar mensajes entrantes;
- Responder a un comando desconocido (para implementar menús, instrucciones o un mensaje de bienvenida).
git clone https://github.com/Whapi-Cloud/nodejs-whatsapp-chatbot
cd nodejs-whatsapp-chatbot
package.json:
npm install
Estructura del proyecto
- /files — media de ejemplo que el bot puede enviar (imagen, PDF, vídeo, vCard). Cámbialos cuando quieras.
- config.js —
token,botUrl,porte IDs opcionales degroup/product. - index.js — registra el webhook, escucha en
/hook/messagesy mapea los números 1–9 a acciones.
Conecta tu número de WhatsApp
Escanea el código QR en tu cuenta
config.js como token. Las peticiones a https://gate.whapi.cloud lo llevan como Bearer.
Antes de arrancar el bot
- Token del canal pegado en
config.js. - Un segundo teléfono para probar: el bot ignora los mensajes del número conectado.
- URL HTTPS pública. En local usa ngrok; en producción, cualquier host con HTTPS.
Dale al bot una URL HTTPS pública
/hook/messages en tu servidor -> el bot mira el comando y responde. No pegas la URL en el panel; el bot la registra desde config.js al arrancar.config.js como botUrl; al arrancar el repo la registra con la API de ajustes del canal.Túnel local con ngrok
port por defecto en config.js es 80 (no uses 443). Descarga ngrok y ejecuta ngrok http 80 — o el puerto que hayas puesto en config.js.https://. Pon botUrl a ese host más /hook, por ejemplo botUrl: "https://84c7-151-33-282-113.ngrok-free.app/hook".
/hook. El servidor escucha POST en /hook/messages; botUrl es el prefijo que queda en los ajustes del canal.node index.js, el bot envía PATCH /settings con esa URL y el evento messages. Los mensajes de WhatsApp llegan entonces a tu proceso. Puedes ignorar los campos de webhook del panel salvo que quieras ver qué se registró.Qué necesita producción
botUrl, reinicia el bot para que vuelva a registrar el webhook.Arrancar el bot
token y botUrl en config.js y, desde la raíz del proyecto, ejecuta node index.js. Deberías ver un log de listening. Desde otro teléfono, envía cualquier texto al número conectado. El bot responde con un menú numerado.Menú de comandos
- Mensaje de texto simple
- Enviar imagen
- Enviar documento
- Enviar vídeo
- Enviar contacto
- Enviar producto
- Crear grupo
- Texto simple al grupo
- Obtener los ids de tus tres grupos
Envía solo el número, por ejemplo 1. Cualquier otra cosa vuelve a devolver esta lista.
product y group en config.js. Sáltalos en la primera prueba. Cuando los necesites, lista IDs con GET /groups y GET /business/products.Solución de problemas
El bot no responde
from_me. Comprueba el token, que botUrl termine en /hook, que ngrok (o tu host) siga activo y que el proceso haya imprimido el mensaje de listening.El bot envía mensajes en bucle
if (message.from_me) continue. Sin eso el bot responde a sus propios mensajes y no para.Funciona en unos chats y en otros no
Enviar mensajes de WhatsApp desde Node.js
fetch a https://gate.whapi.cloud con tu token Bearer.Enviar un mensaje 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 un 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);
Trabajar con grupos de WhatsApp
/groups.Listar tus 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 del grupo
groups.forEach(group => {
console.log(`Group Name: ${group.name}`);
console.log(`Participants: ${group.participants.length}`);
});
Gestionar mensajes de grupo
@g.us. Los webhooks entrantes usan el mismo sufijo; el bot clonado ya ramifica por ahí cuando un comando apunta a un grupo.
// Del bot clonado: los mensajes de grupo usan chat_id que termina en @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. Pon ese ID antes de usar esos números.Déjalo en línea
node index.js corriendo en una máquina con URL HTTPS pública y pon botUrl a https://tu-host/hook. Este bot es un proceso Express de larga duración, no una función serverless de un disparo: vale un VPS o cualquier host Node con HTTPS. Reinicia si cambias botUrl para registrar de nuevo el webhook.Firebase
- Crea un proyecto en Firebase Console;
- Instala Firebase CLI, siguiendo las instrucciones;
- Inicializa Firebase en el directorio de tu proyecto con el comando firebase init;
- Despliega tu bot usando el comando firebase deploy --only functions.
AWS (Amazon Web Services)
- Regístrate o inicia sesión en AWS Management Console;
- Crea una nueva función Lambda a través de la consola de AWS, eligiendo API Gateway como desencadenante;
- Sube el código de tu bot a la función Lambda;
- Configura API Gateway para que tu bot interactúe con el mundo exterior.
Heroku
- Crea una cuenta en Heroku;
- Instala Heroku CLI e inicia sesión;
- Crea una nueva aplicación en Heroku a través de la consola o usando el comando heroku create;
- Conecta tu repositorio Git con Heroku y realiza el despliegue con los comandos git push heroku master;
- Configura la URL del webhook proporcionada por Heroku.