Construisez votre premier bot WhatsApp avec Node.js

Un guide complet et pas-à-pas pour créer votre premier bot WhatsApp en 2025 avec Node.js et Baileys.
Construisez Votre Premier Bot WhatsApp avec Node.js et Baileys

Automatiser WhatsApp. Le rêve de tout développeur, entrepreneur ou simple curieux. Envoyer des notifications, répondre automatiquement à des clients, créer des jeux, gérer des groupes... les possibilités sont infinies. Mais à peine l'idée germe-t-elle dans votre esprit qu'un mur se dresse : comment diable interagir par programme avec l'application de messagerie la plus utilisée au monde ?

Aujourd'hui, on ne va pas juste effleurer le sujet. On va plonger tête la première. On va construire, de zéro, un bot WhatsApp fonctionnel en utilisant Node.js et la bibliothèque la plus puissante et la plus respectée pour cette tâche : Baileys. Ce n'est pas un simple tutoriel, c'est un guide complet qui vous mènera de la théorie à la pratique, en vous montrant comment mettre en place la connexion, gérer les messages et créer un bot interactif avec un menu d'options. LET'S GO 🔥.

Avertissement important : L'utilisation d'API non officielles pour automatiser un compte WhatsApp personnel est contraire aux conditions d'utilisation de WhatsApp. Cela peut potentiellement entraîner un bannissement de votre numéro. Ce guide est à des fins purement éducatives. Utilisez-le avec un numéro de test et à vos propres risques.

Un p'tit moment avant d'attaquer le code :)

Avant d'écrire la moindre ligne de code, il est crucial de comprendre l'écosystème. Il existe trois grandes façons de parler à WhatsApp par programme, et chacune a ses avantages et ses inconvénients majeurs.

1. L'API Officielle (WhatsApp Cloud API)

C'est la voie légitime, approuvée par Meta. Conçue pour les entreprises, elle est incroyablement puissante, stable et intégrée à l'écosystème Meta. Mais elle vient avec des contraintes énormes :

  • Coût : C'est un service payant, facturé à la conversation.
  • Configuration complexe : Il faut un compte Meta Business, une vérification d'entreprise, et une configuration via la plateforme Cloud de Meta.
  • Messages limités : Vous ne pouvez pas envoyer de message librement. Vous devez utiliser des "modèles" pré-approuvés, et vous ne pouvez répondre à un utilisateur que dans une fenêtre de 24 heures.
Verdict : Parfait pour les grandes entreprises, mais totalement inadapté pour les projets personnels, les expérimentations ou les petites entreprises au budget serré.

2. L'Approche "Browser" : whatsapp-web.js

Cette bibliothèque très populaire utilise une approche ingénieuse : elle pilote une véritable instance du navigateur Chrome en arrière-plan (via Puppeteer) pour automatiser WhatsApp Web. C'est littéralement comme avoir un robot qui clique et tape pour vous sur web.whatsapp.com.
L'inconvénient est colossal :

  • Ressources : Faire tourner un navigateur complet 24h/24 et 7j/7 consomme une quantité significative de RAM et de CPU. C'est lourd, très lourd.
  • Stabilité : Si WhatsApp met à jour son site web, même un petit changement de CSS peut casser complètement la bibliothèque, la rendant inutilisable jusqu'à ce qu'un correctif soit publié.
Verdict : Idéal pour débuter et comprendre les bases, mais difficile à maintenir en production de manière fiable et économique.

3. L'Approche "Protocole" : Baileys

Baileys adopte la stratégie la plus élégante et la plus performante. Au lieu d'automatiser le site web, ses créateurs ont fait de la rétro-ingénierie sur le protocole de communication que WhatsApp Web utilise pour parler aux serveurs de WhatsApp.
En clair, Baileys ne fait pas semblant d'être un utilisateur dans un navigateur. Il parle directement le langage de WhatsApp. Les avantages sont spectaculaires :

  • Légèreté : Pas de navigateur. Juste une connexion WebSocket. La consommation de ressources est minime.
  • Stabilité : Moins sensible aux mises à jour de l'interface graphique de WhatsApp Web. Tant que le protocole sous-jacent ne change pas radicalement, Baileys continue de fonctionner.
  • Puissance : Il donne accès à des fonctionnalités beaucoup plus fines et avancées.
Verdict : C'est la solution de choix pour tout projet sérieux, performant et stable. C'est plus complexe à prendre en main, mais c'est l'outil des pros. Et c'est ce que nous allons utiliser.

Mise en place de notre setup de dev

