Spaces:
Sleeping
Sleeping
| 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(); | |
| }); |