others

Membuat whatsapp web js multi session dengan remoteauth dan mongodb

Table of Contents

Library

  1. nodemon
  2. socket.io
  3. express
  4. whatsappweb.js
  5. wwebjs-mongo
  6. cors

Alat

  • apache server
  • mongoDB server
    • buat database baru dengan namam whatsappBot
    • masuk ke mongosh dan ketikkan perintah berikut
    • use whatsappBot

Persiapan

  1. buat folder project dengan nama wa-api
  2. buka terminal editor dan masuk ke folder project tersebut
    • misal cd Desktop/web-socket
  3. inisialisasi aplikasi dalam folder project
    • npm init --y
  4. install library yang akan digunakan
    • npm install -g nodemon
    • npm i whatsapp-web.js
    • npm i wwebjs-mongo
    • npm i express
    • npm i cors
    • npm i qrcode
    • npm install socket.io
    • npm install mongoose
  5. pada file project buat file baru dengan nama index.js
    • masukkan kode berikut
//library

const express = require('express');

const app = express();
const http = require('http'); 
const server = http.createServer(app)

const QRCode = require('qrcode');

// handle wa
const { Client, RemoteAuth } = require('whatsapp-web.js')

// socket
const socketIO = require("socket.io"); 
const io = socketIO(server, { cors: { origin: '*' } });
// end

// Require database
const { MongoStore } = require('wwebjs-mongo');
const mongoose = require('mongoose');
const MONGODB_URI = "mongodb://127.0.0.1:27017/whatsappBot"

// Load the session data
let store
mongoose.connect(MONGODB_URI).then(() => {
    console.log("mongoDB Connected")
    store = new MongoStore({ mongoose: mongoose });  
});

//client page  
app.get('/', (req, res) => {
  //res.send('<h1>Hello world</h1>');
  res.sendFile(__dirname + '/index.html');
});

server.listen(8001, function() {
    console.log('app running on *: '+8001)
})

//handling conn socket.io
io.on('connection', (socket) => {
    console.log('a user connected');
  
    socket.on('request_create_sess', (data) => {   
        // console.log(data)
        const { id } = data
        socket.emit('message','request create session')
        createWhatsappSession(id,socket)
    });

    socket.on('request_get_sess', (data) => {   
        // console.log(data)
        const { id } = data
        socket.emit('message','request get session')
        getWhatsappSession(id,socket)
    });

    socket.on('disconnect', () => {
        socket.emit('message','user disconnected')
        console.log('user disconnected');
    });
});
//simpan variabel client agar bisa dipakai diluar function
const allSessionsObject = {} 

//function
const allSessionsObject = {} 

const getWhatsappSession = (id, socket) => {
    const client = new Client({
        authStrategy: new RemoteAuth({
            clientId: id,
            store: store,
            backupSyncIntervalMs: 300000
        }),
        puppeteer: { headless: true,args: ['--no-sandbox', '--disable-setuid-sandbox']} 
    })

    client.on('ready', () => {  
        socket.emit('ready', {
            id,
            messages: "Whatsapp is ready again"
        });

        allSessionsObject[id] = client; 
    });

    client.on("qr", qr => { 
        QRCode.toDataURL(qr, (err, url) => {
            if (err) throw err;
            // Kirim QR Code ke client
            socket.emit('qrcode', url);
            socket.emit('message','client is logout, please scan qr code please..')
        });
    })   

    client.on('authenticated', () => { 
        console.log('AUTHENTICATED');  
        socket.emit('message','client is authenticated')
    }); 

    client.on('remote_session_saved', () => {
        socket.emit('message','Remote Session Saved')
        console.log("Remote Session Saved")
    });

    client.initialize()
}

