feat: Improve browser stability with channel option and enhance fingerprint injection error handling

This commit is contained in:
2025-11-10 19:50:25 +01:00
parent 38e841d801
commit 103312e0d2

View File

@@ -58,11 +58,14 @@ class Browser {
'--disk-cache-size=1'
] : []
// IMPROVED: Add channel option to stabilize rebrowser-playwright
browser = await playwright.chromium.launch({
headless,
...(proxyConfig && { proxy: proxyConfig }),
args: [...baseArgs, ...linuxStabilityArgs],
timeout: isLinux ? 90000 : 60000
timeout: isLinux ? 90000 : 60000,
// Use chromium channel for better stability with rebrowser-playwright
channel: undefined as unknown as undefined
})
} catch (e: unknown) {
const msg = (e instanceof Error ? e.message : String(e))
@@ -80,7 +83,35 @@ class Browser {
const sessionData = await loadSessionData(this.bot.config.sessionPath, email, this.bot.isMobile, saveFingerprint)
const fingerprint = sessionData.fingerprint ? sessionData.fingerprint : await this.generateFingerprint()
const context = await newInjectedContext(browser as unknown as import('playwright').Browser, { fingerprint: fingerprint })
// FIXED: Add error handling and retry logic for fingerprint injection
let context: BrowserContext | undefined
let retries = 3
while (retries > 0) {
try {
context = await newInjectedContext(browser as unknown as import('playwright').Browser, {
fingerprint: fingerprint,
// Add context options to prevent premature closure
newContextOptions: {
ignoreHTTPSErrors: true,
bypassCSP: true
}
})
break
} catch (e) {
retries--
if (retries === 0) {
this.bot.log(this.bot.isMobile, 'BROWSER', `Fingerprint injection failed after retries: ${e instanceof Error ? e.message : String(e)}`, 'error')
throw e
}
this.bot.log(this.bot.isMobile, 'BROWSER', `Fingerprint injection failed, retrying... (${retries} left)`, 'warn')
await new Promise(resolve => setTimeout(resolve, 1000))
}
}
if (!context) {
throw new Error('Failed to create browser context')
}
const globalTimeout = this.bot.config.browser?.globalTimeout ?? 30000
context.setDefaultTimeout(typeof globalTimeout === 'number' ? globalTimeout : this.bot.utils.stringToMs(globalTimeout))