File size: 2,872 Bytes
56b6d1b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
/**
 * INTERSTITIAL
 */
async function interstitial({ domain, proxy }, page) {
    return new Promise(async (resolve, reject) => {
        if (!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;
                resolve({
                    cf_clearance: null,
                    cookies: null,
                    user_agent: userAgent,
                    type: 'interstitial'
                });
            }
        }, 20000);

        try {
            if (proxy?.username && proxy?.password) {
                await page.authenticate({
                    username: proxy.username,
                    password: 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 cookies = headers["set-cookie"];
                            const match = cookies.match(/cf_clearance=([^;]+)/);
                            if (match) {
                                const cf_clearance = match[1];
                                const userAgent = (await res.request().headers())["user-agent"];

                                if (!isResolved) {
                                    isResolved = true;
                                    clearTimeout(cl);
                                    resolve({
                                        cf_clearance,
                                        cookies,          // seluruh cookie string
                                        user_agent: userAgent,
                                        type: 'interstitial'
                                    });
                                }
                            }
                        }
                    }
                } catch (_) {}
            });

            await page.goto(domain, { waitUntil: "domcontentloaded" });
            userAgent = await page.evaluate(() => navigator.userAgent);
        } catch (err) {
            if (!isResolved) {
                isResolved = true;
                clearTimeout(cl);
                reject(err);
            }
        }
    });
}

module.exports = interstitial;