From dff7afced9fc9eb1f0411ab6777dae0cc18ac6fd Mon Sep 17 00:00:00 2001 From: AskaEth Date: Wed, 12 Aug 2026 21:14:16 +0800 Subject: [PATCH] fix: wrap stealth navigator overrides in try-catch, add pixelRatio to screen override --- packages/daemon/src/stealth/navigator.ts | 54 +++++++++++------------- packages/daemon/src/stealth/screen.ts | 8 +++- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/packages/daemon/src/stealth/navigator.ts b/packages/daemon/src/stealth/navigator.ts index e02415c..c2d2f05 100644 --- a/packages/daemon/src/stealth/navigator.ts +++ b/packages/daemon/src/stealth/navigator.ts @@ -7,44 +7,38 @@ export async function injectNavigatorStealth( profile: FingerprintProfile ): Promise { await context.addInitScript((opts) => { - Object.defineProperty(navigator, 'webdriver', { - get: () => false, - }); + // Override navigator properties; wrap in try-catch because stealth plugin may have already + // defined some as non-configurable / 用 try-catch 包裹,因为 stealth 插件可能已将某些属性设为不可重定义 + function safeDefine(obj: any, prop: string, getter: () => any) { + try { Object.defineProperty(obj, prop, { get: getter, configurable: true }); } catch { /* already set */ } + } + + safeDefine(navigator, 'webdriver', () => false); if (navigator.plugins.length === 0) { - Object.defineProperty(navigator, 'plugins', { - get: () => { - const arr = Object.create(PluginArray.prototype); - arr.length = 0; - arr.item = () => null; - arr.namedItem = () => null; - arr.refresh = () => {}; - return arr; - }, + safeDefine(navigator, 'plugins', () => { + const arr = Object.create(PluginArray.prototype); + arr.length = 0; + arr.item = () => null; + arr.namedItem = () => null; + arr.refresh = () => {}; + return arr; }); } - Object.defineProperty(navigator, 'languages', { - get: () => opts.languages, - }); - - Object.defineProperty(navigator, 'platform', { - get: () => opts.platform, - }); + safeDefine(navigator, 'languages', () => opts.languages); + safeDefine(navigator, 'platform', () => opts.platform); + safeDefine(navigator, 'vendor', () => 'Google Inc.'); + safeDefine(navigator, 'productSub', () => '20030107'); if (!('connection' in navigator)) { - Object.defineProperty(navigator, 'connection', { - get: () => ({ - downlink: 10, - effectiveType: '4g', - rtt: 50, - saveData: false, - }), - }); + safeDefine(navigator, 'connection', () => ({ + downlink: 10, + effectiveType: '4g', + rtt: 50, + saveData: false, + })); } - - Object.defineProperty(navigator, 'vendor', { get: () => 'Google Inc.' }); - Object.defineProperty(navigator, 'productSub', { get: () => '20030107' }); }, { languages: profile.languages, platform: profile.platform, diff --git a/packages/daemon/src/stealth/screen.ts b/packages/daemon/src/stealth/screen.ts index 3701e4e..522713f 100644 --- a/packages/daemon/src/stealth/screen.ts +++ b/packages/daemon/src/stealth/screen.ts @@ -28,6 +28,11 @@ export async function injectScreenStealth( get: () => opts.colorDepth, }); + // Override devicePixelRatio / 覆盖设备像素比 + Object.defineProperty(window, 'devicePixelRatio', { + get: () => opts.pixelRatio, + }); + // Override window.outerWidth/Height > inner for window decorations / 覆盖 outerWidth/Height 使其 > inner 模拟窗口装饰 Object.defineProperty(window, 'outerWidth', { get: () => opts.outerWidth, @@ -38,9 +43,10 @@ export async function injectScreenStealth( }, { screenWidth: screenProfile.width, screenHeight: screenProfile.height, - availWidth: screenProfile.width, + availWidth: screenProfile.width - TASKBAR_HEIGHT, // side taskbar scenario / 侧边任务栏场景 availHeight: screenProfile.height - TASKBAR_HEIGHT, colorDepth: screenProfile.colorDepth, + pixelRatio: screenProfile.pixelRatio, outerWidth: viewport.width + 16, // window frame chrome / 窗口边框 outerHeight: viewport.height + 72, // title bar + window frame / 标题栏 + 窗口边框 });