From cef068ff3c5d2c3d1762ce86ca6cc5168c1128b7 Mon Sep 17 00:00:00 2001 From: openhands Date: Tue, 4 Aug 2026 18:36:52 +0200 Subject: [PATCH] fix: remove stealth plugin to eliminate rimraf crash, use plain puppeteer --- src/lib/services/cf-fetch.ts | 55 +++++++++++++++--------------------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/src/lib/services/cf-fetch.ts b/src/lib/services/cf-fetch.ts index 8ebf0f5bad..93e608b236 100644 --- a/src/lib/services/cf-fetch.ts +++ b/src/lib/services/cf-fetch.ts @@ -1,44 +1,37 @@ +import puppeteer from "puppeteer"; + const UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/125.0.0.0 Safari/537.36"; -let browser: any = null; +let browser: Awaited> | null = null; async function getBrowser() { if (browser) return browser; - try { - const puppeteer = await import("puppeteer-extra"); - const StealthPlugin = await import("puppeteer-extra-plugin-stealth"); - puppeteer.default.use(StealthPlugin.default()); - browser = await puppeteer.default.launch({ - headless: true, - args: [ - "--no-sandbox", - "--disable-setuid-sandbox", - "--disable-web-security", - "--disable-blink-features=AutomationControlled", - "--user-agent=" + UA, - ], - }); - return browser; - } catch (e) { - throw new Error(`Cloudflare bypass unavailable: ${(e as Error).message}`); - } + browser = await puppeteer.launch({ + headless: true, + args: [ + "--no-sandbox", + "--disable-setuid-sandbox", + "--disable-web-security", + "--disable-blink-features=AutomationControlled", + "--user-agent=" + UA, + ], + }); + return browser; } export async function fetchWithCfBypass( url: string, timeout = 30000, ): Promise { - let b: any; - let page: any; - try { - b = await getBrowser(); - page = await b.newPage(); - await page.setUserAgent(UA); - await page.setDefaultTimeout(timeout); + const b = await getBrowser(); + const page = await b.newPage(); + await page.setUserAgent(UA); + await page.setDefaultTimeout(timeout); + try { const response = await page.goto(url, { waitUntil: "networkidle2", timeout, @@ -72,12 +65,10 @@ export async function fetchWithCfBypass( const finalBody = await page.content(); return finalBody; } finally { - if (page) { - try { - await page.close(); - } catch { - // ignore cleanup errors - } + try { + await page.close(); + } catch { + // ignore cleanup errors } } }