Bot de WhatsApp Simple y Escalable con Node.
js
En esta guía encontrarás un ejemplo de código mínimo viable para crear un bot de WhatsApp que:
• Mencione a todos en un grupo con el comando +all .
• Descargue y reenvíe archivos multimedia (mp3, mp4, jpg, png) a partir de una URL.
• Este bot funciona en Zorin OS, usando [Link], Express y la API de Twilio.
1. Requisitos Previos
• [Link] >= 14 instalado.
• Cuenta de Twilio con acceso a la API de WhatsApp.
• Variables de entorno:
• TWILIO_ACCOUNT_SID
• TWILIO_AUTH_TOKEN
• TWILIO_WHATSAPP_NUMBER (número aprobado por Twilio, [Link]. whatsapp:+1415XXXXXXX )
• Ngrok instalado (solo para exponer tu servidor local a Internet).
• PM2 instalado globalmente (opcional, para producción local):
npm install -g pm2
2. Estructura de Directorios
whatsapp-bot/
├─ .env
├─ [Link]
├─ [Link] # Guarda los participantes del grupo
├─ [Link] # Punto de entrada del servidor
├─ modules/
│ ├─ [Link] # Lógica para @all
│ └─ [Link] # Lógica para descargar y reenviar medios
└─ Procfile # (Opcional) para Heroku/PM2
3. Archivo de Configuración de Estado ( [Link] )
{
"groupMembers": [
"+5491122233344",
"+5491166677788"
]
}
1
Nota: Añade manualmente los números de los participantes con el formato internacional
( +{código}{número} ).
4. Variables de Entorno ( .env )
TWILIO_ACCOUNT_SID=ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWILIO_AUTH_TOKEN=your_auth_token
TWILIO_WHATSAPP_NUMBER=whatsapp:+1415XXXXXXX
PORT=3000
5. Lógica de Menciones ( modules/[Link] )
const fs = require('fs');
const path = require('path');
// Carga manual de participantes\ nconst statePath = [Link](__dirname,
'..', '[Link]');
function loadMembers() {
const raw = [Link](statePath);
return [Link](raw).groupMembers;
}
function handleMentionAll(client, from, to) {
const members = loadMembers();
const mentions = [Link](num => `@${num}`).join(' ');
return [Link]({
from: [Link].TWILIO_WHATSAPP_NUMBER,
to,
body: mentions
});
}
[Link] = { handleMentionAll };
6. Lógica de Descarga y Reenvío ( modules/[Link] )
const axios = require('axios');
const { writeFileSync } = require('fs');
const path = require('path');
async function downloadAndSend(client, mediaUrl, to) {
// Validar URL básica
if (!/^https?:\/\/.+\.(mp3|mp4|jpg|png)$/.test(mediaUrl)) {
throw new Error('URL inválida o formato no soportado');
2
}
const resp = await [Link](mediaUrl, { responseType: 'arraybuffer',
timeout: 15000 });
const ext = [Link](mediaUrl);
const tmpPath = [Link](__dirname, '..', `tmp${ext}`);
writeFileSync(tmpPath, [Link]);
// Enviar medio de vuelta
return [Link]({
from: [Link].TWILIO_WHATSAPP_NUMBER,
to,
mediaUrl: [mediaUrl]
});
}
[Link] = { downloadAndSend };
7. Servidor Principal ( [Link] )
require('dotenv').config();
const express = require('express');
const bodyParser = require('body-parser');
const { handleMentionAll } = require('./modules/mentions');
const { downloadAndSend } = require('./modules/downloads');
const twilio = require('twilio');
const app = express();
[Link]([Link]({ extended: false }));
const client = twilio([Link].TWILIO_ACCOUNT_SID,
[Link].TWILIO_AUTH_TOKEN);
[Link]('/webhook', async (req, res) => {
const from = [Link];
const to = [Link];
const body = [Link] || '';
try {
if ([Link]('+all')) {
await handleMentionAll(client, from, from);
} else if (/https?:\/\/.+/.test(body)) {
await downloadAndSend(client, [Link](), from);
}
[Link](200);
} catch (err) {
[Link]([Link]);
[Link](500).send([Link]);
3
}
});
const PORT = [Link] || 3000;
[Link](PORT, () => [Link](`Servidor escuchando en puerto ${PORT}`));
8. Ejecutar y Probar
1. Instala dependencias:
npm init -y
npm install express body-parser twilio axios dotenv
1. Inicia el servidor localmente:
node [Link]
1. Expón tu webhook con Ngrok:
ngrok http 3000
Copia la URL generada ([Link]. [Link] ) y configúrala en la consola de Twilio
como tu Webhook de mensajes entrantes.
1. Envía mensajes de prueba a tu número de WhatsApp de Twilio.
9. Producción Local con PM2 (Opcional)
pm install -g pm2
pm install
pm run start
pm2 start [Link] --name "whatsapp-bot"
Con esto tu bot se mantendrá activo aun cerrando la terminal.
Ahora tienes un ejemplo funcional, modular y comentado para continuar extendiendo funcionalidades
y escalar tu bot según tus necesidades. ¡Éxitos!