jumpy-lion 0.1.5 → 0.1.6-beta.1

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.
Files changed (88) hide show
  1. package/README.md +13 -0
  2. package/dist/browser-controller.d.ts.map +1 -1
  3. package/dist/browser-controller.js +52 -2
  4. package/dist/browser-controller.js.map +1 -1
  5. package/dist/browser-plugin.d.ts +31 -0
  6. package/dist/browser-plugin.d.ts.map +1 -1
  7. package/dist/browser-plugin.js +76 -1
  8. package/dist/browser-plugin.js.map +1 -1
  9. package/dist/browser-process/anti-detect-browser.d.ts +56 -0
  10. package/dist/browser-process/anti-detect-browser.d.ts.map +1 -0
  11. package/dist/browser-process/anti-detect-browser.js +134 -0
  12. package/dist/browser-process/anti-detect-browser.js.map +1 -0
  13. package/dist/browser-process/anti-detect-config.d.ts +84 -0
  14. package/dist/browser-process/anti-detect-config.d.ts.map +1 -0
  15. package/dist/browser-process/anti-detect-config.js +178 -0
  16. package/dist/browser-process/anti-detect-config.js.map +1 -0
  17. package/dist/browser-process/browser.d.ts +19 -0
  18. package/dist/browser-process/browser.d.ts.map +1 -1
  19. package/dist/browser-process/browser.js +83 -4
  20. package/dist/browser-process/browser.js.map +1 -1
  21. package/dist/browser-process/get-chrome-executable.d.ts +7 -0
  22. package/dist/browser-process/get-chrome-executable.d.ts.map +1 -1
  23. package/dist/browser-process/get-chrome-executable.js +42 -0
  24. package/dist/browser-process/get-chrome-executable.js.map +1 -1
  25. package/dist/browser-process/index.d.ts +4 -1
  26. package/dist/browser-process/index.d.ts.map +1 -1
  27. package/dist/browser-process/index.js +3 -1
  28. package/dist/browser-process/index.js.map +1 -1
  29. package/dist/crawler.d.ts +2 -0
  30. package/dist/crawler.d.ts.map +1 -1
  31. package/dist/crawler.js +5 -2
  32. package/dist/crawler.js.map +1 -1
  33. package/dist/fingerprinting/fingerprint-injector.d.ts +39 -0
  34. package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -1
  35. package/dist/fingerprinting/fingerprint-injector.js +141 -50
  36. package/dist/fingerprinting/fingerprint-injector.js.map +1 -1
  37. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts.map +1 -1
  38. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js +16 -0
  39. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js.map +1 -1
  40. package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.d.ts.map +1 -1
  41. package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.js +3 -2
  42. package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.js.map +1 -1
  43. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts.map +1 -1
  44. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js +18 -10
  45. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js.map +1 -1
  46. package/dist/fingerprinting/fingerprint-overrides/index.d.ts +1 -1
  47. package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -1
  48. package/dist/fingerprinting/fingerprint-overrides/index.js +1 -1
  49. package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -1
  50. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts.map +1 -1
  51. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js +5 -8
  52. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js.map +1 -1
  53. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts +12 -1
  54. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts.map +1 -1
  55. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js +27 -22
  56. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js.map +1 -1
  57. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -1
  58. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +86 -28
  59. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -1
  60. package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -1
  61. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +165 -33
  62. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -1
  63. package/dist/fingerprinting/fingerprint-overrides/storage-consistency.d.ts.map +1 -1
  64. package/dist/fingerprinting/fingerprint-overrides/storage-consistency.js +10 -8
  65. package/dist/fingerprinting/fingerprint-overrides/storage-consistency.js.map +1 -1
  66. package/dist/fingerprinting/fingerprint-overrides/timing-consistency.d.ts.map +1 -1
  67. package/dist/fingerprinting/fingerprint-overrides/timing-consistency.js +9 -7
  68. package/dist/fingerprinting/fingerprint-overrides/timing-consistency.js.map +1 -1
  69. package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +6 -6
  70. package/dist/fingerprinting/fingerprint-overrides/utils.d.ts.map +1 -1
  71. package/dist/fingerprinting/fingerprint-overrides/utils.js +44 -1
  72. package/dist/fingerprinting/fingerprint-overrides/utils.js.map +1 -1
  73. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -1
  74. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +43 -1
  75. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -1
  76. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts.map +1 -1
  77. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js +9 -1
  78. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js.map +1 -1
  79. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts.map +1 -1
  80. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +14 -3
  81. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js.map +1 -1
  82. package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts +32 -0
  83. package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts.map +1 -0
  84. package/dist/fingerprinting/non-apify-fingerprint-generator.js +480 -0
  85. package/dist/fingerprinting/non-apify-fingerprint-generator.js.map +1 -0
  86. package/dist/tsconfig.build.tsbuildinfo +1 -1
  87. package/package.json +11 -2
  88. package/scripts/postinstall.cjs +242 -0
