UNPKG

watapi

Version:

API for WhatsApp using Baileys

135 lines (114 loc) 4.1 kB
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, }