| 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 cl = 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(cl) |
|
|
| resolve({ |
| cf_clearance, |
| user_agent: userAgent, |
| elapsed_time: elapsedTime, |
| }) |
| } |
| } |
| } |
| } |
| } catch (_) {} |
| }) |
|
|
| await page.goto(data.domain, { waitUntil: "domcontentloaded" }) |
| userAgent = await page.evaluate(() => navigator.userAgent) |
| } catch (err) { |
| if (!isResolved) { |
| isResolved = true |
| clearTimeout(cl) |
| reject(err) |
| } |
| } |
| }) |
| } |
|
|
| module.exports = cloudflare |
|
|