@@ -0,0 +1,84 @@
1
+ /**
2
+ * anti-detect-config.ts — Generate and manage FingerprintConfig JSON for the anti-detect browser
3
+ *
4
+ * Called by browser.ts before launching the browser when useNativeStealth is enabled.
5
+ * Translates the fingerprint-generator BrowserFingerprintWithHeaders output into
6
+ * the --fingerprint-config JSON schema consumed by the C++ FingerprintConfig class.
7
+ */
8
+ import type { BrowserFingerprintWithHeaders } from 'fingerprint-generator';
9
+ export interface FingerprintConfigUaBrand {
10
+ brand: string;
11
+ version: string;
12
+ full_version?: string;
13
+ }
14
+ export interface FingerprintConfigJson {
15
+ version: 1;
16
+ /** 64-bit seed (number, as JSON doesn't support BigInt) */
17
+ seed: number;
18
+ navigator: {
19
+ platform: string;
20
+ /** Comma-separated accept-languages, e.g. "en-US,en;q=0.9" */
21
+ languages?: string;
22
+ hardwareConcurrency: number;
23
+ deviceMemory: number;
24
+ userAgent: string;
25
+ userAgentData?: {
26
+ brands: FingerprintConfigUaBrand[];
27
+ mobile: boolean;
28
+ platform: string;
29
+ platformVersion: string;
30
+ architecture: string;
31
+ bitness: string;
32
+ model: string;
33
+ uaFullVersion: string;
34
+ fullVersionList: FingerprintConfigUaBrand[];
35
+ };
36
+ };
37
+ webgl: {
38
+ vendor: string;
39
+ renderer: string;
40
+ };
41
+ screen: {
42
+ width: number;
43
+ height: number;
44
+ availWidth: number;
45
+ availHeight: number;
46
+ colorDepth: number;
47
+ pixelRatio: number;
48
+ };
49
+ fonts?: {
50
+ allowlist: string;
51
+ };
52
+ noise: {
53
+ canvas: boolean;
54
+ audio: boolean;
55
+ rects: boolean;
56
+ measureText: boolean;
57
+ };
58
+ timing: {
59
+ performanceNowResolutionMs: number;
60
+ };
61
+ webgpu?: {
62
+ vendor: string;
63
+ architecture: string;
64
+ device: string;
65
+ description: string;
66
+ };
67
+ }
68
+ /**
69
+ * Generate a FingerprintConfig JSON object from fingerprint-generator output.
70
+ *
71
+ * @param fingerprint - BrowserFingerprintWithHeaders from fingerprint-generator
72
+ * @param sessionId - Session identifier used to derive the seed (proxy session ID, etc.)
73
+ */
74
+ export declare function generateFingerprintConfig(fingerprint: BrowserFingerprintWithHeaders, sessionId?: string): FingerprintConfigJson;
75
+ /**
76
+ * Write the fingerprint config to a temp file and return the path.
77
+ * The caller is responsible for deleting the file after the browser exits.
78
+ */
79
+ export declare function writeTempFingerprintConfig(config: FingerprintConfigJson): Promise<string>;
80
+ /**
81
+ * Delete the temp config file after the browser has exited.
82
+ */
83
+ export declare function cleanupTempFingerprintConfig(filePath: string): Promise<void>;
84
+ //# sourceMappingURL=anti-detect-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anti-detect-config.d.ts","sourceRoot":"","sources":["../../src/browser-process/anti-detect-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAI3E,MAAM,WAAW,wBAAwB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,CAAC,CAAC;IACX,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,8DAA8D;QAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE;YACZ,MAAM,EAAE,wBAAwB,EAAE,CAAC;YACnC,MAAM,EAAE,OAAO,CAAC;YAChB,QAAQ,EAAE,MAAM,CAAC;YACjB,eAAe,EAAE,MAAM,CAAC;YACxB,YAAY,EAAE,MAAM,CAAC;YACrB,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC;YACd,aAAa,EAAE,MAAM,CAAC;YACtB,eAAe,EAAE,wBAAwB,EAAE,CAAC;SAC/C,CAAC;KACL,CAAC;IACF,KAAK,EAAE;QACH,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,MAAM,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,KAAK,CAAC,EAAE;QACJ,SAAS,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,KAAK,EAAE;QACH,MAAM,EAAE,OAAO,CAAC;QAChB,KAAK,EAAE,OAAO,CAAC;QACf,KAAK,EAAE,OAAO,CAAC;QACf,WAAW,EAAE,OAAO,CAAC;KACxB,CAAC;IACF,MAAM,EAAE;QACJ,0BAA0B,EAAE,MAAM,CAAC;KACtC,CAAC;IACF,MAAM,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;KACvB,CAAC;CACL;AAID;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACrC,WAAW,EAAE,6BAA6B,EAC1C,SAAS,CAAC,EAAE,MAAM,GACnB,qBAAqB,CAkHvB;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAM/F;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMlF"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * anti-detect-config.ts — Generate and manage FingerprintConfig JSON for the anti-detect browser
3
+ *
4
+ * Called by browser.ts before launching the browser when useNativeStealth is enabled.
5
+ * Translates the fingerprint-generator BrowserFingerprintWithHeaders output into
6
+ * the --fingerprint-config JSON schema consumed by the C++ FingerprintConfig class.
7
+ */
8
+ import fs from 'fs/promises';
9
+ import os from 'os';
10
+ import path from 'path';
11
+ import crypto from 'crypto';
12
+ // ─── Generation ───────────────────────────────────────────────────────────────
13
+ /**
14
+ * Generate a FingerprintConfig JSON object from fingerprint-generator output.
15
+ *
16
+ * @param fingerprint - BrowserFingerprintWithHeaders from fingerprint-generator
17
+ * @param sessionId - Session identifier used to derive the seed (proxy session ID, etc.)
18
+ */
19
+ export function generateFingerprintConfig(fingerprint, sessionId) {
20
+ const fp = fingerprint.fingerprint;
21
+ const headers = fingerprint.headers;
22
+ // Derive deterministic seed from session ID + UA
23
+ const seedSource = `${sessionId ?? ''}|${fp.navigator?.userAgent ?? ''}`;
24
+ const seedHash = crypto.createHash('sha256').update(seedSource).digest();
25
+ // Take first 8 bytes as a number (JavaScript number precision is sufficient for 53-bit ints)
26
+ const seed = seedHash.readUInt32BE(0) * 0x100000000 + seedHash.readUInt32BE(4);
27
+ // Navigator platform
28
+ // The CDP Network.setUserAgentOverride call uses UA-CH platform names
29
+ // ('Windows', 'macOS', 'Linux') rather than the legacy navigator.platform
30
+ // names ('Win32', 'MacIntel', 'Linux x86_64'). Workers bypass the CDP UA
31
+ // override and read from C++ directly, so the C++ FingerprintConfig must
32
+ // store the same value that CDP will set for the main frame — otherwise
33
+ // main frame and worker diverge, triggering hasMismatchPlatformWorker.
34
+ const navigatorPlatformRaw = fp.navigator?.platform ?? 'Win32';
35
+ const legacyToUaCH = {
36
+ 'Win32': 'Windows',
37
+ 'MacIntel': 'macOS',
38
+ 'Linux x86_64': 'Linux',
39
+ };
40
+ const platform = legacyToUaCH[navigatorPlatformRaw] ?? navigatorPlatformRaw;
41
+ // UA-CH brands from fingerprint
42
+ const uaData = fp.navigator?.userAgentData;
43
+ const brands = uaData?.brands ?? [];
44
+ const fullVersionList = uaData?.fullVersionList ?? brands;
45
+ const uaBrands = brands.map((b, i) => ({
46
+ brand: b.brand,
47
+ version: b.version,
48
+ full_version: fullVersionList[i]?.version ?? b.version,
49
+ }));
50
+ // WebGL from fingerprint
51
+ const videoCard = fp.videoCard;
52
+ const webglVendor = videoCard?.vendor ?? 'Google Inc. (NVIDIA)';
53
+ const webglRenderer = videoCard?.renderer
54
+ ?? 'ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Direct3D11 vs_5_0 ps_5_0, D3D11)';
55
+ // Screen
56
+ const screen = fp.screen;
57
+ // User agent from headers (most accurate source)
58
+ const userAgent = headers['user-agent']
59
+ ?? fp.navigator?.userAgent
60
+ ?? '';
61
+ // Accept-language from fingerprint headers (most accurate source)
62
+ const acceptLanguage = headers['accept-language']
63
+ ?? headers['Accept-Language'];
64
+ const config = {
65
+ version: 1,
66
+ seed,
67
+ navigator: {
68
+ platform,
69
+ ...(acceptLanguage && { languages: acceptLanguage }),
70
+ hardwareConcurrency: fp.navigator?.hardwareConcurrency ?? 8,
71
+ deviceMemory: fp.navigator?.deviceMemory ?? 8,
72
+ userAgent,
73
+ ...(uaBrands.length > 0 && {
74
+ userAgentData: {
75
+ brands: uaBrands,
76
+ mobile: uaData?.mobile ?? false,
77
+ platform: uaData?.platform ?? platformFromNavigatorPlatform(platform),
78
+ platformVersion: uaData?.platformVersion ?? '15.0.0',
79
+ architecture: uaData?.architecture ?? 'x86',
80
+ bitness: uaData?.bitness ?? '64',
81
+ model: uaData?.model ?? '',
82
+ uaFullVersion: uaData?.uaFullVersion ?? extractFullVersion(userAgent),
83
+ fullVersionList: uaBrands,
84
+ },
85
+ }),
86
+ },
87
+ webgl: {
88
+ vendor: webglVendor,
89
+ renderer: webglRenderer,
90
+ },
91
+ screen: {
92
+ width: screen?.width ?? 1920,
93
+ height: screen?.height ?? 1080,
94
+ availWidth: screen?.availWidth ?? screen?.width ?? 1920,
95
+ availHeight: screen?.availHeight ?? (screen?.height ? screen.height - 40 : 1040),
96
+ colorDepth: screen?.colorDepth ?? 24,
97
+ pixelRatio: screen?.devicePixelRatio ?? 1,
98
+ },
99
+ noise: {
100
+ canvas: true,
101
+ audio: true,
102
+ rects: true,
103
+ measureText: true,
104
+ },
105
+ timing: {
106
+ performanceNowResolutionMs: 1,
107
+ },
108
+ };
109
+ // WebGPU — from explicit webgpu field on fingerprint (non-Apify profiles), or
110
+ // derived from WebGL vendor as a fallback (Apify fingerprints have no webgpu data).
111
+ const webgpuData = fp.webgpu;
112
+ const derivedWebGPUVendor = webgpuData?.vendor ?? deriveWebGPUVendorFromWebGL(webglVendor);
113
+ if (derivedWebGPUVendor) {
114
+ config.webgpu = {
115
+ vendor: derivedWebGPUVendor,
116
+ architecture: webgpuData?.architecture ?? '',
117
+ device: webgpuData?.device ?? '',
118
+ description: webgpuData?.description ?? '',
119
+ };
120
+ }
121
+ return config;
122
+ }
123
+ /**
124
+ * Write the fingerprint config to a temp file and return the path.
125
+ * The caller is responsible for deleting the file after the browser exits.
126
+ */
127
+ export async function writeTempFingerprintConfig(config) {
128
+ const tmpDir = os.tmpdir();
129
+ const fileName = `fp-${Date.now()}-${Math.random().toString(36).slice(2)}.json`;
130
+ const filePath = path.join(tmpDir, fileName);
131
+ await fs.writeFile(filePath, JSON.stringify(config, null, 2), 'utf8');
132
+ return filePath;
133
+ }
134
+ /**
135
+ * Delete the temp config file after the browser has exited.
136
+ */
137
+ export async function cleanupTempFingerprintConfig(filePath) {
138
+ try {
139
+ await fs.unlink(filePath);
140
+ }
141
+ catch {
142
+ // Non-fatal — temp file will be cleaned by OS eventually
143
+ }
144
+ }
145
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
146
+ /** Map navigator.platform values to UA-CH platform strings */
147
+ function platformFromNavigatorPlatform(platform) {
148
+ if (platform.startsWith('Win'))
149
+ return 'Windows';
150
+ if (platform === 'MacIntel')
151
+ return 'macOS';
152
+ if (platform.includes('Linux'))
153
+ return 'Linux';
154
+ return 'Windows';
155
+ }
156
+ /** Extract full Chrome version string from User-Agent (e.g. "Chrome/136.0.7103.0") */
157
+ function extractFullVersion(userAgent) {
158
+ const match = userAgent.match(/Chrome\/(\d+\.\d+\.\d+\.\d+)/);
159
+ return match?.[1] ?? '136.0.0.0';
160
+ }
161
+ /**
162
+ * Derive a WebGPU vendor string from the WebGL unmasked vendor string.
163
+ * Used as a fallback when no explicit webgpu profile data is available (Apify fingerprints).
164
+ * e.g. "Google Inc. (NVIDIA)" → "nvidia"
165
+ */
166
+ function deriveWebGPUVendorFromWebGL(webglVendor) {
167
+ const v = webglVendor.toLowerCase();
168
+ if (v.includes('nvidia'))
169
+ return 'nvidia';
170
+ if (v.includes('amd') || v.includes('ati'))
171
+ return 'amd';
172
+ if (v.includes('intel'))
173
+ return 'intel';
174
+ if (v.includes('apple'))
175
+ return 'apple';
176
+ return '';
177
+ }
178
+ //# sourceMappingURL=anti-detect-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anti-detect-config.js","sourceRoot":"","sources":["../../src/browser-process/anti-detect-config.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { BrowserProcess } from './process.js';
2
+ import { type FingerprintConfigJson } from './anti-detect-config.js';
2
3
  /**
3
4
  * Humanization options for simulating realistic user behavior
4
5
  * All options are disabled by default for performance
@@ -20,6 +21,17 @@ export interface LaunchBrowserOptions {
20
21
  headless?: boolean;
21
22
  executablePath?: string;
22
23
  useExperimentalFingerprints?: boolean;
24
+ /**
25
+ * Use the native anti-detect browser (Cromite-based custom build) for
26
+ * fingerprint spoofing at the C++ level. When true and the anti-detect
27
+ * browser is installed (via postinstall.js), it will be used instead of
28
+ * system Chrome. JS-level overrides for C++-handled properties are skipped,
29
+ * reducing the injection bundle from ~150KB to ~40KB.
30
+ *
31
+ * Falls back silently to system Chrome if the anti-detect binary is not found.
32
+ * Default: false
33
+ */
34
+ useNativeStealth?: boolean;
23
35
  /** Whether to start the browser maximized and fullscreen. Default: true */
