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' });
}
});
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.' : ''}`);
});