const puppeteer = require('puppeteer-extra'); const StealthPlugin = require('puppeteer-extra-plugin-stealth'); const admin = require('firebase-admin'); // Gunakan Stealth agar tidak terdeteksi bot oleh Google/Aplikasi puppeteer.use(StealthPlugin()); // --- SETUP FIREBASE --- // Pastikan kamu sudah download serviceAccountKey.json dari Firebase Console const serviceAccount = require("./serviceAccountKey.json"); admin.initializeApp({ credential: admin.credential.cert(serviceAccount) }); const db = admin.firestore(); // --- LOGIKA UTAMA BOT --- async function jalankanReferral(referralLink, proxy) { const browser = await puppeteer.launch({ headless: "new", args: [ '--no-sandbox', '--disable-setuid-sandbox', `--proxy-server=${proxy}` // Menggunakan IP Proxy agar tidak kena ban ], // Path khusus untuk server Render (Linux) executablePath: process.env.PUPPETEER_EXECUTABLE_PATH || null, }); const page = await browser.newPage(); try { console.log(`Membuka link: ${referralLink}`); await page.goto(referralLink, { waitUntil: 'networkidle2' }); // Contoh: Klik tombol daftar (Ganti selector sesuai aplikasi target) // await page.click('#btn-daftar-google'); console.log("Berhasil memproses satu antrean!"); } catch (err) { console.error("Gagal:", err.message); } finally { await browser.close(); } } // Pantau Firestore secara real-time db.collection('referral_tasks').where('status', '==', 'pending') .onSnapshot(snapshot => { snapshot.forEach(doc => { const data = doc.data(); console.log(`Ada tugas baru untuk link: ${data.url}`); // Jalankan bot jalankanReferral(data.url, data.proxy); // Update status agar tidak dikerjakan berulang kali doc.ref.update({ status: 'processing' }); }); }); console.log("Bot LinzZ sedang memantau antrean Firestore...");