24
36
  maximizeWindow?: boolean;
25
37
  /** Enable all stealth arguments for anti-bot evasion. Default: true */
@@ -70,6 +82,13 @@ export interface LaunchBrowserOptions {
70
82
  /** Humanization options (all disabled by default) */
71
83
  humanization?: HumanizationOptions;
72
84
  };
85
+ /**
86
+ * Pre-generated FingerprintConfig JSON to pass via --fingerprint-config to the
87
+ * anti-detect browser. When provided, this overrides the static default_fingerprint.json
88
+ * so that each browser instance gets unique C++-level hardware fingerprints (GPU, screen,
89
+ * CPU count, device memory) derived from the real device profile.
90
+ */
91
+ fingerprintConfig?: FingerprintConfigJson;
73
92
  }
74
93
  export declare const launchBrowserWithNewProfile: (executablePath: string, options?: LaunchBrowserOptions) => Promise<BrowserProcess>;
75
94
  export declare const createTempUserDataDir: () => Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/browser-process/browser.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAoD9C;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAChC,yDAAyD;IACzD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,2EAA2E;IAC3E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uEAAuE;IACvE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,+DAA+D;IAC/D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kFAAkF;IAClF,aAAa,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC/C;;;OAGG;IACH,sBAAsB,CAAC,EAAE,SAAS,GAAG,+BAA+B,GAAG,uCAAuC,GAAG,yBAAyB,CAAC;IAC3I,kBAAkB,CAAC,EAAE;QACjB,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,2BAA2B,CAAC,EAAE,OAAO,CAAC;QACtC,sBAAsB,CAAC,EAAE,OAAO,CAAC;QACjC,QAAQ,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;QAEjD,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,2DAA2D;QAC3D,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QACnC,qDAAqD;QACrD,YAAY,CAAC,EAAE,mBAAmB,CAAC;KACtC,CAAC;CACL;AAED,eAAO,MAAM,2BAA2B,mBACpB,MAAM,YACb,oBAAoB,KAC9B,OAAO,CAAC,cAAc,CA6HxB,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAa,OAAO,CAAC,MAAM,CAwC5D,CAAC;AAEF,eAAO,MAAM,iCAAiC,aAAmB,oBAAoB,4BAKpF,CAAC"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/browser-process/browser.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9C,OAAO,EAA8B,KAAK,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAkDjG;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAChC,yDAAyD;IACzD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,2EAA2E;IAC3E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uEAAuE;IACvE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,+DAA+D;IAC/D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kFAAkF;IAClF,aAAa,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC/C;;;OAGG;IACH,sBAAsB,CAAC,EAAE,SAAS,GAAG,+BAA+B,GAAG,uCAAuC,GAAG,yBAAyB,CAAC;IAC3I,kBAAkB,CAAC,EAAE;QACjB,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,2BAA2B,CAAC,EAAE,OAAO,CAAC;QACtC,sBAAsB,CAAC,EAAE,OAAO,CAAC;QACjC,QAAQ,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;QAEjD,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,2DAA2D;QAC3D,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QACnC,qDAAqD;QACrD,YAAY,CAAC,EAAE,mBAAmB,CAAC;KACtC,CAAC;IACF;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,qBAAqB,CAAC;CAC7C;AAED,eAAO,MAAM,2BAA2B,mBACpB,MAAM,YACb,oBAAoB,KAC9B,OAAO,CAAC,cAAc,CA0LxB,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAa,OAAO,CAAC,MAAM,CAwC5D,CAAC;AAEF,eAAO,MAAM,iCAAiC,aAAmB,oBAAoB,4BA2BpF,CAAC"}