const createWhatsappSession = (id, socket) => {
   
    const client = new Client({
        authStrategy: new RemoteAuth({
            clientId: id,
            store: store,
            backupSyncIntervalMs: 300000
        }),
        puppeteer: { headless: true,args: ['--no-sandbox', '--disable-setuid-sandbox']} 
    })

    client.on("qr", qr => { 
        QRCode.toDataURL(qr, (err, url) => {
            if (err) throw err;
            // Kirim QR Code ke client
            socket.emit('qrcode', url);
            socket.emit('message','QR Code received, scan please..')
        });
    })   

    //The authenticated event
    client.on('authenticated', () => { 
        console.log('AUTHENTICATED');  
        socket.emit('message','client is authenticated')
    }); 
    
    client.on('ready', () => {
        socket.emit('ready','Whatsapp is ready')
        socket.emit('message','Whatsapp is ready')

        allSessionsObject[id] = client;
    });

    client.on('remote_session_saved', () => {
        socket.emit('message','Remote Session Saved')
        console.log("Remote Session Saved")
    });

    client.initialize() 
}
  1. buat client page
    • buat file index.html
<!DOCTYPE html>
<html>
    <head> 
        <title>Whatsapp API by Aswin</title> 
    </head>

    <body>

        <button id='stop_ws'>Disconnect ws</button><br>

        <input id='session' type="text">
        <button id='create_sess' >create session</button>

        <br>

        <input id='get_session' type="text">
        <button id='get_sess' >get session</button>

        <div id='app'>
            <h1>Whatsapp API</h1>
            <p>Powered by Aswindev</p>
            <img src="" alt="QR Code" id="qrcode">
            <h3>Logs:</h3>
            <ul class="logs"></ul>

            <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js" integrity="sha512-bLT0Qm9VnAYZDflyKcBaQ2gg0hSYNQrJ8RilYldYQ1FxQYoCLtUjuuRuZo+fjqhx/qtq/1itJ0C2ejDxltZVFg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
        
            <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.4.0/socket.io.min.js" integrity="sha512-I9p4eOeWXGM9m5GhJYd3UDUA5Lr+Epp5e4ykWFYW9hv3jZqdR92S5p+ApMSWuMaV4E+JqILepP1G9kNer4AFGQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
           
           <script>
                var socket = io.connect('http://localhost:8001/',{path: '/socket.io'})

               $('#stop_ws').click(()=>{ 
                    console.log('stop');
                    socket.close(); 
                }); 

                $('#create_sess').click(()=>{ 
                    var session = $('#session').val();
                    console.log(session);
                    socket.emit("request_create_sess",{
                        id: session,
                    });     
                });  

                $('#get_sess').click(()=>{ 
                    var session = $('#get_session').val();
                    console.log(session);
                    socket.emit("request_get_sess",{
                        id: session,
                    });     
                });

                $(document).ready(function(){ 

                    socket.on('message', function(msg){
                        // console.log(msg)
                        $('.logs').append($('<li>').text(msg))
                    }) 

                    socket.on('qrcode', function(src){ 
                        $('#qrcode').attr('src',src)
                    }) 

                    socket.on('ready', function(src){ 
                        $('#qrcode').hide()
                    }) 

                    socket.on('authenticated', function(src){ 
                        $('#qrcode').hide()
                    }) 
                }) 
            </script>
        </div>
    </body>
</html>
// library dan variabel

const express = require('express');
const app = express();
const http = require('http');
const server = http.createServer(app);
const QRCode = require('qrcode');

// Require database
const { MongoStore } = require('wwebjs-mongo');
const mongoose = require('mongoose');
const MONGODB_URI = "mongodb://127.0.0.1:27017/whatsapp"

// handling cross-origin
const cors = require('cors'); 

// socket
const { Server } = require("socket.io"); 
const io = new Server(server, { cors: { origin: '*' } });
// end


// Load the session data
let store
mongoose.connect(MONGODB_URI).then(() => {
    console.log("mongoDB Connected")
    store = new MongoStore({ mongoose: mongoose });  
});

// handle wa
const { Client, LocalAuth, RemoteAuth } = require('whatsapp-web.js')

// wa client & session
const allSessionsObject = {}

