watapi
Version:
API for WhatsApp using Baileys
135 lines (114 loc) • 4.1 kB
JavaScript
const { default: makeWASocket, DisconnectReason, useMultiFileAuthState, fetchLatestBaileysVersion } = require('@whiskeysockets/baileys');
const QRCode = require('qrcode');
const connec = require('../connection/connection');
let sock;
const connectToWhatsAppQrCode = async (name) => {
const { version, isLatest } = await fetchLatestBaileysVersion();
console.log(`Usando versão do WhatsApp Web: ${version}, atual? ${isLatest}`);
const { state, saveCreds } = await useMultiFileAuthState(`./auth/${name}`);
sock = makeWASocket({
// pode fornecer configuração adicional aqui
version,
auth: state,
});
sock.ev.on('connection.update', async (update) => {
const { connection, lastDisconnect, qr } = update
if (qr) {
/* // Exibe o QR Code no terminal
console.log(await QRCode.toString(qr, { type: 'terminal', small: true })); */
const qrCodeDataUrl = await QRCode.toDataURL(qr);
const expires = new Date(Date.now() + 5 * 60 * 1000); // QR Code expira em 5 minutos
// Aqui você pode salvar o QR Code no banco de dados ou enviar para o frontend
const instance = await connec('instances')
.where({ name: name })
.first();
if (instance) {
await connec('instances')
.where({ name: name })
.update({
status: 'QrCode',
qrcode: qrCodeDataUrl,
qr_expires_at: expires,
updated_at: connec.fn.now(),
});
} else {
await connec('instances')
.insert({
name: name,
status: 'QrCode',
qrcode: qrCodeDataUrl,
qr_expires_at: expires,
});
}
}
if (connection === 'open') {
const wId = sock.user.id.split(':')[0];
await connec('instances')
.where({ name: name })
.update({
status: 'connected',
phone: wId,
qrcode: null,
qr_expires_at: null,
updated_at: connec.fn.now()
});
console.log('✅ Conectado com sucesso:', wId);
}
if (connection === 'close') {
const statusCode = lastDisconnect?.error?.output?.statusCode;
const shouldReconnect = statusCode !== DisconnectReason.loggedOut;
console.log('🔌 Conexão encerrada, por:', statusCode);
if (statusCode === DisconnectReason.loggedOut) {
const fs = require('fs');
const path = require('path');
const authPath = path.join(__dirname, '..', '..', 'auth', name);
console.log(`🗑️ Tentando remover pasta de autenticação: ${authPath}`);
try {
if (fs.existsSync(authPath)) {
fs.rmSync(authPath, { recursive: true, force: true });
console.log(`🧹 Pasta de autenticação removida: ${authPath}`);
} else {
console.log(`ℹ️ Pasta de autenticação já não existia: ${authPath}`);
}
} catch (err) {
console.error(`❌ Erro ao remover a pasta de autenticação: ${authPath}`, err);
}
}
if (shouldReconnect) {
connectToWhatsAppQrCode(name); // tenta reconectar automaticamente
} else {
await connec('instances')
.where({ name: name })
.update({
status: 'disconnected',
updated_at: connec.fn.now()
});
}
}
});
sock.ev.on('creds.update', saveCreds)
return { message: 'Sessão iniciada com sucesso!' }
}
const getStatus = async (name) => {
const instance = await connec('instances')
.where({ name: name })
.first();
return {
status: instance?.status || 'disconnected',
phone: instance?.phone || null,
qrcode: instance?.qrcode || null,
qr_expires_at: instance?.qr_expires_at || null,
}
};
const sendMessage = async (to, message) => {
if (!sock) throw new Error('Sessão não iniciada');
await sock.sendMessage(`${to}@s.whatsapp.net`, { text: message });
return {
message: 'Mensagem enviada com sucesso',
}
};
module.exports = {
connectToWhatsAppQrCode,
getStatus,
sendMessage,
}