@@ -3,10 +3,12 @@ import fs from 'fs/promises';
3
3
  import os from 'os';
4
4
  import path from 'path';
5
5
  import { log } from '@crawlee/core';
6
- import { getChromeBinaryVersion, getChromeExecutablePath } from './get-chrome-executable.js';
6
+ import { getChromeBinaryVersion, getChromeExecutablePath, getAntiDetectBrowserPath } from './get-chrome-executable.js';
7
7
  import { BrowserProcess } from './process.js';
8
8
  import { populateChromeProfile } from '../browser-profiles/chrome/populate-profile.js';
9
9
  import { createChromeProfile } from '../browser-profiles/index.js';
10
+ import { isAntiDetectBrowserSync } from './anti-detect-browser.js';
11
+ import { writeTempFingerprintConfig } from './anti-detect-config.js';
10
12
  const EXTENSION_PATH = path.resolve(import.meta.dirname, '../fingerprinting/all-fingerprint-defender');
11
13
  const EXTENSION_PATH2 = path.resolve(import.meta.dirname, '../fingerprinting/anti-webgpu');
12
14
  /**
@@ -55,7 +57,17 @@ const STEALTH_ARGS = [
55
57
  '--enable-features=NetworkService,NetworkServiceInProcess',
56
58
  ];
57
59
  export const launchBrowserWithNewProfile = async (executablePath, options = {}) => {
58
- const { anonymizedProxyUrl, debuggingPort, windowWidth = 1920, windowHeight = 1080, ignoreHttpsErrors, headless, useExperimentalFingerprints = false, maximizeWindow = true, enableStealthMode = true, populateProfile: shouldPopulateProfile = true, userDataDir: providedUserDataDir, keepUserDataDir, dnsOverHttpsServer, secureDnsMode, webrtcIpHandlingPolicy, } = options;
60
+ const { anonymizedProxyUrl, debuggingPort, windowWidth = 1920, windowHeight = 1080, ignoreHttpsErrors, headless, useExperimentalFingerprints = false, maximizeWindow = true, enableStealthMode = true, populateProfile: shouldPopulateProfile = true, userDataDir: providedUserDataDir, keepUserDataDir, dnsOverHttpsServer, secureDnsMode, webrtcIpHandlingPolicy, useNativeStealth = false, } = options;
61
+ // Detect if we're running with the anti-detect browser binary
62
+ const usingAntiDetectBrowser = useNativeStealth && isAntiDetectBrowserSync(executablePath);
63
+ if (useNativeStealth && !usingAntiDetectBrowser) {
64
+ log.debug('[AntiDetect] useNativeStealth requested but anti-detect browser not detected — using standard Chrome');
65
+ }
66
+ else if (usingAntiDetectBrowser) {
67
+ log.debug('[AntiDetect] Anti-detect browser detected — native C++ stealth active');
68
+ }
69
+ // Track temp config file for cleanup
70
+ let fingerprintConfigPath = null;
59
71
  try {
60
72
  const userDataDir = providedUserDataDir
61
73
  ? path.resolve(providedUserDataDir)
@@ -118,6 +130,41 @@ export const launchBrowserWithNewProfile = async (executablePath, options = {})
118
130
  browserArgs.push(`--disable-extensions-except=${extList}`, // optional, keeps Chrome from loading the rest
119
131
  `--load-extension=${extList}`);
120
132
  }
133
+ // Anti-detect browser: write --fingerprint-config JSON and pass it to the browser.
134
+ // The C++ FingerprintConfig singleton reads this file at startup (lazy, first access).
135
+ if (usingAntiDetectBrowser) {
136
+ try {
137
+ // Prefer a pre-generated per-session config (passed by browser-plugin.ts) so that
138
+ // each browser instance gets unique C++-level hardware fingerprints (GPU, screen,
139
+ // CPU). Fall back to the static default_fingerprint.json if none was provided.
140
+ const configToWrite = options.fingerprintConfig ?? await (async () => {
141
+ const { default: def } = await import(
142
+ /* @vite-ignore */ new URL('../../browser/config/default_fingerprint.json', import.meta.url).href).catch(() => ({ default: null }));
143
+ return def;
144
+ })();
145
+ if (configToWrite) {
146
+ fingerprintConfigPath = await writeTempFingerprintConfig(configToWrite);
147
+ browserArgs.push(`--fingerprint-config=${fingerprintConfigPath}`);
148
+ // Sync Accept-Language HTTP header and Chrome locale with the spoofed
149
+ // navigator.languages. --fingerprint-accept-language is our custom C++ hook
150
+ // (net/url_request/url_request_http_job.cc). --lang overrides Chrome's UI
151
+ // locale and the system accept-language used before our hook fires.
152
+ const fpLangs = configToWrite.navigator?.languages;
153
+ if (fpLangs) {
154
+ // Convert "en-US,en;q=0.9" → "en-US,en" for --lang (no q-values)
155
+ const langForSwitch = fpLangs.split(',')
156
+ .map((l) => l.split(';')[0].trim())
157
+ .join(',');
158
+ browserArgs.push(`--fingerprint-accept-language=${fpLangs}`);
159
+ browserArgs.push(`--lang=${langForSwitch}`);
160
+ }
161
+ log.debug(`[AntiDetect] Wrote fingerprint config: ${fingerprintConfigPath}${options.fingerprintConfig ? ' (per-session)' : ' (static default)'}`);
162
+ }
163
+ }
164
+ catch (configErr) {
165
+ log.debug(`[AntiDetect] Could not write fingerprint config: ${configErr}`);
166
+ }
167
+ }
121
168
  if (anonymizedProxyUrl) {
122
169
  browserArgs.push(`--proxy-server=${anonymizedProxyUrl}`);
123
170
  }
