/** * Target: WhatsApp Web Dashboard & Auto-Invite Bot (Express + Baileys) * Runtime: Node.js */ const { default: makeWASocket, useMultiFileAuthState, DisconnectReason } = require('@whiskeysockets/baileys'); const pino = require('pino'); const express = require('express'); const fs = require('fs'); const app = express(); const PORT = process.env.PORT || 3000; app.use(express.urlencoded({ extended: true })); app.use(express.json()); // File penyimpanan data lokal const DATA_FILE = './data.json'; // Inisialisasi data.json jika belum ada if (!fs.existsSync(DATA_FILE)) { fs.writeFileSync(DATA_FILE, JSON.stringify({ targetNumber: "6281234567890", groupIds: "120363011111111111@g.us\n120363022222222222@g.us" }, null, 2)); } const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms)); let sock; let connectionStatus = 'DISCONNECTED'; let botLogs = []; function addLog(text) { const timestamp = new Date().toLocaleTimeString(); const logMessage = `[${timestamp}] ${text}`; console.log(logMessage); botLogs.unshift(logMessage); if (botLogs.length > 50) botLogs.pop(); // Batasi 50 log terakhir } // Inisialisasi Baileys WhatsApp Bot async function startBot() { const { state, saveCreds } = await useMultiFileAuthState('auth_info'); sock = makeWASocket({ auth: state, logger: pino({ level: 'silent' }), printQRInTerminal: true }); sock.ev.on('connection.update', (update) => { const { connection, lastDisconnect, qr } = update; if (qr) { connectionStatus = 'WAITING_QR (Cek Terminal untuk Scan)'; } if (connection === 'close') { connectionStatus = 'DISCONNECTED'; const shouldReconnect = lastDisconnect?.error?.output?.statusCode !== DisconnectReason.loggedOut; addLog('Koneksi terputus. Mencoba menyambungkan kembali...'); if (shouldReconnect) { startBot(); } } else if (connection === 'open') { connectionStatus = 'CONNECTED (Terhubung)'; addLog('WhatsApp berhasil terhubung!'); } }); sock.ev.on('creds.update', saveCreds); // Fitur Cek ID Grup via pesan "id" sock.ev.on('messages.upsert', async ({ messages, type }) => { if (type !== 'notify') return; const msg = messages[0]; if (!msg.message || msg.key.fromMe) return; const remoteJid = msg.key.remoteJid; const messageText = msg.message.conversation || msg.message.extendedTextMessage?.text || ''; if (remoteJid.endsWith('@g.us') && messageText.trim().toLowerCase() === 'id') { addLog(`Perintah 'id' diterima di grup: ${remoteJid}`); try { await sock.sendMessage(remoteJid, { text: `ID Grup ini adalah:\n\`\`\`${remoteJid}\`\`\`` }, { quoted: msg }); } catch (error) { addLog(`Gagal kirim ID grup: ${error.message}`); } } }); } // Fungsi Eksekusi Auto-Invite async function runAutoInvite() { if (!sock || connectionStatus !== 'CONNECTED (Terhubung)') { addLog('Gagal invite: Bot WhatsApp belum terhubung/aktif.'); return { success: false, message: 'Bot belum terhubung!' }; } try { const rawData = fs.readFileSync(DATA_FILE, 'utf8'); const data = JSON.parse(rawData); const targetNumber = data.targetNumber; const groupIds = data.groupIds.split('\n').map(g => g.trim()).filter(g => g.length > 0); if (!targetNumber || groupIds.length === 0) { addLog('Data target atau grup kosong.'); return { success: false, message: 'Target atau grup kosong!' }; } const participantJid = `${targetNumber}@s.whatsapp.net`; addLog(`Memulai proses invite nomor ${targetNumber} ke ${groupIds.length} grup...`); // Jalankan proses invite secara asynchronous di background (async () => { for (let i = 0; i < groupIds.length; i++) { const groupId = groupIds[i]; try { addLog(`[${i + 1}/${groupIds.length}] Mengundang ke: ${groupId}`); const resAdd = await sock.groupParticipantsUpdate(groupId, [participantJid], 'add'); addLog(`Sukses invite ke ${groupId}: ${JSON.stringify(resAdd)}`); const delayTime = Math.floor(Math.random() * 4000) + 6000; await sleep(delayTime); } catch (err) { addLog(`Gagal invite ke ${groupId}: ${err?.message || err}`); } } addLog('Semua proses invite massal selesai.'); })(); return { success: true, message: 'Proses invite sedang berjalan di background!' }; } catch (err) { return { success: false, message: err.message }; } } // --- ROUTE WEB DASHBOARD --- app.get('/', (req, res) => { const rawData = fs.readFileSync(DATA_FILE, 'utf8'); const data = JSON.parse(rawData); const html = ` Panel Auto-Invite WhatsApp

Panel Kontrol Auto-Invite WhatsApp

Status Bot: ${connectionStatus}
${botLogs.join('
')}
`; res.send(html); }); // Simpan Data Form app.post('/save', (req, res) => { const { target_number, group_ids } = req.body; fs.writeFileSync(DATA_FILE, JSON.stringify({ targetNumber: target_number.trim(), groupIds: group_ids.trim() }, null, 2)); res.redirect('/'); }); // Endpoint Tombol Web untuk Eksekusi Invite app.post('/start-invite', async (req, res) => { const result = await runAutoInvite(); res.json(result); }); // Endpoint untuk Refresh Log di Frontend app.get('/logs', (req, res) => { res.json({ logs: botLogs }); }); app.listen(PORT, () => { console.log(`Server web & bot berjalan di http://localhost:${PORT}`); startBot(); });