Criar um bot WhatsApp com NodeJS
- #JavaScript
- #Node.js
- #Express
Recentemente tive que desenvolver um projeto no qual precisava enviar uma mensagem do WhatsApp quando um processo estava em execução. Queria compartilhar com vocês como consegui resolver isso. Fazendo pesquisas na web, encontrei uma biblioteca desenvolvida em NodeJs por Pedro Lopez, que simulava com o pupperteer as diferentes funções que podem ser executadas no WhatsApp. https://github.com/pedroslopez/whatsapp-web.js/
Esta biblioteca é um cliente WhatsApp API que se conecta por meio do aplicativo do navegador WhatsApp, usando o Puppeteer para executar uma instância real do WhatsApp Web para evitar o bloqueio. NOTA. O WhatsApp não permite bots ou clientes não oficiais em sua plataforma, então não garanto que esse método esteja sempre disponível.
Maõs na massa, desculpa no código
O que nosso bot fará:
- Instalação e configuração do nosso ambiente de trabalho.
- Salvar a sessão do WhatsApp.
- Enviar mensagem.
- Criar uma API para enviar mensagens.
1. Instalação e configuração do nosso ambiente de trabalho.
Criamos uma pasta com o nome do projeto, vou chamá-la de bot-whatsapp, dentro dela vamos executar os seguintes comandos
npm init -y
npm install --save whatsapp-web.js // cliente para Whatsapp
npm install --save qrcode-terminal // Gera um QR dentro do terminal
npm install -- save express // Cria nossa API
npm install --save cors // Libera os CORS para a API
dentro do bot-whatsapp, criamos um arquivo chamado index.js
2. Salvar a sessão do WhatsApp.
A primeira coisa é inicializar nossas bibliotecas e as variáveis que usaremos para o cliente e sessão de whatsapp
const fs = require('fs');
const qrcode = require('qrcode-terminal'); //QR Code no Terminal
const { Client, MessageMedia } = require('whatsapp-web.js'); // Whatsapp
const SESSION_FILE_PATH = './session.json';
let ws;
let dataSession;
Criamos duas funções, withOutSession() é fazer login e gerar o arquivo session.json com as variáveis de sessão da WhatsApp Web, a outra função withSession(), pega os valores do arquivo session.json e registra automaticamente.
// Valida la sesion
const withSession = () => {
dataSession = require(SESSION_FILE_PATH);
ws = new Client({ session: dataSession });
ws.on('ready', () => console.log('Cliente está pronto!'));
ws.on('auth_failure', () => {
console.log('** O erro de autenticação regenera o QRCODE (Excluir o arquivo session.json) **');
})
ws.initialize();
}
const withOutSession = () => {
ws = new Client();
// Geramos o QRCODE no Terminal
ws.on('qr', qr => { qrcode.generate(qr, { small: true }); });
ws.on('ready', () => console.log('Cliente está pronto!'));
ws.on('auth_failure', () => {
console.log('** O erro de autenticação regenera o QRCODE (Excluir o arquivo session.json) **');
})
// Se for autenticado, gera um arquivo com as variáveis de sessão
ws.on('authenticated', (session) => {
dataSession = session;
fs.writeFile(SESSION_FILE_PATH, JSON.stringify(session), (err) => {
if (err) console.log(err);
});
});
ws.initialize();
}
No final apenas verificamos se nosso arquivo session.json existe com as credenciais do WhatsApp Web, se as credenciais estiverem corretas, ele irá logar automaticamente, caso contrário irá deletar o arquivo session.json e devemos escanear o QR.
/**
* Verificamos se existe um arquivo com credenciais!
*/
(fs.existsSync(SESSION_FILE_PATH)) ? withSession() : withOutSession();
3. Enviar mensagem.
Agora vamos criar duas funções para enviar mensagens, a primeira é enviar mensagem de texto
// Enviar mensagem
const sendMessage = (number = null, text = null) => {
number = number.replace('@c.us', '');
number = `${number}@c.us`
const message = text || `Olá, eu sou um BOT`;
ws.sendMessage(number, message);
}
a segunda é o envio de mensagens multimídia, onde a imagem está em uma pasta do nosso projeto chamada mídia
// Enviar mensagem Multimidia
const sendMessageMedia = (number, fileName, caption) => {
number = number.replace('@c.us', '');
number = `${number}@c.us`
const media = MessageMedia.fromFilePath(`./media/${fileName}`)
ws.sendMessage(number, media, { caption: caption });
}
4. Criar uma API para enviar mensagens.
Vamos inicializar nosso express e configurar para receber as informações e ser convertido em JSON e liberar o CORS
// API
const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(cors({ origin: true }));
Criamos as rotas e as funções de cada rota
// Controllers
const sendText = (req, res) => {
const { message, number } = req.body
sendMessage(number, message)
res.send({ status: 'Enviado mensagem!' })
}
const sendMidia = (req, res) => {
const { number, fileName, caption } = req.body
sendMessageMedia(number, fileName, caption)
res.send({ status: 'Enviado mensagem multimidia!' })
}
// Rotas
app.post('/send', sendText);
app.post('/sendMedia', sendMidia);
Inicializamos o servidor
// Ativar o Servidor
app.listen(9000, () => console.log('Server ready!'));
No final, o index.js
const fs = require('fs');
const qrcode = require('qrcode-terminal');
const { Client, MessageMedia } = require('whatsapp-web.js');
const express = require('express');
const cors = require('cors');
// Inicializamos el bot
const SESSION_FILE_PATH = './session.json';
let ws;
let dataSession;
/**
* Verificamos se salvamos as credenciais para fazer o login
* esta etapa evita verificar novamente o QRCODE
*/
const withSession = () => {
dataSession = require(SESSION_FILE_PATH);
ws = new Client({ session: dataSession });
ws.on('ready', () => console.log('Cliente está pronto!'));
ws.on('auth_failure', () => {
console.log('** O erro de autenticação regenera o QRCODE (Excluir o arquivo session.json) **');
fs.unlinkSync('./session.json');
})
ws.initialize();
}
/**
* Geramos um QRCODE para iniciar a sessão
*/
const withOutSession = () => {
ws = new Client();
// Geramos o QRCODE no Terminal
ws.on('qr', qr => { qrcode.generate(qr, { small: true }); });
ws.on('ready', () => console.log('Cliente está pronto!'));
ws.on('auth_failure', () => {
console.log('** O erro de autenticação regenera o QRCODE (Excluir o arquivo session.json) **');
fs.unlinkSync('./session.json');
})
ws.on('authenticated', (session) => {
dataSession = session;
fs.writeFile(SESSION_FILE_PATH, JSON.stringify(session), (err) => {
if (err) console.log(err);
});
});
ws.initialize();
}
/**
* Verificamos se existe um arquivo com credenciais!
*/
(fs.existsSync(SESSION_FILE_PATH)) ? withSession() : withOutSession();
/**
* Enviamos uma mensagem simples (texto) ao nosso cliente
* @param {*} number
*/
const sendMessage = (number = null, text = null) => {
number = number.replace('@c.us', '');
number = `${number}@c.us`
const message = text || `Olá, eu sou um BOT`;
ws.sendMessage(number, message);
}
/**
* Enviamos arquivos multimídia para nosso cliente
* @param {*} number
* @param {*} fileName
* @param {*} caption
*/
const sendMessageMedia = (number, fileName, caption) => {
number = number.replace('@c.us', '');
number = `${number}@c.us`
const media = MessageMedia.fromFilePath(`./media/${fileName}`)
ws.sendMessage(number, media, { caption: caption });
}
// API
const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(cors({ origin: true }));
// Controllers
const sendText = (req, res) => {
const { message, number } = req.body
sendMessage(number, message)
res.send({ status: 'Enviado mensagem!' })
}
const sendMidia = (req, res) => {
const { number, fileName, caption } = req.body
sendMessageMedia(number, fileName, caption)
res.send({ status: 'Enviado mensagem multimidia!' })
}
// Rotas
app.post('/send', sendText);
app.post('/sendMedia', sendMidia);
// Ativar o Servidor
app.listen(9000, () => console.log('Server ready!'));
Aqui está o repositório do projeto, para que você tenha a liberdade de utilizá-lo, implementar novas funcionalidades, como: responder mensagens, agendar mensagens, criar um chatbot, etc ...
Vou deixar aqui o link desse projeto no github https://github.com/hectorcanaimero/bot-whatsapp