import { default as makeWASocket, DisconnectReason, useMultiFileAuthState, makeInMemoryStore } from '@whiskeysockets/baileys'; import express from 'express'; import qrcode from 'qrcode-terminal'; import pino from 'pino'; const app = express(); app.use(express.json()); let sock = null; let qrCode = null; let isConnected = false; const logger = pino({ level: 'silent' }); // Initialize WhatsApp connection async function connectToWhatsApp() { const { state, saveCreds } = await useMultiFileAuthState('auth_info'); sock = makeWASocket({ auth: state, printQRInTerminal: true, logger, }); sock.ev.on('creds.update', saveCreds); sock.ev.on('connection.update', (update) => { const { connection, lastDisconnect, qr } = update; if (qr) { qrCode = qr; console.log('QR Code received, scan it!'); qrcode.generate(qr, { small: true }); } if (connection === 'close') { const shouldReconnect = lastDisconnect?.error?.output?.statusCode !== DisconnectReason.loggedOut; console.log('Connection closed. Reconnecting:', shouldReconnect); isConnected = false; if (shouldReconnect) { connectToWhatsApp(); } } else if (connection === 'open') { console.log('✅ WhatsApp connected successfully!'); isConnected = true; qrCode = null; } }); sock.ev.on('messages.upsert', async (m) => { const msg = m.messages[0]; if (!msg.key.fromMe && m.type === 'notify') { console.log('New message:', msg.message?.conversation || 'Media message'); } }); } // Routes app.get('/', (req, res) => { res.json({ status: 'running', connected: isConnected, endpoints: { status: 'GET /status', qr: 'GET /qr', send: 'POST /send', logout: 'POST /logout' } }); }); app.get('/status', (req, res) => { res.json({ connected: isConnected, hasQR: qrCode !== null }); }); app.get('/qr', (req, res) => { if (qrCode) { res.json({ success: true, qr: qrCode, message: 'Scan this QR code with WhatsApp' }); } else if (isConnected) { res.json({ success: false, message: 'Already connected to WhatsApp' }); } else { res.json({ success: false, message: 'QR code not available yet, please wait...' }); } }); app.post('/send', async (req, res) => { if (!isConnected || !sock) { return res.status(400).json({ success: false, message: 'WhatsApp not connected' }); } const { number, message } = req.body; if (!number || !message) { return res.status(400).json({ success: false, message: 'number and message are required' }); } try { // Format number (add @s.whatsapp.net if not present) const jid = number.includes('@') ? number : `${number}@s.whatsapp.net`; await sock.sendMessage(jid, { text: message }); res.json({ success: true, message: 'Message sent successfully' }); } catch (error) { res.status(500).json({ success: false, message: error.message }); } }); app.post('/logout', async (req, res) => { if (sock) { await sock.logout(); isConnected = false; qrCode = null; res.json({ success: true, message: 'Logged out successfully' }); } else { res.json({ success: false, message: 'Not connected' }); } }); // Start server const PORT = process.env.PORT || 7860; app.listen(PORT, '0.0.0.0', () => { console.log(`🚀 Baileys WhatsApp Server running on port ${PORT}`); connectToWhatsApp(); });