const getWhatsappSession = (id, socket) => {
    const client = new Client({
        authStrategy: new RemoteAuth({
            clientId: id,
            store: store,
            backupSyncIntervalMs: 300000
        }),
        puppeteer: { headless: true,args: ['--no-sandbox', '--disable-setuid-sandbox']} 
    })

    client.on('ready', () => {  
        socket.emit('ready', {
            id,
            messages: "Whatsapp is ready again"
        });
    });

    client.on("qr", qr => { 
        QRCode.toDataURL(qr, (err, url) => {
            if (err) throw err;
            // Kirim QR Code ke client
            socket.emit('qrcode', url);
            socket.emit('message','client is logout, please scan qr code please..')
        });
    })   

    client.on('authenticated', () => { 
        console.log('AUTHENTICATED');  
        socket.emit('message','client is authenticated')
    }); 

    client.on('remote_session_saved', () => {
        socket.emit('message','Remote Session Saved')
        console.log("Remote Session Saved")
    });

    client.initialize()
}

const createWhatsappSession = (id, socket) => {
   
    const client = new Client({
        authStrategy: new RemoteAuth({
            clientId: id,
            store: store,
            backupSyncIntervalMs: 300000
        }),
        puppeteer: { headless: true,args: ['--no-sandbox', '--disable-setuid-sandbox']} 
    })

    client.on("qr", qr => { 
        QRCode.toDataURL(qr, (err, url) => {
            if (err) throw err;
            // Kirim QR Code ke client
            socket.emit('qrcode', url);
            socket.emit('message','QR Code received, scan please..')
        });
    })   

    //The authenticated event
    client.on('authenticated', () => { 
        console.log('AUTHENTICATED');  
        socket.emit('message','client is authenticated')
    }); 
    
    client.on('ready', () => {
        socket.emit('ready','Whatsapp is ready')
        socket.emit('message','Whatsapp is ready')

        allSessionsObject[id] = client;
    });

    client.on('remote_session_saved', () => {
        socket.emit('message','Remote Session Saved')
        console.log("Remote Session Saved")
    });

    client.initialize() 
}


//page  
app.get('/', (req, res) => {
  //res.send('<h1>Hello world</h1>');
  res.sendFile(__dirname + '/index.html');
});

 
io.on('connection', (socket) => {
    console.log('a user connected');

    socket.on('request_qrCode', function() {  
        // Generate QR Code
        client.on("qr", qr => { 
            QRCode.toDataURL(qr, (err, url) => {
                if (err) throw err;
                // Kirim QR Code ke client
                socket.emit('qrcode', url);
                socket.emit('message','QR Code received, scan please..')
            });
        })   

        client.on('ready', () => {
            socket.emit('ready','Whatsapp is ready')
            socket.emit('message','Whatsapp is ready')
        }); 

        //The authenticated event
        client.on('authenticated', (session) => {
            socket.emit('authenticated','Whatsapp is authenticated')
            socket.emit('message','Whatsapp is authenticated')

            console.log('AUTHENTICATED', session);
            sessionCfg=session;
            fs.writeFile(SESSION_FILE_PATH, JSON.stringify(session), function (err) {
                if (err) {
                    console.error(err);
                }
            });
        });
        // end 

    }); 

    socket.on('request_create_sess', (data) => {   
        // console.log(data)
        const { id } = data
        socket.emit('message','request create session')
        createWhatsappSession(id,socket)
    });

    socket.on('request_get_sess', (data) => {   
        // console.log(data)
        const { id } = data
        socket.emit('message','request get session')
        getWhatsappSession(id,socket)
    });

    socket.on('disconnect', () => {
        socket.emit('message','user disconnected')
        console.log('user disconnected');
    });
});
// end

server.listen(6060, () => { 
  console.log('listening on *:6060');
});


  • jalankan server
    • nodemon index.js
  • buka browser dengan url : localhost:8001

masukkan nama session dan klik create session

scan qr code

jika dicek di database mongosh

  • use whatsappBot
  • show collections

mencoba mendapatkan session yang telah disimpan

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button

Table of Contents

Index