diff --git a/packages/fingerprint-injector/src/fingerprint-injector.ts b/packages/fingerprint-injector/src/fingerprint-injector.ts index 41a0353d..46709c3a 100644 --- a/packages/fingerprint-injector/src/fingerprint-injector.ts +++ b/packages/fingerprint-injector/src/fingerprint-injector.ts @@ -5,6 +5,7 @@ import { Fingerprint, FingerprintGenerator, FingerprintGeneratorOptions, + NavigatorFingerprint, type UserAgentData, } from 'fingerprint-generator'; import { @@ -42,6 +43,7 @@ declare function overrideIntlAPI(language: string): void; declare function overrideStatic(): void; declare function runHeadlessFixes(): void; declare function blockWebRTC(): void; +declare function overrideWebWorker(navigatorFingerprint: NavigatorFingerprint): void; /** * Fingerprint injector class. @@ -251,6 +253,8 @@ export class FingerprintInjector { clientWidth, }; + // @ts-expect-error internal browser code + overrideWebWorker(fp.navigator); runHeadlessFixes(); if (mockWebRTC) blockWebRTC(); diff --git a/packages/fingerprint-injector/src/utils.js b/packages/fingerprint-injector/src/utils.js index e134d481..c0f7005a 100644 --- a/packages/fingerprint-injector/src/utils.js +++ b/packages/fingerprint-injector/src/utils.js @@ -798,3 +798,45 @@ function overrideStatic() { console.error(e); } } + +function overrideWebWorker(navigatorFingerprint) { + const worker = ` + Object.defineProperties(navigator, { + userAgent: { + get: () => "${navigatorFingerprint.userAgent}" + }, + deviceMemory: { + get: () => ${navigatorFingerprint.deviceMemory} + }, + platform: { + get: () => "${navigatorFingerprint.platform}" + }, + hardwareConcurrency: { + get: () => ${navigatorFingerprint.hardwareConcurrency} + }, + languages: { + get: () => ${JSON.stringify(navigatorFingerprint.languages)} + }, + appVersion: { + get: () => "${navigatorFingerprint.appVersion}" + } + }); + + if(navigator.userAgentData){ + Object.defineProperty(navigator, 'userAgentData', { + get: function(){ + return ${JSON.stringify(navigatorFingerprint.userAgentData)} + } + }); + } + \n`; + // eslint-disable-next-line + const createObjectURL = URL.createObjectURL; + URL.createObjectURL = function (blob) { + if (blob.type === 'application/javascript') { + // eslint-disable-next-line + blob = new Blob([worker, blob], { type: blob.type }); + } + return createObjectURL.call(this, blob); + }; +}