// BACKEND DA API
// BIBLIOTECAS UTILIZADAS PARA COMPOSIÇÃO DA API
const { Client, LocalAuth, MessageMedia } = require('whatsapp-web.js');
const express = require('express');
const socketIO = require('socket.io');
const qrcode = require('qrcode');
const http = require('http');
const fileUpload = require('express-fileupload');
const { body, validationResult } = require('express-validator');
const app = express();
const server = http.createServer(app);
const io = socketIO(server);
// PORTA ONDE O SERVIÇO SERÁ INICIADO
const port = 8001;
const idClient = 'bot-zdg-maratona-grupos';
// NUMEROS AUTORIZADOS
const permissaoBot = ["DDIdddXXXXXXXX@c.us"];
// SERVIÇO EXPRESS
app.use(express.json());
app.use(express.urlencoded({
extended: true
}));
app.use(fileUpload({
debug: true
}));
app.use("/", express.static(__dirname + "/"))
app.get('/', (req, res) => {
res.sendFile('index.html', {
root: __dirname
});
});
// PARÂMETROS DO CLIENT DO WPP
const client = new Client({
authStrategy: new LocalAuth({ clientId: idClient }),
puppeteer: { headless: true,
// CAMINHO DO CHROME PARA WINDOWS (REMOVER O COMENTÁRIO ABAIXO)
// executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
//===================================================================================
// CAMINHO DO CHROME PARA MAC (REMOVER O COMENTÁRIO ABAIXO)
//executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
//===================================================================================
// CAMINHO DO CHROME PARA LINUX (REMOVER O COMENTÁRIO ABAIXO)
//executablePath: '/usr/bin/google-chrome-stable',
//===================================================================================
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
'--disable-accelerated-2d-canvas',
'--no-first-run',
'--no-zygote',
'--single-process', // <- this one doesn't works in Windows
'--disable-gpu'
] }
});
// INITIALIZE DO CLIENT DO WPP
client.initialize();
// EVENTOS DE CONEXÃO EXPORTADOS PARA O INDEX.HTML VIA SOCKET
io.on('connection', function(socket) {
socket.emit('message', '© BOT-ZDG - Iniciado');
socket.emit('qr', './icon.svg');
client.on('qr', (qr) => {
console.log('QR RECEIVED', qr);
qrcode.toDataURL(qr, (err, url) => {
socket.emit('qr', url);
socket.emit('message', '© BOT-ZDG QRCode recebido, aponte a câmera seu celular!');
});
});
client.on('ready', async () => {
socket.emit('ready', '© BOT-ZDG Dispositivo pronto!');
socket.emit('message', '© BOT-ZDG Dispositivo pronto!');
socket.emit('qr', './check.svg')
console.log('© BOT-ZDG Dispositivo pronto');
const groups = await client.getChats()
for (const group of groups){
if(group.id.server.includes('g.us')){
socket.emit('message', 'Nome: ' + group.name + ' - ID: ' + group.id._serialized.split('@')[0]);
console.log('Nome: ' + group.name + ' - ID: ' + group.id._serialized.split('@')[0])
}
}
});
client.on('authenticated', () => {
socket.emit('authenticated', '© BOT-ZDG Autenticado!');
socket.emit('message', '© BOT-ZDG Autenticado!');
console.log('© BOT-ZDG Autenticado');
});
client.on('auth_failure', function() {
socket.emit('message', '© BOT-ZDG Falha na autenticação, reiniciando...');
console.error('© BOT-ZDG Falha na autenticação');
});
client.on('change_state', state => {
console.log('© BOT-ZDG Status de conexão: ', state );
});
client.on('disconnected', (reason) => {
socket.emit('message', '© BOT-ZDG Cliente desconectado!');
console.log('© BOT-ZDG Cliente desconectado', reason);
client.initialize();
});
});
// EVENTO DE ESCUTA DE MENSAGENS RECEBIDAS PELA API
client.on('message', async msg => {
if (msg.body === null) return;
// MENÇÃO FANTASMA
if (msg.body === '!aviso') {
let chat = await msg.getChat();
if (chat.isGroup) {
const mensagem = "Fala pessoal!\n\nVocês estão prestes a acessar os códigos, ferramentas, APIs e integrações gratuitas que eu aplico nos meus negócios para vender e realizar atendimentos no Whatsapp, de forma automatizada.\n\n👉 https://comunidadezdg.com.br/\n\nAbraços, te vejo na Comunidade ZDG!"
const imagem = MessageMedia.fromFilePath('./1.png');
const imagem2 = MessageMedia.fromFilePath('./2.png');
try{
const serializedArray = chat.participants.map(({ id: { _serialized } }) => _serialized);
client.sendMessage(msg.from, imagem, {caption: 'Respostas organizadas por tópicos e interação com membros da comunidade para resolver problemas do dia a dia'}, {mentions: serializedArray});
client.sendMessage(msg.from, imagem2, {caption: 'Dúvidas específicas para cada aula / implementação, com orientação para resolver problemas técnicos'}, {mentions: serializedArray});
delay(3000).then(async function() {
client.sendMessage(msg.from, mensagem, {mentions: serializedArray})
});
} catch (e){
console.log('© Comunidade ZDG')
}
}
}
});
// EVENTO DE ESCUTA DE MENSAGENS ENVIADAS PELA API
client.on('message_create', async msg => {
if (msg.body === 'Atenção!') {
if (chat.isGroup) {
let chat = await msg.getChat();
const mensagem = "Fala pessoal!\n\nVocês estão prestes a acessar os códigos, ferramentas, APIs e integrações gratuitas que eu aplico nos meus negócios para vender e realizar atendimentos no Whatsapp, de forma automatizada.\n\n👉 https://comunidadezdg.com.br/\n\nAbraços, te vejo na Comunidade ZDG!"
const imagem = MessageMedia.fromFilePath('./3.png');
try{
const serializedArray = chat.participants.map(({ id: { _serialized } }) => _serialized);
client.sendMessage(msg.to, imagem, {caption: 'Por dentro do Whaticket'}, {mentions: serializedArray});
delay(3000).then(async function() {
client.sendMessage(msg.to, mensagem, {mentions: serializedArray})
});
} catch (e){
console.log('© Comunidade ZDG')
}
}
}
if(msg.body === 'Padrao'){
const chat = await msg.getChat();
try{
let text = "";
let mentions = [];
for(let participant of chat.participants) {
const contact = await client.getContactById(participant.id._serialized);
mentions.push(contact);
text += `@${participant.id.user} `;
}
await chat.sendMessage('Sejam bem vindos: ' + text, { mentions: mentions });
} catch (e){
console.log('© Comunidade ZDG')
}
}
});
// EVENTO DE NOVO USUÁRIO EM GRUPO
client.on('group_join', async (notification) => {
// MENSAGEM DE SAUDAÇÃO
if (notification.id.remote) {
const contact = await client.getContactById(notification.id.participant)
const texto1 = ', tudo bem? Seja muito bem vindo ao grupo da *Comunidade ZDG*. \n\nPara solicitar sua licença, envie um e-mail para email@email com os seguintes dados :\n\n👉 *Assunto*: Licença ZDG - GRUPO\n👉 *Mensagem*: E-mail para liberar a licença: exemplo@gmail.com\n\nPs.: Só são aceitos e-mails com o domínio @gmail ou do workspace do Google.\n\nAbraços, Pedrinho';
const texto2 = ', como vai você? Seja muito bem vindo ao grupo da *Comunidade ZDG*. \n\nPara solicitar sua licença, envie um e-mail para email@email com os seguintes dados :\n\n👉 *Assunto*: Licença ZDG - GRUPO\n👉 *Mensagem*: E-mail para liberar a licença: exemplo@gmail.com\n\nPs.: Só são aceitos e-mails com o domínio @gmail ou do workspace do Google.\n\nAbraços, Pedrinho';
const texto3 = ', tudo certo? Seja muito bem vindo ao grupo da *Comunidade ZDG*. \n\nPara solicitar sua licença, envie um e-mail para email@email com os seguintes dados :\n\n👉 *Assunto*: Licença ZDG - GRUPO\n👉 *Mensagem*: E-mail para liberar a licença: exemplo@gmail.com\n\nPs.: Só são aceitos e-mails com o domínio @gmail ou do workspace do Google.\n\nAbraços, Pedrinho';
const textos = [texto1, texto2, texto3];
const mediaPath1 = MessageMedia.fromFilePath('./grupo.ogg');
const mediaPath2 = MessageMedia.fromFilePath('./grupo.ogg');
const mediaPath3 = MessageMedia.fromFilePath('./grupo.ogg');
const medias = [mediaPath1, mediaPath2, mediaPath3];
function get_random (list) {
return list[Math.floor((Math.random()*list.length))];
}
const mensagemTexto = `@${contact.number}!` + get_random(textos);
const mensagemAudio = get_random(medias);
const chat = await client.getChatById(notification.id.remote);
console.log('Grupo: ' + notification.id.remote + ' - Mensagem: ' + mensagemTexto);
console.log('Grupo: ' + notification.id.remote + ' - Áudio: ' + mensagemAudio);
delay(1000).then(async function() {
try {
chat.sendStateTyping();
} catch(e){
console.log('© Comunidade ZDG')
}
});
delay(5000).then(async function() {
try{
client.sendMessage(notification.id.remote, mensagemTexto, { mentions: [contact] });
chat.clearState();
} catch(e){
console.log('© Comunidade ZDG')
}
});
delay(8000).then(async function() {
try{
chat.sendStateRecording();
} catch(e){
console.log('© Comunidade ZDG')
}
});
delay(13000).then(async function() {
try{
client.sendMessage(notification.id.remote, mensagemAudio, {sendAudioAsVoice: true});
} catch(e){
console.log('© Comunidade ZDG')
}
});
}
});
// INITIALIZE DO SERVIÇO
server.listen(port, function() {
console.log('© Comunidade ZDG - Aplicativo rodando na porta *: ' + port);
});