Saltar al contenido principal
Esta página amplía el bot de Inicio rápido hasta uno que maneja comandos, media, una encuesta y un flujo de varios pasos con validación. Funciona sin cambios en el simulador de la terminal y en WhatsApp.

El bot completo

Pruébalo

Envía /reset en mitad del flujo para salir: los comandos siempre ganan a una conversación activa.

Qué hace cada parte

1. El bot y su provider

new Bot({ provider }) conecta el motor agnóstico de transporte con un transporte. Las opciones del transporte van en el provider: session: 'my-bot' guarda la sesión de WhatsApp en ./sessions/my-bot/, así que los siguientes arranques reconectan sin QR. defineBot e isMainModule permiten que el simulador inyecte su propio provider en lugar de BaileysProvider (ver Simulador en la terminal). lang: 'es' pone en español los textos que el framework escribe por ti (respuestas de los comandos slash, “responde con texto”, timeouts). Sin esa opción salen en inglés. Internacionalización explica cómo atender varios idiomas.

2. Comandos slash

slashCommandsPlugin instala /start, /help, /reset, /cancel, /id y /ping. greeting sustituye el texto de /start y /help, así que lista tus comandos en él; sin greeting ambos responden con la lista de comandos integrada. Los comandos ganan a una conversación activa, así que /reset o /cancel siempre sacan de un flujo.

3. Respuestas simples

bot.when(trigger, handler) compara el mensaje completo, normalizado (minúsculas, sin tildes, espacios colapsados): 'hola' coincide con “hola” y “Hóla ”, no con “hola amigo”. Una lista coincide con cualquiera de sus entradas. Usa { pattern: 'hola', match: 'contains' } para buscar una subcadena, o una regex. ctx.pushName es el nombre visible del remitente cuando el transporte lo informa. Todas las formas de trigger están en Triggers especiales.

4. Media y encuestas

Todos los métodos de envío de ctx aceptan una URL, una ruta local o un Buffer:
Lo que cada transporte admite de forma nativa, y cómo se degrada el resto, está en Mensajes y media y Canales.

5. Flujos

flow('registro') compila a una conversación real. .ask(text, key) envía text, espera la respuesta y la guarda en c.state[key]; validate devuelve true o el texto que se envía antes de volver a preguntar. .choose() envía un menú numerado y guarda la clave elegida (el usuario puede responder con el número o con la etiqueta). La forma función de .say((ctx, c) => ...) lee todo lo capturado hasta ese momento, y .timeout('5m') termina una conversación abandonada. El flujo empieza cuando un mensaje coincide con su trigger (registro). Más en Flujos conversacionales.

6. Catch-all

bot.onMessage() se ejecuta solo cuando nada más (un comando, una conversación activa, un handler when o el trigger de un flujo) consumió el mensaje.

7. Arranque

bot.on('qr') se dispara cuando el provider necesita que te autentiques (un QR en Baileys); bot.on('ready'), cuando el transporte ya está conectado. Después de await bot.start() el bot puede enviar; antes, los envíos se rechazan con BotNotRunningError.

Siguientes pasos