XORE21 commited on
Commit
08b3eb8
·
verified ·
1 Parent(s): 44803e0

Update index.js

Browse files
Files changed (1) hide show
  1. index.js +101 -131
index.js CHANGED
@@ -43,182 +43,152 @@ async function createBrowser(proxy = null) {
43
  return { browser, page };
44
  }
45
 
46
- // FUNGSI BARU: VALIDASI INTERNAL
47
- // Mengecek apakah cookie yang didapat benar-benar bisa menembus server
48
- async function verifySession(page, url) {
49
- return await page.evaluate(async (targetUrl) => {
50
- try {
51
- // Lakukan request GET ringan ke URL target
52
- const res = await fetch(targetUrl, {
53
- method: "GET",
54
- credentials: "include" // Sertakan cookie yang ada di browser
55
- });
56
- return {
57
- status: res.status,
58
- url: res.url,
59
- // Cek apakah masih dialihkan ke halaman challenge
60
- is_challenge: res.url.includes("challenge") || res.status === 403 || res.status === 503
61
- };
62
- } catch (e) {
63
- return { status: 0, is_challenge: true, error: e.message };
64
- }
65
- }, url);
66
- }
67
-
68
  async function handleCloudflare(page, url) {
69
  return new Promise(async (resolve, reject) => {
70
  // Timeout 120 Detik
71
  const timeout = setTimeout(() => reject(new Error("Timeout Cloudflare Bypass")), 120000);
72
 
 
 
 
 
73
  try {
74
  console.log(`[Cloudflare] Navigating to ${url}`);
75
-
76
- let cookieFoundTime = 0;
77
- let finalCookieValue = "";
78
- let hasForcedNavigated = false;
79
 
80
- // 1. LISTENER (Sniffer Cookie)
81
- page.on('response', async resp => {
82
  try {
83
  const headers = resp.headers();
84
- const setCookie = headers['set-cookie'] || headers['Set-Cookie'] || headers['set-cookie'.toLowerCase()];
85
- if (setCookie) {
86
- const cookieStr = Array.isArray(setCookie) ? setCookie.join(' ') : setCookie;
87
- if (cookieStr.includes('cf_clearance')) {
88
- if (cookieFoundTime === 0) {
89
- cookieFoundTime = Date.now();
90
- console.log(`[Cloudflare] 🔥 FAST DETECT: cf_clearance found via Listener!`);
91
- const match = cookieStr.match(/cf_clearance=([^;]+)/);
92
- if (match) finalCookieValue = match[1];
93
- }
 
94
  }
95
  }
96
- } catch(e){}
97
  });
98
 
99
  await page.bringToFront();
100
  await page.goto(url, { waitUntil: "domcontentloaded", timeout: 60000 });
101
 
102
- // LOOP CHECKER
103
  const loop = setInterval(async () => {
104
  try {
105
- const title = await page.title();
106
- const content = await page.content();
107
- const currentTime = Date.now();
108
  const cookies = await page.cookies();
 
109
 
110
- // Update Status Cookie
111
- const cfCookie = cookies.find(c => c.name === 'cf_clearance');
112
- if (cfCookie) {
113
- if (cookieFoundTime === 0) console.log(`[Cloudflare] Cookie found in storage.`);
114
- cookieFoundTime = cookieFoundTime || Date.now();
115
- finalCookieValue = cfCookie.value;
116
  }
117
 
118
- // ==========================================
119
- // LOGIKA SUKSES BARU (VALIDASI REQUEST)
120
- // ==========================================
121
-
122
- // Jika kita punya cookie, coba validasi langsung ke server (Bypass Title Check)
123
- if (finalCookieValue) {
124
- const verification = await verifySession(page, url);
125
 
126
- // Jika server merespon 200 OK dan bukan challenge url
127
- if (verification.status === 200 && !verification.is_challenge) {
128
- clearInterval(loop);
129
- clearTimeout(timeout);
130
-
131
- const ua = await page.evaluate(() => navigator.userAgent);
132
- console.log(`[Cloudflare] ✅ VERIFIED SUCCESS! (Internal Fetch: 200 OK)`);
133
- console.log(`[Cloudflare] Title might be stuck, but access is confirmed.`);
134
-
135
- resolve({
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136
  status: "success",
137
- verified: true, // Flag baru
138
- userAgent: ua,
139
  cookies_full: cookies,
140
- cookie: finalCookieValue,
141
- title: title, // Title mungkin masih "Attention Required", tapi itu tidak masalah
142
- html_preview: "Content verified via internal fetch"
143
  });
144
  return;
145
  }
146
  }
147
 
148
- // Fallback: Cek Title (Cara Lama)
149
- const isChallengePage = title.includes("Just a moment") ||
150
- content.includes("challenge-platform") ||
151
- title.includes("Cloudflare") ||
152
- title.includes("Attention Required");
153
-
154
- if (!isChallengePage && title.trim().length > 0) {
155
- clearInterval(loop);
156
- clearTimeout(timeout);
157
- const ua = await page.evaluate(() => navigator.userAgent);
158
- console.log(`[Cloudflare] Success! Page Title: ${title}`);
159
- resolve({
160
- status: "success",
161
- verified: true,
162
- userAgent: ua,
163
- cookies_full: cookies,
164
- cookie: finalCookieValue,
165
- title: title
166
- });
167
- return;
168
- }
169
-
170
- // 3. FORCE NAVIGATION (Anti-Loop)
171
- if (cookieFoundTime > 0 && (currentTime - cookieFoundTime) > 8000 && !hasForcedNavigated) {
172
- console.log("[Cloudflare] Cookie found but stuck. Performing FORCE NAVIGATION...");
173
- hasForcedNavigated = true;
174
- await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30000, referer: url }).catch(()=>{});
175
- return;
176
- }
177
-
178
- // Timeout Giving Up
179
- if (hasForcedNavigated && (currentTime - cookieFoundTime) > 30000) {
180
- clearInterval(loop);
181
- clearTimeout(timeout);
182
- console.log("[Cloudflare] Giving up wait. Returning what we have.");
183
- const ua = await page.evaluate(() => navigator.userAgent);
184
- resolve({
185
- status: "success", // Tetap return success karena cookie ada
186
- verified: false,
187
- userAgent: ua,
188
- cookies_full: cookies,
189
- cookie: finalCookieValue,
190
- title: title
191
- });
192
- return;
193
- }
194
-
195
- // 4. BIOMETRIC CLICKER (Tetap dipertahankan untuk Satoshi)
196
- const frames = page.frames();
197
- const challengeFrame = frames.find(f => f.url().includes("challenges.cloudflare.com") || f.url().includes("turnstile"));
198
-
199
- if (challengeFrame) {
200
- try {
201
  const checkbox = await challengeFrame.$("input[type='checkbox']");
202
  if (checkbox) {
203
  const box = await checkbox.boundingBox();
204
  if (box) {
 
205
  const x = box.x + box.width / 2 + (Math.random() - 0.5) * 5;
206
  const y = box.y + box.height / 2 + (Math.random() - 0.5) * 5;
207
- await page.mouse.move(x, y, { steps: 5 });
208
  await page.mouse.down();
209
- await page.waitForTimeout(50 + Math.random() * 50);
210
  await page.mouse.up();
211
  }
212
  } else {
 
213
  await challengeFrame.click('body').catch(()=>{});
214
  }
215
- } catch(e) {}
216
- } else {
217
- try { await page.mouse.move(Math.random()*500, Math.random()*500); } catch (err) {}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
218
  }
219
 
220
  } catch (e) {}
221
- }, 1000);
222
 
223
  } catch (e) {
224
  clearTimeout(timeout);
@@ -227,7 +197,7 @@ async function handleCloudflare(page, url) {
227
  });
228
  }
