diff --git a/packages/fingerprint-generator/src/fingerprint-generator.ts b/packages/fingerprint-generator/src/fingerprint-generator.ts index c567e271..d239416c 100644 --- a/packages/fingerprint-generator/src/fingerprint-generator.ts +++ b/packages/fingerprint-generator/src/fingerprint-generator.ts @@ -82,7 +82,7 @@ export type VideoCard = { }; export type Fingerprint = { - screen: ScreenFingerprint; + screen: ScreenFingerprint | null; navigator: NavigatorFingerprint; videoCodecs: Record; audioCodecs: Record; @@ -119,6 +119,13 @@ export interface FingerprintGeneratorOptions extends HeaderGeneratorOptions { * Try enabling this if you are experiencing performance issues with the fingerprint injection. */ slim?: boolean; + /** + * When set to true, allows fingerprint generation without screen properties. + * This can be useful when screen fingerprint is not required or to avoid fingerprint generation issue. + * + * **Note:** When enabled, the `screen` property in the generated fingerprint will be null. + */ + skipScreenFingerprint?: boolean; } /** @@ -242,7 +249,14 @@ export class FingerprintGenerator extends HeaderGenerator { } } - if (!fingerprint.screen) continue; // fix? sometimes, fingerprints are generated 90% empty/null. This is just a workaround. + if (!fingerprint.screen) { + // If skipScreenFingerprint is enabled, allow fingerprint without screen + if (options.skipScreenFingerprint) { + fingerprint.screen = null; + } else { + continue; // fix? sometimes, fingerprints are generated 90% empty/null. This is just a workaround. + } + } // Manually add the set of accepted languages required by the input const acceptLanguageHeaderValue = diff --git a/packages/fingerprint-injector/src/fingerprint-injector.ts b/packages/fingerprint-injector/src/fingerprint-injector.ts index 41a0353d..9a9b4d27 100644 --- a/packages/fingerprint-injector/src/fingerprint-injector.ts +++ b/packages/fingerprint-injector/src/fingerprint-injector.ts @@ -147,20 +147,22 @@ export class FingerprintInjector { const browserVersion = await page.browser().version(); if (!browserVersion.toLowerCase().includes('firefox')) { - await ( - await page.target().createCDPSession() - ).send('Page.setDeviceMetricsOverride', { - screenHeight: screen.height, - screenWidth: screen.width, - width: screen.width, - height: screen.height, - mobile: /phone|android|mobile/i.test(userAgent), - screenOrientation: - screen.height > screen.width - ? { angle: 0, type: 'portraitPrimary' } - : { angle: 90, type: 'landscapePrimary' }, - deviceScaleFactor: screen.devicePixelRatio, - }); + if (screen) { + await ( + await page.target().createCDPSession() + ).send('Page.setDeviceMetricsOverride', { + screenHeight: screen.height, + screenWidth: screen.width, + width: screen.width, + height: screen.height, + mobile: /phone|android|mobile/i.test(userAgent), + screenOrientation: + screen.height > screen.width + ? { angle: 0, type: 'portraitPrimary' } + : { angle: 90, type: 'landscapePrimary' }, + deviceScaleFactor: screen.devicePixelRatio, + }); + } await page.setExtraHTTPHeaders( this.onlyInjectableHeaders(headers, browserVersion), @@ -234,7 +236,7 @@ export class FingerprintInjector { hasHDR, // window.screen props ...newScreen - } = allScreenProps; + } = allScreenProps || {}; const windowScreenProps = { innerHeight, @@ -273,9 +275,15 @@ export class FingerprintInjector { } overrideInstancePrototype(window.navigator, navigatorProps); - overrideInstancePrototype(window.screen, newScreen); - overrideWindowDimensionsProps(windowScreenProps); - overrideDocumentDimensionsProps(documentScreenProps); + if (allScreenProps) { + overrideInstancePrototype(window.screen, newScreen); + overrideWindowDimensionsProps( + windowScreenProps as Record, + ); + overrideDocumentDimensionsProps( + documentScreenProps as Record, + ); + } overrideInstancePrototype(window.history, { length: historyLength, @@ -346,11 +354,16 @@ export async function newInjectedContext( userAgent: fingerprint.navigator.userAgent, colorScheme: 'dark', ...options?.newContextOptions, - viewport: { - width: fingerprint.screen.width, - height: fingerprint.screen.height, - ...options?.newContextOptions?.viewport, - }, + viewport: fingerprint.screen + ? { + width: fingerprint.screen.width, + height: fingerprint.screen.height, + ...options?.newContextOptions?.viewport, + } + : (options?.newContextOptions?.viewport ?? { + width: 1920, + height: 1080, + }), extraHTTPHeaders: { 'accept-language': headers['accept-language'], ...options?.newContextOptions?.extraHTTPHeaders,