From 1150c21ebe60058f3662cd090bfa8b175006e9e9 Mon Sep 17 00:00:00 2001 From: Tanjiro Date: Tue, 23 Sep 2025 15:52:41 +0530 Subject: [PATCH] Add files via upload --- cache/cache.json | 10 +++++ endpoints/cloudflare.js | 79 ++++++++++++++++++++++++++++++++++++++ endpoints/turnstile.js | 84 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 173 insertions(+) create mode 100644 cache/cache.json create mode 100644 endpoints/cloudflare.js create mode 100644 endpoints/turnstile.js diff --git a/cache/cache.json b/cache/cache.json new file mode 100644 index 0000000..c7b13cd --- /dev/null +++ b/cache/cache.json @@ -0,0 +1,10 @@ +{ + "{\"domain\":\"https://v2links.org\",\"mode\":\"iuam\"}": { + "timestamp": 1758616160392, + "value": { + "cf_clearance": "qqs5f4MpFMgA0v78Qmh_HYDWoKhbwqlQ57bTW5KeIr8-1758616161-1.2.1.1-D5PdpmheHl.26ssIRKQBsXzPtPPkSXntEZ_H9FUJVt7MMTS_BEE8iH.E48MDzKtFBLwZqRYxE_1GLo1gj3ChXrwatOGEJcmGRUwavy2qvGgUPizn7qufd.sW0ULfhaRO7Gz_H_eO1TU3iEqCzltEUDNk0SviKRFkF8ozbvJ91MW_qmO.qrjQorbu_jxcgJv5BHs6rTNOitWtVDAmYMDukASq0viHXIUAIvTM.LIfQ88", + "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36", + "elapsed_time": 5.028 + } + } +} \ No newline at end of file diff --git a/endpoints/cloudflare.js b/endpoints/cloudflare.js new file mode 100644 index 0000000..9257ee1 --- /dev/null +++ b/endpoints/cloudflare.js @@ -0,0 +1,79 @@ +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 diff --git a/endpoints/turnstile.js b/endpoints/turnstile.js new file mode 100644 index 0000000..8be7c96 --- /dev/null +++ b/endpoints/turnstile.js @@ -0,0 +1,84 @@ +async function turnstile({ domain, proxy, siteKey }, page) { + if (!domain) throw new Error("Missing domain parameter"); + if (!siteKey) throw new Error("Missing siteKey parameter"); + + const timeout = global.timeOut || 60000; + let isResolved = false; + + const cl = setTimeout(async () => { + if (!isResolved) { + throw new Error("Timeout Error"); + } + }, timeout); + + try { + if (proxy?.username && proxy?.password) { + await page.authenticate({ + username: proxy.username, + password: proxy.password, + }); + } + + const htmlContent = ` + + + +
+ + + + + `; + + await page.setRequestInterception(true); + page.removeAllListeners("request"); + page.on("request", async (request) => { + if ([domain, domain + "/"].includes(request.url()) && request.resourceType() === "document") { + await request.respond({ + status: 200, + contentType: "text/html", + body: htmlContent, + }); + } else { + await request.continue(); + } + }); + + await page.goto(domain, { waitUntil: "domcontentloaded" }); + + await page.waitForSelector('[name="cf-response"]', { timeout }); + + const token = await page.evaluate(() => { + try { + return document.querySelector('[name="cf-response"]').value; + } catch { + return null; + } + }); + + isResolved = true; + clearTimeout(cl); + + if (!token || token.length < 10) throw new Error("Failed to get token"); + return token; + + } catch (e) { + clearTimeout(cl); + throw e; + } +} + +module.exports = turnstile;