async function cloudflare(data, page) { return new Promise(async (resolve, reject) => { if (!data.domain) return reject(new Error("Missing domain parameter")) const startTime = Date.now() let isResolved = false let userAgent = null const timeout = setTimeout(() => { if (!isResolved) { isResolved = true const elapsedTime = (Date.now() - startTime) / 1000 resolve({ cf_clearance: null, user_agent: userAgent, elapsed_time: elapsedTime, }) } }, 20000) try { // Jika pakai proxy if (data.proxy?.username && data.proxy?.password) { await page.authenticate({ username: data.proxy.username, password: data.proxy.password, }) } page.removeAllListeners("request") page.removeAllListeners("response") await page.setRequestInterception(true) page.on("request", async (req) => { try { await req.continue() } catch (_) {} }) page.on("response", async (res) => { try { const url = res.url() if (url.includes("/cdn-cgi/challenge-platform/")) { const headers = res.headers() if (headers["set-cookie"]) { const match = headers["set-cookie"].match(/cf_clearance=([^;]+)/) if (match) { const cf_clearance = match[1] const userAgent = (await res.request().headers())["user-agent"] const elapsedTime = (Date.now() - startTime) / 1000 if (!isResolved) { isResolved = true clearTimeout(timeout) resolve({ cf_clearance, user_agent: userAgent, elapsed_time: elapsedTime, }) } } } } } catch (_) {} }) // 🧩 Tambahan: Set cookie manual (khusus Puppeteer) if (data.cookies) { const cookies = [] const domain = new URL(data.domain).hostname if (typeof data.cookies === "string") { // contoh: "captcha=recaptchav2; ci_session=xxx; cf_clearance=xxx" for (const pair of data.cookies.split(";")) { const [name, value] = pair.trim().split("=") if (name && value) cookies.push({ name, value, domain }) } } else if (typeof data.cookies === "object") { for (const [name, value] of Object.entries(data.cookies)) { cookies.push({ name, value, domain }) } } if (cookies.length) { await page.setCookie(...cookies) console.log("✅ Cookies telah diset:", cookies) } } // Akses domain target await page.goto(data.domain, { waitUntil: "domcontentloaded" }) userAgent = await page.evaluate(() => navigator.userAgent) } catch (err) { if (!isResolved) { isResolved = true clearTimeout(timeout) reject(err) } } }) } module.exports = cloudflare