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.
- package/README.md +13 -0
- package/dist/browser-controller.d.ts.map +1 -1
- package/dist/browser-controller.js +52 -2
- package/dist/browser-controller.js.map +1 -1
- package/dist/browser-plugin.d.ts +31 -0
- package/dist/browser-plugin.d.ts.map +1 -1
- package/dist/browser-plugin.js +76 -1
- package/dist/browser-plugin.js.map +1 -1
- package/dist/browser-process/anti-detect-browser.d.ts +56 -0
- package/dist/browser-process/anti-detect-browser.d.ts.map +1 -0
- package/dist/browser-process/anti-detect-browser.js +134 -0
- package/dist/browser-process/anti-detect-browser.js.map +1 -0
- package/dist/browser-process/anti-detect-config.d.ts +84 -0
- package/dist/browser-process/anti-detect-config.d.ts.map +1 -0
- package/dist/browser-process/anti-detect-config.js +178 -0
- package/dist/browser-process/anti-detect-config.js.map +1 -0
- package/dist/browser-process/browser.d.ts +19 -0
- package/dist/browser-process/browser.d.ts.map +1 -1
- package/dist/browser-process/browser.js +83 -4
- package/dist/browser-process/browser.js.map +1 -1
- package/dist/browser-process/get-chrome-executable.d.ts +7 -0
- package/dist/browser-process/get-chrome-executable.d.ts.map +1 -1
- package/dist/browser-process/get-chrome-executable.js +42 -0
- package/dist/browser-process/get-chrome-executable.js.map +1 -1
- package/dist/browser-process/index.d.ts +4 -1
- package/dist/browser-process/index.d.ts.map +1 -1
- package/dist/browser-process/index.js +3 -1
- package/dist/browser-process/index.js.map +1 -1
- package/dist/crawler.d.ts +2 -0
- package/dist/crawler.d.ts.map +1 -1
- package/dist/crawler.js +5 -2
- package/dist/crawler.js.map +1 -1
- package/dist/fingerprinting/fingerprint-injector.d.ts +39 -0
- package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-injector.js +141 -50
- 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 +16 -0
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.js +3 -2
- package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js +18 -10
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts +1 -1
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/index.js +1 -1
- package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js +5 -8
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts +12 -1
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js +27 -22
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +86 -28
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +165 -33
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/storage-consistency.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/storage-consistency.js +10 -8
- package/dist/fingerprinting/fingerprint-overrides/storage-consistency.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/timing-consistency.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/timing-consistency.js +9 -7
- package/dist/fingerprinting/fingerprint-overrides/timing-consistency.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +6 -6
- package/dist/fingerprinting/fingerprint-overrides/utils.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/utils.js +44 -1
- package/dist/fingerprinting/fingerprint-overrides/utils.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +43 -1
- 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 +9 -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 +14 -3
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js.map +1 -1
- package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts +32 -0
- package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts.map +1 -0
- package/dist/fingerprinting/non-apify-fingerprint-generator.js +480 -0
- package/dist/fingerprinting/non-apify-fingerprint-generator.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +11 -2
- 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;
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;
|
|
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":"
|
|
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;
|
|
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;
|
|
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;
|
|
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 {
|
package/dist/crawler.d.ts.map
CHANGED
|
@@ -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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"}
|