Files
cf-bypass-fast-fork/endpoints/cloudflare.js
estebanthi 24b0ddf666
All checks were successful
CI / release (push) Successful in 1m38s
Add optional full cookie response
2026-02-04 10:01:50 +01:00

119 lines
3.1 KiB
JavaScript

async function ensurePageLoaded(page, url) {
try {
await page.goto(url, { waitUntil: "domcontentloaded", timeout: 10000 })
} catch (_) {}
}
async function getPageHtml(page) {
try {
return await page.content()
} catch (_) {
return null
}
}
async function getPageCookies(page, url) {
try {
return await page.cookies(url)
} catch (_) {
return null
}
}
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
const response = {
cf_clearance: null,
user_agent: userAgent,
elapsed_time: elapsedTime,
}
if (data.include_html) response.html = null
if (data.include_cookies) response.cookies = null
resolve(response)
}
}, 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)
const response = {
cf_clearance,
user_agent: userAgent,
elapsed_time: elapsedTime,
}
if (data.include_html || data.include_cookies) {
await ensurePageLoaded(page, data.domain)
}
if (data.include_html) {
response.html = await getPageHtml(page)
}
if (data.include_cookies) {
response.cookies = await getPageCookies(page, data.domain)
}
resolve(response)
}
}
}
}
} 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