| async function cloudflareCookies(page, originalCookiesString, cl, opts = {}) { |
| const timeout = typeof opts.timeout === 'number' ? opts.timeout : 60000; |
| const start = Date.now(); |
| let newClearanceCookie = null; |
|
|
| try { |
| const wait = ms => new Promise(res => setTimeout(res, ms)); |
|
|
| while (Date.now() - start < timeout) { |
| const content = await page.content().catch(() => ""); |
| const lower = content.toLowerCase(); |
|
|
| if (lower.includes('just a moment') || lower.includes('turnstile')) { |
| await page.waitForLoadState('networkidle', { timeout: 30000 }).catch(() => {}); |
| await wait(1000); |
| continue; |
| } |
|
|
| const cookies = await page.context().cookies().catch(() => []); |
| newClearanceCookie = cookies.find(c => c.name === 'cf_clearance'); |
| if (newClearanceCookie) break; |
|
|
| await wait(1000); |
| } |
|
|
| clearTimeout(cl); |
|
|
| const finalCookies = await page.context().cookies().catch(() => []); |
| const finalUrl = page.url(); |
| const userAgent = await page.evaluate(() => navigator.userAgent); |
|
|
| newClearanceCookie = newClearanceCookie || finalCookies.find(c => c.name === 'cf_clearance'); |
| if (!newClearanceCookie) throw new Error('Gagal mendapatkan cf_clearance (Turnstile belum selesai)'); |
|
|
| let updatedCookieString = (originalCookiesString || '').trim(); |
| if (updatedCookieString && !updatedCookieString.endsWith(';')) updatedCookieString += ';'; |
|
|
| if (/cf_clearance=[^;]+/.test(updatedCookieString)) { |
| updatedCookieString = updatedCookieString.replace(/cf_clearance=[^;]+/, `cf_clearance=${newClearanceCookie.value}`); |
| } else { |
| updatedCookieString += ` cf_clearance=${newClearanceCookie.value};`; |
| } |
|
|
| return { |
| success: true, |
| url: finalUrl, |
| cookies: finalCookies, |
| cookie_string: updatedCookieString.trim(), |
| clearance: newClearanceCookie, |
| cf_clearance: newClearanceCookie.value, |
| user_agent: userAgent |
| }; |
|
|
| } catch (e) { |
| clearTimeout(cl); |
| throw e; |
| } |
| } |
|
|
| module.exports = cloudflareCookies; |