fix: wrap stealth navigator overrides in try-catch, add pixelRatio to screen override

This commit is contained in:
2026-08-12 21:14:16 +08:00
parent 1b2ff5491a
commit dff7afced9
2 changed files with 31 additions and 31 deletions
+24 -30
View File
@@ -7,44 +7,38 @@ export async function injectNavigatorStealth(
profile: FingerprintProfile
): Promise<void> {
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,
+7 -1
View File
@@ -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 / 标题栏 + 窗口边框
});