File size: 2,213 Bytes
3828040
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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