|
|
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 { |
|
|
|
|
|
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 (_) {} |
|
|
}) |
|
|
|
|
|
|
|
|
if (data.cookies) { |
|
|
const cookies = [] |
|
|
const domain = new URL(data.domain).hostname |
|
|
|
|
|
if (typeof data.cookies === "string") { |
|
|
|
|
|
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) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
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 |