Assez de théorie. Mettons les mains dans le 😇.

  1. Prérequis : Assurez-vous d'avoir Node.js (version 18 ou supérieure) installé sur votre machine.
  2. Créez un dossier de projet : Ouvrez votre terminal, et tapez :
    mkdir mon-bot-whatsapp
    cd mon-bot-whatsapp
  3. Initialisez un projet Node.js : npm init -y Cela crée un fichier package.json
  4. Installez les dépendances : On a besoin de deux paquets.
    npm install @whiskeysockets/baileys qrcode-terminal
    • @whiskeysockets/baileys : C'est le cœur de notre bot. C'est la version la plus activement maintenue de Baileys.
    • qrcode-terminal : Une petite librairie très pratique pour afficher les QR codes directement dans notre terminal.

Étape 1 : La connexion

Notre première tâche est d'établir la connexion avec les serveurs de WhatsApp. Pour cela, Baileys va imiter la fonctionnalité "Appareils connectés" de votre téléphone. Il va générer un QR code que nous devrons scanner. Une fois scanné, Baileys sauvegardera les clés d'authentification dans un dossier pour ne pas avoir à le refaire à chaque démarrage.

Créez un fichier bot.js et insérez-y ce premier morceau de code :

// On importe les librairies nécessaires
const { default: makeWASocket, useMultiFileAuthState } = require('@whiskeysockets/baileys');
const qrcode = require('qrcode-terminal');
const pino = require('pino');

// Fonction principale asynchrone pour gérer la connexion
async function connectToWhatsApp() {
    // `useMultiFileAuthState` va gérer la sauvegarde et la restauration de notre session
    const { state, saveCreds } = await useMultiFileAuthState('auth_info_baileys');

    // On crée un socket (connexion) avec notre état d'authentification
    const sock = makeWASocket({
        auth: state,
        logger: pino({ level: 'silent' }) // 🚫 on coupe les logs internes de Baileys
    });

    // On écoute les événements de connexion
    sock.ev.on('connection.update', (update) => {
        const { connection, lastDisconnect, qr } = update;

        if (qr) {
            console.log('QR Code reçu, scannez-le :');
            qrcode.generate(qr, { small: true });
        }

        if (connection === 'close') {
            const shouldReconnect = (lastDisconnect?.error)?.output?.statusCode !== 401; // 401 = problème d’authentification
            console.log('Connexion fermée à cause de :', lastDisconnect?.error, ', reconnexion :', shouldReconnect);
            if (shouldReconnect) connectToWhatsApp();
        } else if (connection === 'open') {
            console.log('✅ Connexion ouverte ! Le bot est prêt.');
        }
    });

    // On écoute les changements de crédentiels pour les sauvegarder
    sock.ev.on('creds.update', saveCreds);
}

// On lance la fonction de connexion
connectToWhatsApp();

Pour tester : Lancez le script avec node bot.js. Un QR code va apparaître dans votre terminal. Ouvrez WhatsApp sur votre téléphone, allez dans Paramètres > Appareils connectés > Connecter un appareil et scannez le code. Vous devriez voir "Connexion ouverte !" et un dossier auth_info_baileys apparaître.

Étape 2 : Le bot "Ping-Pong" - Répondre aux messages

Maintenant que nous sommes connectés, il est temps d'écouter les messages entrants et d'y répondre. On va ajouter un écouteur d'événements pour messages.upsert. Cet événement se déclenche à chaque nouveau message.

Modifiez votre fichier bot.js en ajoutant le bloc suivant à l'intérieur de la fonction connectToWhatsApp, juste après l'écouteur creds.update :

    // ... (code précédent de connexion)

    // On écoute les nouveaux messages
    sock.ev.on('messages.upsert', async (m) => {
        const msg = m.messages[0];

        // On ignore les messages sans contenu ou envoyés par nous-mêmes
        if (!msg.message || msg.key.fromMe) return; 
        // 💡 Décommentez "msg.key.fromMe" si vous voulez tester avec vos propres messages

        // On récupère le texte du message et le numéro de l'expéditeur
        const msgText = msg.message.conversation || msg.message.extendedTextMessage?.text;
        const sender = msg.key.remoteJid;

        console.log(`Message reçu de ${sender}: "${msgText}"`);

        // Notre première logique : le bot "ping-pong"
        if (msgText && msgText.toLowerCase() === 'ping') {
            console.log('Réponse à "ping" par "pong"');
            await sock.sendMessage(sender, { text: 'Pong' });
        }
    });

Relancez votre bot (node bot.js). Cette fois, il ne vous demandera pas de scanner le QR code (grâce au dossier auth_info_baileys). Envoyez "ping" à votre numéro de bot. Vous devriez recevoir "Pong" en réponse !

Étape 3 : Le Bot à menu - Créer de l'interaction

Un bot qui ne dit que "Pong" est limité. Créons un menu simple. Le bot répondra à la commande !menu et proposera des options.

