- đ Anti pirata: deletar mensagem hacker
- đ Remover links nĂŁo autorizados
- đ Listar grupos e capturar todos que entram usando banco de dados
- đ Mensagem de saudação e menção de usuĂĄrio
- đ Controle de grupos em massa com comandos via webhook (post)
- đŁïž Controle de grupos em massa com comandos via chat
- INSTALAR NODE E GIT
- INSTALAR A API
a. criar pasta
b. criar arquivos
c. npm install
d. iniciar a api
e. ler o qrcode
index.html
WPP API by Pedrinho da NASA
package.json
{"name":"bot-zdg","version":"1.0.0","description":"bot-zdg: based on Whatsapp API","main":"app.js","scripts":{"start":"node .\botzdg_typebot_stop.js","start:dev":"nodemon app.js","test":"echo \"Error: no test specified\" && exit 1"},"keywords":["whatsapp-api","node.js"],"author":"Pedro","license":"MIT","dependencies":{"axios":"^1.5.0","express":"^4.17.1","express-fileupload":"^1.2.0","express-validator":"^6.9.2","http":"0.0.1-security","mysql2":"^3.6.3","qrcode":"^1.4.4","qrcode-terminal":"^0.12.0","socket.io":"2.3.0","whatsapp-web.js":"^1.23.0"},"devDependencies":{"nodemon":"^2.0.19"}}
botzdg_grupos_maratona_aula3.js
// 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);
// INTEGRAĂĂO MYSQL
const mysql = require('mysql2/promise');
function delay(t, v) {
return new Promise(function(resolve) {
setTimeout(resolve.bind(null, v), t)
});
}
const createConnection = async () => {
return await mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'maratona'
});
}
const getUser = async (msgfom) => {
const connection = await createConnection();
const [rows] = await connection.execute('SELECT contato FROM contatos WHERE contato = ?', [msgfom]);
delay(1000).then(async function() {
await connection.end();
delay(500).then(async function() {
connection.destroy();
});
});
if (rows.length > 0) return true;
return false;
}
const setUser = async (msgfom, nome) => {
const connection = await createConnection();
const [rows] = await connection.execute('INSERT INTO `contatos` (`id`, `contato`, `nome`) VALUES (NULL, ?, ?)', [msgfom, nome]);
delay(1000).then(async function() {
await connection.end();
delay(500).then(async function() {
connection.destroy();
});
});
if (rows.length > 0) return rows[0].contato;
return false;
}
// 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 NOVO USUĂRIO EM GRUPO
client.on('group_join', async (notification) => {
// LISTAR GRUPOS
const groups = await client.getChats()
console.log('-----------------------------\nBOT-ZDG Grupos atualizados:\n-----------------------------')
try{
for (const group of groups){
if(group.id.server.includes('g.us')){
console.log('Nome: ' + group.name + ' - ID: ' + group.id._serialized.replace(/\D/g,''))
}
}
} catch (e){
console.log('© Comunidade ZDG')
}
// GRAVAR USUĂRIOS DO GRUPOS
try{
const contact = await client.getContactById(notification.id.participant)
const nomeContato = (contact.pushname === undefined) ? contact.verifiedName : contact.pushname;
const user = notification.id.participant.replace(/\D/g, '');
const getUserFrom = await getUser(user);
if (getUserFrom === false) {
await setUser(user, nomeContato);
console.log('UsuĂĄrio armazenado: ' + user + ' - ' + nomeContato)
}
if (getUserFrom !== false) {
console.log('UsuĂĄrio jĂĄ foi armazenado')
}
}
catch(e){
console.log('NĂŁo foi possĂvel armazenar o usuĂĄrio' + e)
}
});
// INITIALIZE DO SERVIĂO
server.listen(port, function() {
console.log('© Comunidade ZDG - Aplicativo rodando na porta *: ' + port);
});