Waha / server.js
NitinBot001's picture
Create server.js
1d1373f verified
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();
});