Remplacez le bloc messages.upsert précédent par celui-ci, plus évolué :

    // ... (code précédent de connexion)
    
    sock.ev.on('messages.upsert', async (m) => {
        const msg = m.messages[0];

        // On ignore les messages vides ou nos propres messages
        if (!msg.message || msg.key.fromMe) return; 
        // 💡 Décommentez "msg.key.fromMe" si vous voulez tester avec vos propres messages

        const msgText = msg.message.conversation || msg.message.extendedTextMessage?.text;
        const sender = msg.key.remoteJid;

        if (!msgText) return;

        console.log(`Commande reçue de ${sender}: "${msgText}"`);
        
        // Logique du menu
        if (msgText.toLowerCase() === '!menu') {
            const menu = `🤖 *Menu du Bot* 🤖

Voici les commandes disponibles :
            
1️⃣ - *Info du jour*
2️⃣ - *Blague aléatoire*
3️⃣ - *Citation inspirante*`;

            await sock.sendMessage(sender, { text: menu });

        } else if (msgText === '1') {
            await sock.sendMessage(sender, { text: "📢 Info du jour : Le miel ne se périme jamais !" });

        } else if (msgText === '2') {
            await sock.sendMessage(sender, { text: "😂 Blague : Pourquoi les plongeurs plongent-ils toujours en arrière ? Parce que sinon ils tombent dans le bateau !" });

        } else if (msgText === '3') {
            await sock.sendMessage(sender, { text: "💡 Citation : « Le meilleur moment pour planter un arbre était il y a 20 ans. Le deuxième meilleur moment est maintenant. »" });
        }
    });

Le Code Complet

Pour plus de clarté, voici le fichier bot.js complet et final, avec tous les morceaux assemblés.

const { default: makeWASocket, useMultiFileAuthState } = require('@whiskeysockets/baileys');
const qrcode = require('qrcode-terminal');
const pino = require('pino');

async function connectToWhatsApp() {
    const { state, saveCreds } = await useMultiFileAuthState('auth_info_baileys');
    const sock = makeWASocket({
        auth: state,
        logger: pino({ level: 'silent' }) // 🚫 coupe les logs Baileys
    });

    sock.ev.on('connection.update', (update) => {
        const { connection, lastDisconnect, qr } = update;
        if (qr) {
            console.log('QR Code reçu, scannez-le :');
            qrcode.generate(qr, { small: true });
        }
        if (connection === 'close') {
            const shouldReconnect = (lastDisconnect?.error)?.output?.statusCode !== 401;
            console.log('Connexion fermée :', lastDisconnect?.error, ', reconnexion :', shouldReconnect);
            if (shouldReconnect) connectToWhatsApp();
        } else if (connection === 'open') {
            console.log('✅ Connexion ouverte !');
        }
    });

    sock.ev.on('creds.update', saveCreds);

    sock.ev.on('messages.upsert', async (m) => {
        const msg = m.messages[0];

        // On ignore les messages vides ou nos propres messages
        if (!msg.message || msg.key.fromMe) return; 
        // 💡 Décommentez "msg.key.fromMe" si vous voulez que le bot réponde aussi à vos messages

        const msgText = msg.message.conversation || msg.message.extendedTextMessage?.text;
        const sender = msg.key.remoteJid;

        if (!msgText) return;
        
        console.log(`Commande de ${sender}: "${msgText}"`);

        if (msgText.toLowerCase() === '!menu') {
            const menu = `🤖 *Menu du Bot* 🤖

Voici les commandes disponibles :
            
1️⃣ - *Info du jour*
2️⃣ - *Blague aléatoire*
3️⃣ - *Citation inspirante*`;

            await sock.sendMessage(sender, { text: menu });

        } else if (msgText === '1') {
            await sock.sendMessage(sender, { text: "📢 Info du jour : Le miel ne se périme jamais !" });

        } else if (msgText === '2') {
            await sock.sendMessage(sender, { text: "😂 Blague : Pourquoi les plongeurs plongent-ils toujours en arrière ? Parce que sinon ils tombent dans le bateau !" });

        } else if (msgText === '3') {
            await sock.sendMessage(sender, { text: "💡 Citation : « Le meilleur moment pour planter un arbre était il y a 20 ans. Le deuxième meilleur moment est maintenant. »" });
        }
    });
}

connectToWhatsApp();

Conclusion et Prochaines Étapes

Félicitations ! Vous avez non seulement compris les nuances de l'écosystème d'automatisation WhatsApp, mais vous avez aussi construit un bot fonctionnel avec la meilleure technologie disponible. Vous avez appris à gérer la connexion, l'authentification, la réception de messages et la logique de réponse.

Ce n'est que le début. Baileys est une bibliothèque incroyablement riche. Vous pouvez explorer comment envoyer des images, des vidéos, des boutons, créer et gérer des groupes... La documentation officielle est votre meilleure amie pour la suite. Maintenant, à vous de construire des bots encore plus incroyables. 🔥

Enregistrer un commentaire

N'hésitez pas de mentionner votre nom d'utilisateur Telegram à la fin de votre message pour recevoir des cadeaux de la part des modérateurs. Merci de commenter