229
 
230
- // ... handleTurnstile TETAP SAMA ...
231
  async function handleTurnstile(page, url, siteKey) {
232
  return new Promise(async (resolve, reject) => {
233
  const timeout = setTimeout(() => reject(new Error("Timeout Turnstile")), 60000);
 
43
  return { browser, page };
44
  }
45
 
46
+ // HANDLER CLOUDFLARE FINAL (HAR-PROVEN FIX)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  async function handleCloudflare(page, url) {
48
  return new Promise(async (resolve, reject) => {
49
  // Timeout 120 Detik
50
  const timeout = setTimeout(() => reject(new Error("Timeout Cloudflare Bypass")), 120000);
51
 
52
+ let cfValue = "";
53
+ let clearanceTime = 0;
54
+ let usedForRequest = false;
55
+
56
  try {
57
  console.log(`[Cloudflare] Navigating to ${url}`);
 
 
 
 
58
 
59
+ // === 1. RESPONSE SNIFFER (Menangkap Cookie dari Network) ===
60
+ page.on("response", async (resp) => {
61
  try {
62
  const headers = resp.headers();
63
+ const setCookie = headers["set-cookie"] || headers["Set-Cookie"];
64
+ if (!setCookie) return;
65
+
66
+ const raw = Array.isArray(setCookie) ? setCookie.join(" ") : setCookie;
67
+
68
+ if (raw.toLowerCase().includes("cf_clearance")) {
69
+ const m = raw.match(/cf_clearance=([^;]+)/);
70
+ if (m && !cfValue) {
71
+ cfValue = m[1];
72
+ clearanceTime = Date.now();
73
+ console.log("[CF] 🔥 cf_clearance captured via Network Listener!");
74
  }
75
  }
76
+ } catch {}
77
  });
78
 
79
  await page.bringToFront();
80
  await page.goto(url, { waitUntil: "domcontentloaded", timeout: 60000 });
81
 
82
+ // === 2. LOOP VERIFIER ===
83
  const loop = setInterval(async () => {
84
  try {
 
 
 
85
  const cookies = await page.cookies();
86
+ const cf = cookies.find(c => c.name === "cf_clearance");
87
 
88
+ // Backup: Cek storage browser jika listener terlewat
89
+ if (cf && !cfValue) {
90
+ cfValue = cf.value;
91
+ clearanceTime = Date.now();
92
+ console.log("[CF] cf_clearance found in Storage.");
 
93
  }
94
 
95
+ // === 3. THE FIX: PAKSA RELOAD DENGAN COOKIE ===
96
+ // Inilah yang hilang sebelumnya. Begitu cookie dapat, kita request ulang main page.
97
+ if (cfValue && !usedForRequest) {
98
+ usedForRequest = true;
99
+ const timeSinceCookie = Date.now() - clearanceTime;
 
 
100
 
101
+ // Beri jeda sedikit (2 detik) agar cookie tersimpan benar
102
+ if (timeSinceCookie > 2000) {
103
+ console.log("[CF] 🔄 Cookie detected. Forcing re-request to main document...");
104
+ await page.goto(url, {
105
+ waitUntil: "domcontentloaded", // Pakai domcontentloaded biar lebih cepat dari networkidle
106
+ timeout: 60000
107
+ }).catch(()=>{});
108
+ }
109
+ return;
110
+ }
111
+
112
+ // === 4. VALIDASI SUKSES (INTERNAL FETCH) ===
113
+ // Kita tidak percaya Title. Kita percaya respons HTTP 200.
114
+ if (usedForRequest) {
115
+ const check = await page.evaluate(async (targetUrl) => {
116
+ try {
117
+ const r = await fetch(targetUrl, { method: "GET", credentials: "include" });
118
+ return { status: r.status, url: r.url };
119
+ } catch { return { status: 0, url: "" }; }
120
+ }, url);
121
+
122
+ const isChallenge = check.url.includes("challenge") || check.url.includes("turnstile");
123
+
124
+ if (check.status === 200 && !isChallenge) {
125
+ clearInterval(loop);
126
+ clearTimeout(timeout);
127
+
128
+ const ua = await page.evaluate(() => navigator.userAgent);
129
+ const finalTitle = await page.title();
130
+
131
+ console.log(`[CF] ✅ CLEAN PASS! Server responded 200 OK.`);
132
+
133
+ resolve({
134
  status: "success",
135
+ verified: true, // Tanda sukses mutlak
136
+ cookie: cfValue,
137
  cookies_full: cookies,
138
+ userAgent: ua,
139
+ title: finalTitle
 
140
  });
141
  return;
142
  }
143
  }
144
 
145
+ // === 5. CLICKER (Tetap Simpan untuk IP Kotor/Satoshi) ===
146
+ // Kadang cookie belum keluar kalau belum diklik
147
+ if (!cfValue) {
148
+ const frames = page.frames();
149
+ const challengeFrame = frames.find(f => f.url().includes("challenges.cloudflare.com") || f.url().includes("turnstile"));
150
+ if (challengeFrame) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151
  const checkbox = await challengeFrame.$("input[type='checkbox']");
152
  if (checkbox) {
153
  const box = await checkbox.boundingBox();
154
  if (box) {
155
+ // Klik Fisik
156
  const x = box.x + box.width / 2 + (Math.random() - 0.5) * 5;
157
  const y = box.y + box.height / 2 + (Math.random() - 0.5) * 5;
158
+ await page.mouse.move(x, y);
159
  await page.mouse.down();
160
+ await page.waitForTimeout(50);
161
  await page.mouse.up();
162
  }
163
  } else {
164
+ // Klik Body Frame (Fallback)
165
  await challengeFrame.click('body').catch(()=>{});
166
  }
167
+ } else {
168
+ // Gerakan mouse random
169
+ try { await page.mouse.move(Math.random()*500, Math.random()*500); } catch(e){}
170
+ }
171
+ }
172
+
173
+ // === 6. FAILSAFE (Jika stuck lama banget tapi cookie ada) ===
174
+ if (cfValue && Date.now() - clearanceTime > 30000) {
175
+ clearInterval(loop);
176
+ clearTimeout(timeout);
177
+ console.log("[CF] ⚠️ Validation timeout, but cookie is present. Returning anyway.");
178
+
179
+ const ua = await page.evaluate(() => navigator.userAgent);
180
+ resolve({
181
+ status: "success",
182
+ verified: false, // Cookie ada, tapi halaman mungkin masih stuck
183
+ cookie: cfValue,
184
+ cookies_full: cookies,
185
+ userAgent: ua,
186
+ title: await page.title()
187
+ });
188
  }
189
 
190
  } catch (e) {}
191
+ }, 1000);
192
 
193
  } catch (e) {
194
  clearTimeout(timeout);
 
197
  });
198
  }
199
 
200
+ // ... Handle Turnstile Manual & Server Setup TETAP SAMA ...
201
  async function handleTurnstile(page, url, siteKey) {
202
  return new Promise(async (resolve, reject) => {
203
  const timeout = setTimeout(() => reject(new Error("Timeout Turnstile")), 60000);