@@ -139,7 +186,15 @@ export const launchBrowserWithNewProfile = async (executablePath, options = {})
139
186
  const browserProcess = spawn(executablePath, browserArgs, {
140
187
  stdio: 'ignore',
141
188
  });
142
- return new BrowserProcess(browserProcess, userDataDir, shouldCleanupUserDataDir);
189
+ const proc = new BrowserProcess(browserProcess, userDataDir, shouldCleanupUserDataDir);
190
+ // Clean up temp fingerprint config file when the browser process exits
191
+ if (fingerprintConfigPath) {
192
+ const configPath = fingerprintConfigPath;
193
+ browserProcess.once('exit', () => {
194
+ fs.unlink(configPath).catch(() => { });
195
+ });
196
+ }
197
+ return proc;
143
198
  }
144
199
  catch (error) {
145
200
  log.error(`Error launching the browser: ${error}`);
@@ -184,7 +239,31 @@ export const createTempUserDataDir = async () => {
184
239
  return userDataDir;
185
240
  };
186
241
  export const launchChromeBrowserWithNewProfile = async (options = {}) => {
187
- const executablePath = options.executablePath ? options.executablePath : getChromeExecutablePath();
242
+ let executablePath = options.executablePath;
243
+ if (!executablePath) {
244
+ // Also check fingerprintOptions.useNativeStealth (set by hard.test.ts / crawler launchOptions)
245
+ const wantsNativeStealth = options.useNativeStealth || options.fingerprintOptions?.useNativeStealth;
246
+ if (wantsNativeStealth) {
247
+ // Prefer anti-detect binary when native stealth is requested
248
+ const antiDetectPath = getAntiDetectBrowserPath();
249
+ if (antiDetectPath) {
250
+ log.debug(`[AntiDetect] Using anti-detect browser: ${antiDetectPath}`);
251
+ executablePath = antiDetectPath;
252
+ }
253
+ else {
254
+ log.debug('[AntiDetect] useNativeStealth=true but no anti-detect binary found. Run npm run build:browser or set ANTI_DETECT_CHROME_PATH. Falling back to system Chrome with JS injection.');
255
+ executablePath = getChromeExecutablePath();
256
+ // Reset useNativeStealth so the JS fingerprint pipeline is NOT skipped on regular Chrome
257
+ options.useNativeStealth = false;
258
+ if (options.fingerprintOptions) {
259
+ options.fingerprintOptions.useNativeStealth = false;
260
+ }
261
+ }
262
+ }
263
+ else {
264
+ executablePath = getChromeExecutablePath();
265
+ }
266
+ }
188
267
  return launchBrowserWithNewProfile(executablePath, options);
189
268
  };
190
269
  //# sourceMappingURL=browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/browser-process/browser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/browser-process/browser.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Returns the path to the installed anti-detect browser binary, or null if not available.
3
+ * Checks (in order):
4
+ * 1. ANTI_DETECT_CHROME_PATH environment variable
5
+ * 2. .browser/ directory populated by postinstall.js
6
+ */
7
+ export declare const getAntiDetectBrowserPath: () => string | null;
1
8
  export declare const getChromeExecutablePath: () => string;
2
9
  export declare const getChromeBinaryVersion: (executablePath: string) => string | null;
3
10
  //# sourceMappingURL=get-chrome-executable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-chrome-executable.d.ts","sourceRoot":"","sources":["../../src/browser-process/get-chrome-executable.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,uBAAuB,QAAO,MAsC1C,CAAC;AAEF,eAAO,MAAM,sBAAsB,mBAAoB,MAAM,KAAG,MAAM,GAAG,IAaxE,CAAC"}
1
+ {"version":3,"file":"get-chrome-executable.d.ts","sourceRoot":"","sources":["../../src/browser-process/get-chrome-executable.ts"],"names":[],"mappings":"AAmCA;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,QAAO,MAAM,GAAG,IAepD,CAAC;AAEF,eAAO,MAAM,uBAAuB,QAAO,MAsC1C,CAAC;AAEF,eAAO,MAAM,sBAAsB,mBAAoB,MAAM,KAAG,MAAM,GAAG,IAaxE,CAAC"}
@@ -2,6 +2,48 @@ import fs from 'fs';
2
2
  import os from 'os';
3
3
  import path from 'path';
4
4
  import { spawnSync } from 'child_process';
5
+ import { fileURLToPath } from 'url';
6
+ const _dirname = path.dirname(fileURLToPath(import.meta.url));
7
+ // Compiled output lives at dist/browser-process/ → 2 levels up = package root
8
+ const PKG_ROOT = path.resolve(_dirname, '../..');
9
+ /** Platform key */
10
+ const PLATFORM_KEY = `${process.platform}-${process.arch}`;
11
+ /** Primary: browser/dist/ — tracked in git and bundled in the npm package */
12
+ const BROWSER_DIST_DIR = path.join(PKG_ROOT, 'browser', 'dist');
13
+ /** Fallback: .browser/ — populated by postinstall download */
14
+ const BROWSER_INSTALL_DIR = path.join(PKG_ROOT, '.browser');
15
+ function buildPaths(base) {
16
+ return {
17
+ 'linux-x64': path.join(base, 'linux-x64', 'chrome'),
18
+ 'darwin-arm64': path.join(base, 'darwin-arm64', 'Chromium.app', 'Contents', 'MacOS', 'Chromium'),
19
+ 'darwin-x64': path.join(base, 'darwin-x64', 'Chromium.app', 'Contents', 'MacOS', 'Chromium'),
20
+ 'win32-x64': path.join(base, 'win32-x64', 'chrome.exe'),
21
+ };
22
+ }
23
+ const ANTI_DETECT_BINARY_PATHS = buildPaths(BROWSER_DIST_DIR);
24
+ const ANTI_DETECT_BINARY_PATHS_FALLBACK = buildPaths(BROWSER_INSTALL_DIR);
25
+ /**
26
+ * Returns the path to the installed anti-detect browser binary, or null if not available.
27
+ * Checks (in order):
28
+ * 1. ANTI_DETECT_CHROME_PATH environment variable
29
+ * 2. .browser/ directory populated by postinstall.js
30
+ */
31
+ export const getAntiDetectBrowserPath = () => {
32
+ if (process.env.ANTI_DETECT_CHROME_PATH) {
33
+ return process.env.ANTI_DETECT_CHROME_PATH;
34
+ }
35
+ // Primary: browser/dist/ (git-tracked, bundled in package)
36
+ const distPath = ANTI_DETECT_BINARY_PATHS[PLATFORM_KEY];
37
+ if (distPath && fs.existsSync(distPath)) {
38
+ return distPath;
39
+ }
40
+ // Fallback: .browser/ (postinstall download)
41
+ const installPath = ANTI_DETECT_BINARY_PATHS_FALLBACK[PLATFORM_KEY];
42
+ if (installPath && fs.existsSync(installPath)) {
43
+ return installPath;
44
+ }
45
+ return null;
46
+ };
5
47
  export const getChromeExecutablePath = () => {
6
48
  const platform = os.platform();
7
49
  if (platform === 'win32') {
@@ -1 +1 @@
1
- {"version":3,"file":"get-chrome-executable.js","sourceRoot":"","sources":["../../src/browser-process/get-chrome-executable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAW,EAAE;IAChD,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAE/B,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG;YACb,OAAO,CAAC,GAAG,CAAC,YAAY;YACxB,OAAO,CAAC,GAAG,CAAC,YAAY;YACxB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;SACnC,CAAC;QACF,MAAM,MAAM,GAAG,2CAA2C,CAAC;QAE3D,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC1C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzB,OAAO,OAAO,CAAC;YACnB,CAAC;QACL,CAAC;IACL,CAAC;SAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,8DAA8D,CAAC;QAC/E,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC;QACnB,CAAC;IACL,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG;YACV,wBAAwB;YACxB,+BAA+B;YAC/B,2BAA2B;YAC3B,mBAAmB;SACtB,CAAC;QACF,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzB,OAAO,OAAO,CAAC;YACnB,CAAC;QACL,CAAC;IACL,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;AACrF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,cAAsB,EAAiB,EAAE;IAC5E,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACnD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC,CAAC"}
1
+ {"version":3,"file":"get-chrome-executable.js","sourceRoot":"","sources":["../../src/browser-process/get-chrome-executable.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,7 @@
1
1
  export { launchBrowserWithNewProfile, createTempUserDataDir, launchChromeBrowserWithNewProfile } from "./browser.js";
2
- export { getChromeExecutablePath } from "./get-chrome-executable.js";
2
+ export { getChromeExecutablePath, getAntiDetectBrowserPath } from "./get-chrome-executable.js";
3
3
  export { BrowserProcess } from "./process.js";
4
+ export { isAntiDetectBrowser, isAntiDetectBrowserSync, shouldSkipJsOverride, NATIVE_STEALTH_SKIPS } from "./anti-detect-browser.js";
5
+ export { generateFingerprintConfig, writeTempFingerprintConfig, cleanupTempFingerprintConfig } from "./anti-detect-config.js";
6
+ export type { FingerprintConfigJson } from "./anti-detect-config.js";
4
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser-process/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,iCAAiC,EAAE,MAAM,cAAc,CAAA;AACpH,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser-process/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,iCAAiC,EAAE,MAAM,cAAc,CAAA;AACpH,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAA;AAC9F,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AACnI,OAAO,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAA;AAC7H,YAAY,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA"}
@@ -1,4 +1,6 @@
1
1
  export { launchBrowserWithNewProfile, createTempUserDataDir, launchChromeBrowserWithNewProfile } from "./browser.js";
2
- export { getChromeExecutablePath } from "./get-chrome-executable.js";
2
+ export { getChromeExecutablePath, getAntiDetectBrowserPath } from "./get-chrome-executable.js";
3
3
  export { BrowserProcess } from "./process.js";
4
+ export { isAntiDetectBrowser, isAntiDetectBrowserSync, shouldSkipJsOverride, NATIVE_STEALTH_SKIPS } from "./anti-detect-browser.js";
5
+ export { generateFingerprintConfig, writeTempFingerprintConfig, cleanupTempFingerprintConfig } from "./anti-detect-config.js";
4
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser-process/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,iCAAiC,EAAE,MAAM,cAAc,CAAA;AACpH,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser-process/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,iCAAiC,EAAE,MAAM,cAAc,CAAA;AACpH,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAA;AAC9F,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AACnI,OAAO,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAA"}
package/dist/crawler.d.ts CHANGED
@@ -69,6 +69,8 @@ interface LaunchOptions {
69
69
  humanization?: HumanizationOptions;
70
70
  /** Enable debug logging in browser console. Default: true for debugging */
71
71
  debug?: boolean;
72
+ /** Use real Chrome device profiles instead of Apify fingerprint-generator. Default: false */
73
+ useNonApifyFingerprints?: boolean;
72
74
  };
73
75
  }
74
76
  export interface CDPPluginOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"crawler.d.ts","sourceRoot":"","sources":["../src/crawler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"crawler.d.ts","sourceRoot":"","sources":["../src/crawler.ts"],"names":[],"mappings":"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"}