Article image
Hector Velasquez
Hector Velasquez30/04/2021 14:23
Compartilhe

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á:

  1. Instalação e configuração do nosso ambiente de trabalho.
  2. Salvar a sessão do WhatsApp.
  3. Enviar mensagem.
  4. 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();

image

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

Compartilhe
Comentários (3)

AA

Antonio Alexandre - 05/10/2021 08:51

Ola. tentei rodar e não consegui, é possível você me ajudar fazer rodar depois me viro, se for caso, podemos negociar um valor.


Preciso basicamente de um sistema assim, cliente abre navegador, lê o QRCODE, e apartir dai as mensagens recebidas tem uma resposta XYZ (pode ser fixa) depois eu altero.


Se puder me chama no whats app (12) 9 9798-1703 - vou te agradecer muito e podemos negociar um valor para 1 hora de apoio

Felipe Fernandes
Felipe Fernandes - 30/04/2021 16:05

Muito bacana!!!

Marcos Cruz
Marcos Cruz - 30/04/2021 14:33

Parabéns e Obrigado !!