File size: 3,117 Bytes
613f200
 
 
 
 
 
 
 
cd32d01
613f200
 
 
 
 
 
 
 
 
 
 
 
cd32d01
613f200
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cd32d01
613f200
 
 
 
 
 
 
 
 
 
 
 
20165ac
cd32d01
20165ac
 
 
cd32d01
20165ac
 
cd32d01
20165ac
 
cd32d01
20165ac
 
 
 
 
 
 
 
cd32d01
 
 
20165ac
613f200
 
 
 
 
cd32d01
613f200
 
 
 
 
 
cd32d01
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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