jumpy-lion 0.0.41 → 0.0.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-controller.d.ts.map +1 -1
- package/dist/browser-controller.js +102 -16
- package/dist/browser-controller.js.map +1 -1
- package/dist/browser-plugin.d.ts +20 -1
- package/dist/browser-plugin.d.ts.map +1 -1
- package/dist/browser-plugin.js +21 -1
- package/dist/browser-plugin.js.map +1 -1
- package/dist/browser-process/browser.d.ts +22 -1
- package/dist/browser-process/browser.d.ts.map +1 -1
- package/dist/browser-process/browser.js +77 -5
- package/dist/browser-process/browser.js.map +1 -1
- package/dist/browser-profiles/chrome/default.d.ts +116 -0
- package/dist/browser-profiles/chrome/default.d.ts.map +1 -1
- package/dist/browser-profiles/chrome/default.js +118 -1
- package/dist/browser-profiles/chrome/default.js.map +1 -1
- package/dist/browser-profiles/chrome/populate-profile.d.ts +76 -0
- package/dist/browser-profiles/chrome/populate-profile.d.ts.map +1 -0
- package/dist/browser-profiles/chrome/populate-profile.js +300 -0
- package/dist/browser-profiles/chrome/populate-profile.js.map +1 -0
- package/dist/browser-profiles/index.d.ts +1 -0
- package/dist/browser-profiles/index.d.ts.map +1 -1
- package/dist/browser-profiles/index.js +2 -0
- package/dist/browser-profiles/index.js.map +1 -1
- package/dist/crawler.d.ts +32 -1
- package/dist/crawler.d.ts.map +1 -1
- package/dist/crawler.js +7 -0
- package/dist/crawler.js.map +1 -1
- package/dist/fingerprinting/custom-fingerprint-injector.d.ts +87 -0
- package/dist/fingerprinting/custom-fingerprint-injector.d.ts.map +1 -0
- package/dist/fingerprinting/custom-fingerprint-injector.js +342 -0
- package/dist/fingerprinting/custom-fingerprint-injector.js.map +1 -0
- package/dist/fingerprinting/fingerprint-injector.d.ts +40 -2
- package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-injector.js +452 -44
- package/dist/fingerprinting/fingerprint-injector.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js +11 -1
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js +11 -1
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.d.ts +14 -0
- package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.js +776 -0
- package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js +11 -1
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts +14 -0
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js +643 -0
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js +11 -1
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts +17 -1
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/index.js +21 -1
- package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.d.ts +45 -0
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js +291 -0
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js +153 -90
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js +4 -5
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js +11 -1
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts +13 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +413 -70
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.d.ts +13 -0
- package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.js +355 -0
- package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts +12 -3
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js +261 -71
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.d.ts +55 -0
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js +380 -0
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts +8 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +756 -71
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/storage-consistency.d.ts +13 -0
- package/dist/fingerprinting/fingerprint-overrides/storage-consistency.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/storage-consistency.js +368 -0
- package/dist/fingerprinting/fingerprint-overrides/storage-consistency.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/timing-consistency.d.ts +13 -0
- package/dist/fingerprinting/fingerprint-overrides/timing-consistency.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/timing-consistency.js +438 -0
- package/dist/fingerprinting/fingerprint-overrides/timing-consistency.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts +7 -1
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +158 -58
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/utils.d.ts +12 -0
- package/dist/fingerprinting/fingerprint-overrides/utils.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/utils.js +517 -0
- package/dist/fingerprinting/fingerprint-overrides/utils.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +51 -10
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js +11 -1
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +11 -1
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js.map +1 -1
- package/dist/page.d.ts +12 -0
- package/dist/page.d.ts.map +1 -1
- package/dist/page.js +35 -3
- package/dist/page.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/dist/fingerprinting/canvas-fingerprint.d.ts +0 -4
- package/dist/fingerprinting/canvas-fingerprint.d.ts.map +0 -1
- package/dist/fingerprinting/canvas-fingerprint.js +0 -60
- package/dist/fingerprinting/canvas-fingerprint.js.map +0 -1
|
@@ -39,71 +39,70 @@ export const createLocaleSpoofingScript = () => {
|
|
|
39
39
|
};
|
|
40
40
|
|
|
41
41
|
// Override Intl.DateTimeFormat to use Windows-consistent formatting
|
|
42
|
+
// CRITICAL: Store reference BEFORE override and use recursion guard
|
|
42
43
|
const OriginalDateTimeFormat = Intl.DateTimeFormat;
|
|
44
|
+
let isCreatingDateTimeFormat = false; // Recursion guard
|
|
45
|
+
let cachedTimeZone = 'UTC';
|
|
46
|
+
try {
|
|
47
|
+
cachedTimeZone = new OriginalDateTimeFormat().resolvedOptions().timeZone;
|
|
48
|
+
} catch (e) {
|
|
49
|
+
// Fallback to UTC if timezone detection fails
|
|
50
|
+
}
|
|
51
|
+
|
|
43
52
|
Intl.DateTimeFormat = function(locales, options) {
|
|
44
|
-
//
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
// Force specific Windows locale patterns
|
|
48
|
-
if (platform === 'Win32' || !platform.includes('Linux')) {
|
|
49
|
-
if (!options || !options.timeZone) {
|
|
50
|
-
// Use common Windows timezone handling
|
|
51
|
-
windowsOptions.timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
52
|
-
}
|
|
53
|
+
// CRITICAL: Recursion guard - if we're already inside this function, use original directly
|
|
54
|
+
if (isCreatingDateTimeFormat) {
|
|
55
|
+
return Reflect.construct(OriginalDateTimeFormat, [locales, options], OriginalDateTimeFormat);
|
|
53
56
|
}
|
|
54
57
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
formatter.format = function(date) {
|
|
60
|
-
let result = originalFormat.call(this, date);
|
|
58
|
+
isCreatingDateTimeFormat = true;
|
|
59
|
+
try {
|
|
60
|
+
// Ensure Windows-like date formatting regardless of actual locale
|
|
61
|
+
const windowsOptions = Object.assign({}, windowsLocaleConfig.dateFormat, options);
|
|
61
62
|
|
|
62
|
-
//
|
|
63
|
-
if (platform === 'Win32') {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
63
|
+
// Force specific Windows locale patterns
|
|
64
|
+
if (platform === 'Win32' || !platform.includes('Linux')) {
|
|
65
|
+
if (!options || !options.timeZone) {
|
|
66
|
+
windowsOptions.timeZone = cachedTimeZone;
|
|
67
|
+
}
|
|
67
68
|
}
|
|
68
69
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
// Use Reflect.construct to properly create instance with original constructor
|
|
71
|
+
const formatter = Reflect.construct(OriginalDateTimeFormat, [locales, windowsOptions], OriginalDateTimeFormat);
|
|
72
|
+
|
|
73
|
+
return formatter;
|
|
74
|
+
} finally {
|
|
75
|
+
isCreatingDateTimeFormat = false;
|
|
76
|
+
}
|
|
73
77
|
};
|
|
74
78
|
|
|
75
79
|
// Override Intl.NumberFormat for Windows-consistent number formatting
|
|
76
80
|
const OriginalNumberFormat = Intl.NumberFormat;
|
|
81
|
+
let isCreatingNumberFormat = false; // Recursion guard
|
|
82
|
+
|
|
77
83
|
Intl.NumberFormat = function(locales, options) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if (platform === 'Win32') {
|
|
82
|
-
windowsOptions.useGrouping = true;
|
|
83
|
-
if (options && options.style === 'currency') {
|
|
84
|
-
Object.assign(windowsOptions, windowsLocaleConfig.currencyFormat, options);
|
|
85
|
-
}
|
|
84
|
+
// CRITICAL: Recursion guard
|
|
85
|
+
if (isCreatingNumberFormat) {
|
|
86
|
+
return Reflect.construct(OriginalNumberFormat, [locales, options], OriginalNumberFormat);
|
|
86
87
|
}
|
|
87
88
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
const originalFormat = formatter.format;
|
|
92
|
-
formatter.format = function(number) {
|
|
93
|
-
let result = originalFormat.call(this, number);
|
|
89
|
+
isCreatingNumberFormat = true;
|
|
90
|
+
try {
|
|
91
|
+
const windowsOptions = Object.assign({}, windowsLocaleConfig.numberFormat, options);
|
|
94
92
|
|
|
95
|
-
// Windows-specific formatting
|
|
93
|
+
// Windows-specific number formatting
|
|
96
94
|
if (platform === 'Win32') {
|
|
97
|
-
|
|
98
|
-
if (
|
|
99
|
-
|
|
95
|
+
windowsOptions.useGrouping = true;
|
|
96
|
+
if (options && options.style === 'currency') {
|
|
97
|
+
Object.assign(windowsOptions, windowsLocaleConfig.currencyFormat, options);
|
|
100
98
|
}
|
|
101
99
|
}
|
|
102
100
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
101
|
+
// Use Reflect.construct to properly create instance with original constructor
|
|
102
|
+
return Reflect.construct(OriginalNumberFormat, [locales, windowsOptions], OriginalNumberFormat);
|
|
103
|
+
} finally {
|
|
104
|
+
isCreatingNumberFormat = false;
|
|
105
|
+
}
|
|
107
106
|
};
|
|
108
107
|
|
|
109
108
|
// Override Date.prototype methods for consistent formatting
|
|
@@ -127,7 +126,7 @@ export const createLocaleSpoofingScript = () => {
|
|
|
127
126
|
};
|
|
128
127
|
|
|
129
128
|
// Override Number.prototype methods for consistent formatting
|
|
130
|
-
const
|
|
129
|
+
const originalNumberToLocaleString = Number.prototype.toLocaleString;
|
|
131
130
|
Number.prototype.toLocaleString = function(locales, options) {
|
|
132
131
|
let windowsOptions = Object.assign({}, windowsLocaleConfig.numberFormat, options);
|
|
133
132
|
|
|
@@ -135,25 +134,32 @@ export const createLocaleSpoofingScript = () => {
|
|
|
135
134
|
windowsOptions = Object.assign({}, windowsLocaleConfig.currencyFormat, options);
|
|
136
135
|
}
|
|
137
136
|
|
|
138
|
-
return
|
|
137
|
+
return originalNumberToLocaleString.call(this, locales || 'en-US', windowsOptions);
|
|
139
138
|
};
|
|
140
139
|
|
|
141
140
|
// Spoof timezone-related methods for consistency
|
|
142
141
|
const originalGetTimezoneOffset = Date.prototype.getTimezoneOffset;
|
|
142
|
+
// Cache winter/summer offsets at init time to prevent recursion
|
|
143
|
+
let cachedWinterOffset = null;
|
|
144
|
+
let cachedSummerOffset = null;
|
|
145
|
+
try {
|
|
146
|
+
const now = new Date();
|
|
147
|
+
cachedWinterOffset = originalGetTimezoneOffset.call(new Date(now.getFullYear(), 0, 1));
|
|
148
|
+
cachedSummerOffset = originalGetTimezoneOffset.call(new Date(now.getFullYear(), 6, 1));
|
|
149
|
+
} catch (e) {
|
|
150
|
+
// Fallback - no DST adjustment
|
|
151
|
+
}
|
|
152
|
+
|
|
143
153
|
Date.prototype.getTimezoneOffset = function() {
|
|
144
154
|
const offset = originalGetTimezoneOffset.call(this);
|
|
145
155
|
|
|
146
156
|
// Ensure timezone offset is reported consistently
|
|
147
157
|
// Windows tends to handle DST slightly differently
|
|
148
|
-
if (platform === 'Win32') {
|
|
149
|
-
const now = new Date();
|
|
150
|
-
const winterOffset = new Date(now.getFullYear(), 0, 1).getTimezoneOffset();
|
|
151
|
-
const summerOffset = new Date(now.getFullYear(), 6, 1).getTimezoneOffset();
|
|
152
|
-
|
|
158
|
+
if (platform === 'Win32' && cachedWinterOffset !== null && cachedSummerOffset !== null) {
|
|
153
159
|
// Apply Windows-style DST calculation if needed
|
|
154
|
-
if (
|
|
155
|
-
const isDST = offset === Math.min(
|
|
156
|
-
return isDST ?
|
|
160
|
+
if (cachedWinterOffset !== cachedSummerOffset) {
|
|
161
|
+
const isDST = offset === Math.min(cachedWinterOffset, cachedSummerOffset);
|
|
162
|
+
return isDST ? cachedSummerOffset : cachedWinterOffset;
|
|
157
163
|
}
|
|
158
164
|
}
|
|
159
165
|
|
|
@@ -163,35 +169,60 @@ export const createLocaleSpoofingScript = () => {
|
|
|
163
169
|
// Override Intl.Collator for Windows-consistent string comparison
|
|
164
170
|
if (typeof Intl.Collator !== 'undefined') {
|
|
165
171
|
const OriginalCollator = Intl.Collator;
|
|
172
|
+
let isCreatingCollator = false;
|
|
166
173
|
Intl.Collator = function(locales, options) {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
+
if (isCreatingCollator) {
|
|
175
|
+
return Reflect.construct(OriginalCollator, [locales, options], OriginalCollator);
|
|
176
|
+
}
|
|
177
|
+
isCreatingCollator = true;
|
|
178
|
+
try {
|
|
179
|
+
const windowsOptions = Object.assign({
|
|
180
|
+
sensitivity: 'base',
|
|
181
|
+
usage: 'sort',
|
|
182
|
+
caseFirst: 'upper'
|
|
183
|
+
}, options);
|
|
184
|
+
return Reflect.construct(OriginalCollator, [locales, windowsOptions], OriginalCollator);
|
|
185
|
+
} finally {
|
|
186
|
+
isCreatingCollator = false;
|
|
187
|
+
}
|
|
174
188
|
};
|
|
175
189
|
}
|
|
176
190
|
|
|
177
191
|
// Override Intl.PluralRules for consistency
|
|
178
192
|
if (typeof Intl.PluralRules !== 'undefined') {
|
|
179
193
|
const OriginalPluralRules = Intl.PluralRules;
|
|
194
|
+
let isCreatingPluralRules = false;
|
|
180
195
|
Intl.PluralRules = function(locales, options) {
|
|
181
|
-
|
|
196
|
+
if (isCreatingPluralRules) {
|
|
197
|
+
return Reflect.construct(OriginalPluralRules, [locales, options], OriginalPluralRules);
|
|
198
|
+
}
|
|
199
|
+
isCreatingPluralRules = true;
|
|
200
|
+
try {
|
|
201
|
+
return Reflect.construct(OriginalPluralRules, [locales || 'en-US', options], OriginalPluralRules);
|
|
202
|
+
} finally {
|
|
203
|
+
isCreatingPluralRules = false;
|
|
204
|
+
}
|
|
182
205
|
};
|
|
183
206
|
}
|
|
184
207
|
|
|
185
208
|
// Override Intl.RelativeTimeFormat if available
|
|
186
209
|
if (typeof Intl.RelativeTimeFormat !== 'undefined') {
|
|
187
210
|
const OriginalRelativeTimeFormat = Intl.RelativeTimeFormat;
|
|
211
|
+
let isCreatingRelativeTimeFormat = false;
|
|
188
212
|
Intl.RelativeTimeFormat = function(locales, options) {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
213
|
+
if (isCreatingRelativeTimeFormat) {
|
|
214
|
+
return Reflect.construct(OriginalRelativeTimeFormat, [locales, options], OriginalRelativeTimeFormat);
|
|
215
|
+
}
|
|
216
|
+
isCreatingRelativeTimeFormat = true;
|
|
217
|
+
try {
|
|
218
|
+
const windowsOptions = Object.assign({
|
|
219
|
+
style: 'long',
|
|
220
|
+
numeric: 'auto'
|
|
221
|
+
}, options);
|
|
222
|
+
return Reflect.construct(OriginalRelativeTimeFormat, [locales || 'en-US', windowsOptions], OriginalRelativeTimeFormat);
|
|
223
|
+
} finally {
|
|
224
|
+
isCreatingRelativeTimeFormat = false;
|
|
225
|
+
}
|
|
195
226
|
};
|
|
196
227
|
}
|
|
197
228
|
|
|
@@ -230,32 +261,64 @@ export const createLocaleSpoofingScript = () => {
|
|
|
230
261
|
};
|
|
231
262
|
}
|
|
232
263
|
|
|
264
|
+
// Helper to check if property can be redefined
|
|
265
|
+
const canRedefineProperty = (obj, prop) => {
|
|
266
|
+
try {
|
|
267
|
+
const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
|
|
268
|
+
return !descriptor || descriptor.configurable !== false;
|
|
269
|
+
} catch (e) {
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
// IMPORTANT: Cache original values BEFORE any override to prevent infinite recursion
|
|
275
|
+
const originalLanguage = navigator.language;
|
|
276
|
+
const originalLanguages = navigator.languages ? [...navigator.languages] : ['en-US'];
|
|
277
|
+
|
|
233
278
|
// Ensure consistent navigator.language reporting
|
|
234
|
-
if (navigator
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
279
|
+
if (canRedefineProperty(navigator, 'language')) {
|
|
280
|
+
try {
|
|
281
|
+
Object.defineProperty(navigator, 'language', {
|
|
282
|
+
get: function() {
|
|
283
|
+
// Use cached value to prevent infinite recursion
|
|
284
|
+
return platform === 'Win32' ? 'en-US' : originalLanguage;
|
|
285
|
+
},
|
|
286
|
+
configurable: true // Allow other scripts to modify if needed
|
|
287
|
+
});
|
|
288
|
+
} catch (e) {
|
|
289
|
+
// Property already defined, skip
|
|
290
|
+
}
|
|
242
291
|
}
|
|
243
292
|
|
|
244
|
-
if (navigator
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
293
|
+
if (canRedefineProperty(navigator, 'languages')) {
|
|
294
|
+
try {
|
|
295
|
+
Object.defineProperty(navigator, 'languages', {
|
|
296
|
+
get: function() {
|
|
297
|
+
// Use cached value to prevent infinite recursion
|
|
298
|
+
if (platform === 'Win32') {
|
|
299
|
+
return ['en-US', 'en'];
|
|
300
|
+
}
|
|
301
|
+
return originalLanguages;
|
|
302
|
+
},
|
|
303
|
+
configurable: true // Allow other scripts to modify if needed
|
|
304
|
+
});
|
|
305
|
+
} catch (e) {
|
|
306
|
+
// Property already defined, skip
|
|
307
|
+
}
|
|
255
308
|
}
|
|
256
309
|
};
|
|
257
310
|
|
|
258
|
-
|
|
311
|
+
const DEBUG_PREFIX = '[CDP-FP-DEBUG]';
|
|
312
|
+
const ERROR_PREFIX = '[CDP-FP-ERROR]';
|
|
313
|
+
|
|
314
|
+
try {
|
|
315
|
+
console.log(DEBUG_PREFIX, 'Starting locale spoofing...');
|
|
316
|
+
spoofLocale();
|
|
317
|
+
console.log(DEBUG_PREFIX, '✓ Locale spoofing applied');
|
|
318
|
+
} catch (e) {
|
|
319
|
+
console.error(ERROR_PREFIX, '✗ Failed to apply locale spoofing:', e);
|
|
320
|
+
throw e;
|
|
321
|
+
}
|
|
259
322
|
})();
|
|
260
323
|
`;
|
|
261
324
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locale-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/locale-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAW,EAAE;IACnD,OAAO
|
|
1
|
+
{"version":3,"file":"locale-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/locale-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAW,EAAE;IACnD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6TV,CAAC;AACF,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mouse-humanization.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/mouse-humanization.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,8BAA8B,WAAkB,GAAG,KAAG,OAAO,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"mouse-humanization.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/mouse-humanization.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,8BAA8B,WAAkB,GAAG,KAAG,OAAO,CAAC,IAAI,CA+F9E,CAAC"}
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
* Includes automatic human-like interactions after page load
|
|
5
5
|
*/
|
|
6
6
|
export const setupMouseMovementHumanization = async (client) => {
|
|
7
|
-
//
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
// NOTE: Using addScriptToEvaluateOnNewDocument instead of Runtime.evaluate
|
|
8
|
+
// Runtime.evaluate is a CDP detection vector - it modifies console bindings and Error stacks
|
|
9
|
+
await client.Page.addScriptToEvaluateOnNewDocument({ source: `
|
|
10
10
|
(() => {
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
@@ -97,7 +97,6 @@ export const setupMouseMovementHumanization = async (client) => {
|
|
|
97
97
|
// Storage might be disabled
|
|
98
98
|
}
|
|
99
99
|
});
|
|
100
|
-
})()
|
|
101
|
-
});
|
|
100
|
+
})();` });
|
|
102
101
|
};
|
|
103
102
|
//# sourceMappingURL=mouse-humanization.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mouse-humanization.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/mouse-humanization.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,EAAE,MAAW,EAAiB,EAAE;IAC/E,
|
|
1
|
+
{"version":3,"file":"mouse-humanization.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/mouse-humanization.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,EAAE,MAAW,EAAiB,EAAE;IAC/E,2EAA2E;IAC3E,6FAA6F;IAC7F,MAAM,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,EAAE,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2F3D,EAAE,CAAC,CAAC;AACV,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performance-spoofing.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/performance-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,+BAA+B,QAAO,
|
|
1
|
+
{"version":3,"file":"performance-spoofing.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/performance-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,+BAA+B,QAAO,MAwOlD,CAAC"}
|
|
@@ -221,7 +221,17 @@ export const createPerformanceSpoofingScript = () => {
|
|
|
221
221
|
}
|
|
222
222
|
};
|
|
223
223
|
|
|
224
|
-
|
|
224
|
+
const DEBUG_PREFIX = '[CDP-FP-DEBUG]';
|
|
225
|
+
const ERROR_PREFIX = '[CDP-FP-ERROR]';
|
|
226
|
+
|
|
227
|
+
try {
|
|
228
|
+
console.log(DEBUG_PREFIX, 'Starting performance spoofing...');
|
|
229
|
+
spoofPerformance();
|
|
230
|
+
console.log(DEBUG_PREFIX, '✓ Performance spoofing applied');
|
|
231
|
+
} catch (e) {
|
|
232
|
+
console.error(ERROR_PREFIX, '✗ Failed to apply performance spoofing:', e);
|
|
233
|
+
throw e;
|
|
234
|
+
}
|
|
225
235
|
})();
|
|
226
236
|
`;
|
|
227
237
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performance-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/performance-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAW,EAAE;IACxD,OAAO
|
|
1
|
+
{"version":3,"file":"performance-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/performance-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAW,EAAE;IACxD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsOV,CAAC;AACF,CAAC,CAAC"}
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Platform Consistency Script
|
|
3
3
|
* Ensures all browser properties match the specified platform (1:1 fingerprinting)
|
|
4
|
+
*
|
|
5
|
+
* 2024-2025 Enhancements:
|
|
6
|
+
* - Screen orientation API consistency
|
|
7
|
+
* - screen.availLeft/availTop for Windows
|
|
8
|
+
* - visualViewport properties consistency
|
|
9
|
+
* - window.outerWidth/outerHeight ratios
|
|
10
|
+
* - window.screenX/screenY typical values
|
|
11
|
+
* - matchMedia() platform-appropriate results
|
|
4
12
|
*/
|
|
5
13
|
export interface PlatformConfig {
|
|
6
14
|
platform?: string;
|
|
@@ -15,6 +23,11 @@ export interface PlatformConfig {
|
|
|
15
23
|
language?: string;
|
|
16
24
|
languages?: string[];
|
|
17
25
|
oscpu?: string;
|
|
26
|
+
userAgent?: string;
|
|
27
|
+
appVersion?: string;
|
|
28
|
+
appName?: string;
|
|
29
|
+
appCodeName?: string;
|
|
30
|
+
product?: string;
|
|
18
31
|
}
|
|
19
32
|
export declare const createPlatformConsistencyScript: (platform: string, fingerprintData?: PlatformConfig) => string;
|
|
20
33
|
//# sourceMappingURL=platform-consistency.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-consistency.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/platform-consistency.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"platform-consistency.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/platform-consistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,+BAA+B,aAAc,MAAM,oBAAoB,cAAc,KAAG,MA+iBpG,CAAC"}
|