Skip to main content
  1. Posts/

Build WhatsApp Bot with whatsapp-web.js

·4 mins·
nodejs nodejs
Table of Contents

whatsapp-web.js merupakan library NodeJS agar dapat terhubung ke WhatsApp Web. Biasanya library ini digunakan untuk membuat bot di WhatsApp yang dijalankan menggunakan Puppeteer agar terhindar dari resiko pemblokiran.

Perlu diketahui jika WhatsApp tidak mengizinkan bot atau klien tidak resmi di platform mereka, jadi hal ini tidak dianggap sepenuhnya aman.

Installation
#

Install NodeJS minimal versi 12 keatas.

apt -y install nodejs

Untuk mengecek versi NodeJS gunakan perintah.

$ node -v
v18.19.0

Buat direktori dengan nama wabot untuk menyimpan script NodeJS.

mkdir wabot; cd wabot

Selanjutnya install module whatsapp-web.js dan qrcode-terminal

npm i whatsapp-web.js qrcode-terminal

Agar Puppeteer dapat bekerja, install dependensi berikut.

apt -y install gconf-service libgbm-dev libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget

Buat file whatsapp.js lalu tambahkan kode berikut.

const qrcode = require('qrcode-terminal');
const { Client, LocalAuth, MessageMedia } = require('whatsapp-web.js');

const client = new Client({
    authStrategy: new LocalAuth(),
    // proxyAuthentication: { username: 'username', password: 'password' },
    puppeteer: {
        args: ['--no-sandbox'],
        headless: true
    }
});

client.on('qr', (qr) => {
    qrcode.generate(qr, { small: true });
});

client.on('ready', () => {
    console.log('Client is ready!');
});

client.initialize();

module.exports= client;

File whatsapp.js akan digunakan untuk load modul whatsapp-web.js dan qrcode-terminal untuk generate QR Code agar bisa di scan melalui HP.

Buat file dengan index.js dan tambahkan kode berikut.

const client = require('./whatsapp');

client.on('message', (message) => {
        console.log(message.body);
});

client.on('message', async (message) => {
        if (message.body === '!ping') {
                await message.reply('pong');
        }
});

client.on('message', async (message) => {
        if (message.body === '!halo') {
                await client.sendMessage(message.from, 'hai');
        }
});

File index.js berisi fungsi listen message dan fungsi reply message.

Test Run
#

Jalankan index.js dengan perintah.

node index.js

Selanjutnya scan QR dan tunggu hingga muncul Client is ready!

Kemudian test dengan mengirim pesan !ping atau !halo

Jika mendapatkan respon pong artinya bot di whatsapp sudah bekerja.

Usage
#

Perlu diketahui jika whatsapp-web.js mendukung beberapa fitur yang dapat Anda cek melalui https://github.com/pedroslopez/whatsapp-web.js

Berikut merupakan beberapa penerapan kode yang menurut saya menarik untuk digunakan.

authenticated
#

Ini akan menginformasikan apakah sesi yang tersimpan setelah scan QR berhasil direstore atau tidak.

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

client.on('auth_failure', msg => {
    // Fired if session restore was unsuccessful
    console.error('AUTHENTICATION FAILURE', msg);
});

Tambahkan kode sebelum baris client.initialize, lalu jalankan ulang index.js. Jika berhasil akan muncul seperti berikut.

$ node index.js
AUTHENTICATED
Client is ready!

loading_screen
#

Ketika Anda menjalankan index.js dan telah scan QR, maka Anda perlu menunggu sampai Client is ready!. Disini terdapat kode yang dapat Anda tambahkan di file whatsapp.js untuk melihat progress sampai muncul Client is ready!

client.on('loading_screen', (percent, message) => {
    console.log('LOADING SCREEN', percent, message);
});

Tambahkan kode sebelum baris client.initialize, lalu jalankan ulang index.js. Jika berhasil akan muncul seperti berikut.

$ node index.js
LOADING SCREEN 0 WhatsApp
LOADING SCREEN 100 WhatsApp
Client is ready!

downloadMedia()
#

Anda dapat mengunduh media yang dikirim ke wabot dalam format base64 dengan menambahkan kode berikut di file index.js

client.on('message', async (msg) => {
    if (msg.hasMedia) {
        const media = await msg.downloadMedia();
        console.log(`
            *Media info*
            MimeType: ${media.mimetype}
            Filename: ${media.filename}
            Data (length): ${media.data.length}
            Data (base64): ${media.data}
        `);
    }
});

delete()
#

Untuk menghapus pesan yang memiliki quote

client.on('message', async (msg) => {
        if (msg.body === '!delete') {
          if (msg.hasQuotedMsg) {
            const quotedMsg = await msg.getQuotedMessage();
            if (quotedMsg.fromMe) {
              quotedMsg.delete(true);
            } else {
              msg.reply('I can only delete my own messages');
            }
        }
        }
});

getChat()
#

Untuk mengambil informasi chat seperti nama, dan jumlah pesan yang belum dibaca.

client.on('message', async (msg) => {
    if (msg.from) {
        const info = await msg.getChat();
        console.log(`
          nama : ${info.name}
          unread : ${info.unreadCount}
        `);
    }
});

MessageMedia()
#

Ada beberapa kode yang dapat digunakan untuk mengirim foto, audio, video, dan gif.

Sending Media

Media yang akan dikirim diubah menjadi base64-encoded dan harus disertai dengan mimetype media.

const { MessageMedia } = require('whatsapp-web.js');

client.on('message', async (msg) => {
    if (msg.body === '!send-media') {
        const media = new MessageMedia('image/png', base64Image);
        await client.sendMessage(msg.from, media, { caption: 'this is my caption' });
    }
});
bagian caption adalah opsional atau tidak harus ditambahkan.

Sending Local Files

Jika mengubah media menjadi string base64-encoded terlalu merepotkan, maka kode berikut akan mempermudah membaca file secara otomatis di base64 dan menentukan mime type dari file tersebut.

const { MessageMedia } = require('whatsapp-web.js');

client.on('message', async (msg) => {
    if (msg.body === '!send-media') {
        const media = MessageMedia.fromFilePath('./path/to/image.png');
        await client.sendMessage(msg.from, media);
    }
});

Sending Files from a URL

Kode berikut akan membantu mengirim file berdasarkan remote URL.

const { MessageMedia } = require('whatsapp-web.js');

client.on('message', async (msg) => {
    if (msg.body === '!send-media') {
        const media = await MessageMedia.fromUrl('https://via.placeholder.com/350x150.png');
        await client.sendMessage(msg.from, media);
    }
});

call.reject()
#

Untuk menolak panggilan masuk dan mengirimkan pesan setelahnya.

let rejectCalls = true;

client.on('call', async (call) => {
    console.log('Call received, rejecting.', call);
    if (rejectCalls) await call.reject();
    await client.sendMessage(call.from, `[${call.fromMe ? 'Outgoing' : 'Incoming'}] Phone call from ${call.from}, type ${call.isGroup ? 'group' : ''} ${call.isVideo ? 'video' : 'audio'} call. ${rejectCalls ? 'This call was automatically rejected by the script.' : ''}`);
});

Related

PM2 Quick Start
·2 mins
nodejs nodejs pm2
Installing Nodejs
·1 min
nodejs linux nodejs
Serve HTML using Express.js
·1 min
nodejs html nodejs
Command 'ng' not found pada Angular
·1 min
nodejs angular nodejs
Error [ERR_REQUIRE_ESM] NodeJS CPanel
·1 min
nodejs cpanel nodejs
Fix Knex: run $ npm install mysql2 --save EEXIST: file already exists
·1 min
nodejs nodejs