jumpy-lion 0.1.6-beta.7 → 1.0.0-beta.0
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 +1 -607
- package/browser/fonts/macos-bundle/40-macos-aliases.conf +515 -0
- package/browser/fonts/macos-bundle/README.md +24 -0
- package/browser/fonts/macos-bundle/install.sh +83 -0
- package/dist/browser-controller.d.ts +47 -4
- package/dist/browser-controller.d.ts.map +1 -1
- package/dist/browser-controller.js +219 -278
- package/dist/browser-controller.js.map +1 -1
- package/dist/browser-plugin.d.ts +82 -110
- package/dist/browser-plugin.d.ts.map +1 -1
- package/dist/browser-plugin.js +376 -379
- package/dist/browser-plugin.js.map +1 -1
- package/dist/browser-process/align-fingerprint-config.d.ts +36 -0
- package/dist/browser-process/align-fingerprint-config.d.ts.map +1 -0
- package/dist/browser-process/align-fingerprint-config.js +74 -0
- package/dist/browser-process/align-fingerprint-config.js.map +1 -0
- package/dist/browser-process/anti-detect-browser.d.ts +2 -2
- package/dist/browser-process/anti-detect-browser.js +7 -7
- package/dist/browser-process/anti-detect-config.d.ts +131 -2
- package/dist/browser-process/anti-detect-config.d.ts.map +1 -1
- package/dist/browser-process/anti-detect-config.js +337 -127
- package/dist/browser-process/anti-detect-config.js.map +1 -1
- package/dist/browser-process/browser.d.ts +25 -92
- package/dist/browser-process/browser.d.ts.map +1 -1
- package/dist/browser-process/browser.js +429 -73
- package/dist/browser-process/browser.js.map +1 -1
- package/dist/browser-process/fingerprint-config.d.ts +146 -0
- package/dist/browser-process/fingerprint-config.d.ts.map +1 -0
- package/dist/browser-process/fingerprint-config.js +308 -0
- package/dist/browser-process/fingerprint-config.js.map +1 -0
- package/dist/browser-process/get-chrome-executable.d.ts +6 -0
- package/dist/browser-process/get-chrome-executable.d.ts.map +1 -1
- package/dist/browser-process/get-chrome-executable.js +79 -4
- package/dist/browser-process/get-chrome-executable.js.map +1 -1
- package/dist/browser-process/gpu-family-profiles.d.ts +58 -0
- package/dist/browser-process/gpu-family-profiles.d.ts.map +1 -0
- package/dist/browser-process/gpu-family-profiles.js +480 -0
- package/dist/browser-process/gpu-family-profiles.js.map +1 -0
- package/dist/browser-process/launch-options.d.ts +301 -0
- package/dist/browser-process/launch-options.d.ts.map +1 -0
- package/dist/browser-process/launch-options.js +2 -0
- package/dist/browser-process/launch-options.js.map +1 -0
- package/dist/browser-process/port-allocator.d.ts +64 -0
- package/dist/browser-process/port-allocator.d.ts.map +1 -0
- package/dist/browser-process/port-allocator.js +198 -0
- package/dist/browser-process/port-allocator.js.map +1 -0
- package/dist/browser-process/process.d.ts +85 -0
- package/dist/browser-process/process.d.ts.map +1 -1
- package/dist/browser-process/process.js +235 -19
- package/dist/browser-process/process.js.map +1 -1
- package/dist/browser-process/signal-cleanup.d.ts +40 -0
- package/dist/browser-process/signal-cleanup.d.ts.map +1 -0
- package/dist/browser-process/signal-cleanup.js +105 -0
- package/dist/browser-process/signal-cleanup.js.map +1 -0
- package/dist/browser-process/widevine-cdm.d.ts +144 -0
- package/dist/browser-process/widevine-cdm.d.ts.map +1 -0
- package/dist/browser-process/widevine-cdm.js +298 -0
- package/dist/browser-process/widevine-cdm.js.map +1 -0
- package/dist/browser-profiles/chrome/populate-profile.d.ts.map +1 -1
- package/dist/browser-profiles/chrome/populate-profile.js +21 -22
- package/dist/browser-profiles/chrome/populate-profile.js.map +1 -1
- package/dist/connection/cdp-reconnection.d.ts +50 -0
- package/dist/connection/cdp-reconnection.d.ts.map +1 -0
- package/dist/connection/cdp-reconnection.js +75 -0
- package/dist/connection/cdp-reconnection.js.map +1 -0
- package/dist/connection/page-session.d.ts +114 -0
- package/dist/connection/page-session.d.ts.map +1 -0
- package/dist/connection/page-session.js +237 -0
- package/dist/connection/page-session.js.map +1 -0
- package/dist/connection/session-client.d.ts +34 -0
- package/dist/connection/session-client.d.ts.map +1 -0
- package/dist/connection/session-client.js +129 -0
- package/dist/connection/session-client.js.map +1 -0
- package/dist/crawler.d.ts +9 -88
- package/dist/crawler.d.ts.map +1 -1
- package/dist/crawler.js +157 -8
- package/dist/crawler.js.map +1 -1
- package/dist/fingerprinting/fingerprint-injector.d.ts +24 -114
- package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-injector.js +305 -611
- package/dist/fingerprinting/fingerprint-injector.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts +1 -1
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js +16 -14
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts +6 -2
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/index.js +6 -2
- package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.d.ts +1 -1
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js +4 -4
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js +4 -4
- package/dist/fingerprinting/fingerprint-overrides/navigator-override.d.ts +18 -0
- package/dist/fingerprinting/fingerprint-overrides/navigator-override.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/navigator-override.js +136 -0
- package/dist/fingerprinting/fingerprint-overrides/navigator-override.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/override.d.ts +151 -0
- package/dist/fingerprinting/fingerprint-overrides/override.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/override.js +14 -0
- package/dist/fingerprinting/fingerprint-overrides/override.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +46 -15
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/registry.d.ts +43 -0
- package/dist/fingerprinting/fingerprint-overrides/registry.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/registry.js +342 -0
- package/dist/fingerprinting/fingerprint-overrides/registry.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/screen-override.d.ts +16 -0
- package/dist/fingerprinting/fingerprint-overrides/screen-override.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/screen-override.js +175 -0
- package/dist/fingerprinting/fingerprint-overrides/screen-override.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.d.ts +1 -1
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js +4 -4
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +75 -9
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts +1 -1
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +34 -20
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +25 -6
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +1 -1
- package/dist/fingerprinting/hardware-realism.d.ts +83 -0
- package/dist/fingerprinting/hardware-realism.d.ts.map +1 -0
- package/dist/fingerprinting/hardware-realism.js +156 -0
- package/dist/fingerprinting/hardware-realism.js.map +1 -0
- package/dist/fingerprinting/injection-planner.d.ts +133 -0
- package/dist/fingerprinting/injection-planner.d.ts.map +1 -0
- package/dist/fingerprinting/injection-planner.js +497 -0
- package/dist/fingerprinting/injection-planner.js.map +1 -0
- package/dist/fingerprinting/locale-resolver.d.ts +8 -1
- package/dist/fingerprinting/locale-resolver.d.ts.map +1 -1
- package/dist/fingerprinting/locale-resolver.js +26 -3
- package/dist/fingerprinting/locale-resolver.js.map +1 -1
- package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts +4 -4
- package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts.map +1 -1
- package/dist/fingerprinting/non-apify-fingerprint-generator.js +24 -58
- package/dist/fingerprinting/non-apify-fingerprint-generator.js.map +1 -1
- package/dist/fingerprinting/non-apify-profiles.json +10515 -8494
- package/dist/fingerprinting/os-consistency.d.ts +28 -0
- package/dist/fingerprinting/os-consistency.d.ts.map +1 -0
- package/dist/fingerprinting/os-consistency.js +45 -0
- package/dist/fingerprinting/os-consistency.js.map +1 -0
- package/dist/fingerprinting/profile-quality.d.ts +25 -0
- package/dist/fingerprinting/profile-quality.d.ts.map +1 -0
- package/dist/fingerprinting/profile-quality.js +310 -0
- package/dist/fingerprinting/profile-quality.js.map +1 -0
- package/dist/fingerprinting/profile-selector.d.ts +102 -0
- package/dist/fingerprinting/profile-selector.d.ts.map +1 -0
- package/dist/fingerprinting/profile-selector.js +168 -0
- package/dist/fingerprinting/profile-selector.js.map +1 -0
- package/dist/fingerprinting/ua-alignment.d.ts +83 -0
- package/dist/fingerprinting/ua-alignment.d.ts.map +1 -0
- package/dist/fingerprinting/ua-alignment.js +197 -0
- package/dist/fingerprinting/ua-alignment.js.map +1 -0
- package/dist/fingerprinting/ua-ch-brands.d.ts +88 -0
- package/dist/fingerprinting/ua-ch-brands.d.ts.map +1 -0
- package/dist/fingerprinting/ua-ch-brands.js +174 -0
- package/dist/fingerprinting/ua-ch-brands.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/input/dropdown-selector.d.ts +90 -0
- package/dist/input/dropdown-selector.d.ts.map +1 -0
- package/dist/input/dropdown-selector.js +394 -0
- package/dist/input/dropdown-selector.js.map +1 -0
- package/dist/input/element-target.d.ts +152 -0
- package/dist/input/element-target.d.ts.map +1 -0
- package/dist/input/element-target.js +461 -0
- package/dist/input/element-target.js.map +1 -0
- package/dist/input/input-emulator.d.ts +85 -0
- package/dist/input/input-emulator.d.ts.map +1 -0
- package/dist/input/input-emulator.js +325 -0
- package/dist/input/input-emulator.js.map +1 -0
- package/dist/input/input-transport.d.ts +60 -0
- package/dist/input/input-transport.d.ts.map +1 -0
- package/dist/input/input-transport.js +28 -0
- package/dist/input/input-transport.js.map +1 -0
- package/dist/input/recording-transport.d.ts +32 -0
- package/dist/input/recording-transport.d.ts.map +1 -0
- package/dist/input/recording-transport.js +43 -0
- package/dist/input/recording-transport.js.map +1 -0
- package/dist/keyboard-layout.d.ts +2 -2
- package/dist/keyboard-layout.js +2 -2
- package/dist/navigation/page-navigation.d.ts +67 -0
- package/dist/navigation/page-navigation.d.ts.map +1 -0
- package/dist/navigation/page-navigation.js +122 -0
- package/dist/navigation/page-navigation.js.map +1 -0
- package/dist/network/network-watch.d.ts +110 -0
- package/dist/network/network-watch.d.ts.map +1 -0
- package/dist/network/network-watch.js +223 -0
- package/dist/network/network-watch.js.map +1 -0
- package/dist/page.d.ts +118 -104
- package/dist/page.d.ts.map +1 -1
- package/dist/page.js +311 -1130
- package/dist/page.js.map +1 -1
- package/dist/session/inject-hook.d.ts +24 -0
- package/dist/session/inject-hook.d.ts.map +1 -0
- package/dist/session/inject-hook.js +80 -0
- package/dist/session/inject-hook.js.map +1 -0
- package/dist/session/save.d.ts +21 -0
- package/dist/session/save.d.ts.map +1 -0
- package/dist/session/save.js +163 -0
- package/dist/session/save.js.map +1 -0
- package/dist/session/tar-data-dir.d.ts +18 -0
- package/dist/session/tar-data-dir.d.ts.map +1 -0
- package/dist/session/tar-data-dir.js +105 -0
- package/dist/session/tar-data-dir.js.map +1 -0
- package/dist/session/types.d.ts +80 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +29 -0
- package/dist/session/types.js.map +1 -0
- package/dist/session-profile.d.ts +102 -0
- package/dist/session-profile.d.ts.map +1 -0
- package/dist/session-profile.js +163 -0
- package/dist/session-profile.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +17 -6
- package/scripts/postinstall.cjs +58 -0
- package/dist/fingerprinting/custom-fingerprint-injector.d.ts +0 -87
- package/dist/fingerprinting/custom-fingerprint-injector.d.ts.map +0 -1
- package/dist/fingerprinting/custom-fingerprint-injector.js +0 -342
- package/dist/fingerprinting/custom-fingerprint-injector.js.map +0 -1
- package/dist/launcher-wrap.d.ts +0 -10
- package/dist/launcher-wrap.d.ts.map +0 -1
- package/dist/launcher-wrap.js +0 -11
- package/dist/launcher-wrap.js.map +0 -1
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "jumpy-lion",
|
|
3
3
|
"description": "",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "1.0.0-beta.0",
|
|
6
6
|
"engines": {
|
|
7
7
|
"node": ">=20.0.0"
|
|
8
8
|
},
|
|
@@ -22,12 +22,14 @@
|
|
|
22
22
|
},
|
|
23
23
|
"files": [
|
|
24
24
|
"dist",
|
|
25
|
-
"scripts/postinstall.cjs"
|
|
25
|
+
"scripts/postinstall.cjs",
|
|
26
|
+
"browser/fonts/macos-bundle"
|
|
26
27
|
],
|
|
27
28
|
"license": "Apache-2.0",
|
|
28
29
|
"scripts": {
|
|
29
30
|
"clean": "rimraf ./dist",
|
|
30
|
-
"prepublishOnly": "npm run build",
|
|
31
|
+
"prepublishOnly": "node scripts/swap-readmes.cjs swap && npm run build && node scripts/check-browser-released.cjs",
|
|
32
|
+
"postpublish": "node scripts/swap-readmes.cjs restore",
|
|
31
33
|
"compile": "tsc -p tsconfig.build.json",
|
|
32
34
|
"copy-extension": "cp -r src/fingerprinting/all-fingerprint-defender dist/fingerprinting/ && cp -r src/fingerprinting/anti-webgpu dist/fingerprinting/ && cp src/fingerprinting/non-apify-profiles.json dist/fingerprinting/",
|
|
33
35
|
"build": "npm run clean && npm run compile && npm run copy-extension",
|
|
@@ -41,8 +43,15 @@
|
|
|
41
43
|
"postinstall": "node scripts/postinstall.cjs",
|
|
42
44
|
"ci:build": "turbo run build --cache-dir=\".turbo\"",
|
|
43
45
|
"test:unit": "vitest run unit",
|
|
44
|
-
"test": "
|
|
45
|
-
"test:e2e": "
|
|
46
|
+
"test": "npm run test:unit && npm run test:e2e",
|
|
47
|
+
"test:e2e": "vitest run --config vitest.e2e.config.ts",
|
|
48
|
+
"test:e2e:ci": "vitest run --config vitest.e2e.ci.config.ts",
|
|
49
|
+
"capture:baseline": "node scripts/capture-baseline.mjs",
|
|
50
|
+
"test:docker:linux": "bash test/docker-linux/run.sh",
|
|
51
|
+
"test:docker:linux:diagnose": "bash test/docker-linux/run.sh --diagnose",
|
|
52
|
+
"test:protections": "vitest run --config vitest.protections.config.ts",
|
|
53
|
+
"test:protections:js": "STEALTH_ENGINE=js vitest run --config vitest.protections.config.ts",
|
|
54
|
+
"test:protections:linux": "bash test/docker-linux/run.sh protections",
|
|
46
55
|
"test:full": "cross-env vitest run --silent",
|
|
47
56
|
"coverage": "vitest --coverage",
|
|
48
57
|
"lint": "eslint src/**/*.ts test/**/*.ts",
|
|
@@ -57,6 +66,7 @@
|
|
|
57
66
|
"@types/chrome-remote-interface": "^0.31.14",
|
|
58
67
|
"@types/is-ci": "^3.0.4",
|
|
59
68
|
"@types/ps-tree": "^1.1.6",
|
|
69
|
+
"@types/tar": "^6.1.13",
|
|
60
70
|
"@typescript-eslint/eslint-plugin": "^7.15.0",
|
|
61
71
|
"@typescript-eslint/parser": "^7.15.0",
|
|
62
72
|
"@vitest/coverage-istanbul": "^2.1.1",
|
|
@@ -85,6 +95,7 @@
|
|
|
85
95
|
"fingerprint-generator": "^2.1.82",
|
|
86
96
|
"header-generator": "^2.1.82",
|
|
87
97
|
"proxy-chain": "^2.5.3",
|
|
88
|
-
"ps-tree": "^1.2.0"
|
|
98
|
+
"ps-tree": "^1.2.0",
|
|
99
|
+
"tar": "^7.5.15"
|
|
89
100
|
}
|
|
90
101
|
}
|
package/scripts/postinstall.cjs
CHANGED
|
@@ -111,6 +111,10 @@ async function main() {
|
|
|
111
111
|
setExecutablePermissions(INSTALL_DIR, platformKey);
|
|
112
112
|
}
|
|
113
113
|
|
|
114
|
+
if (process.platform === 'darwin') {
|
|
115
|
+
warmMacGatekeeper(INSTALL_DIR, platformKey);
|
|
116
|
+
}
|
|
117
|
+
|
|
114
118
|
fs.writeFileSync(versionFile, PKG_VERSION);
|
|
115
119
|
console.log(`[cdp-crawler] Anti-detect browser v${PKG_VERSION} installed successfully.`);
|
|
116
120
|
|
|
@@ -233,6 +237,60 @@ function setExecutablePermissions(installDir, platformKey) {
|
|
|
233
237
|
}
|
|
234
238
|
}
|
|
235
239
|
|
|
240
|
+
/**
|
|
241
|
+
* Mitigate macOS first-launch latency on the patched Chromium.
|
|
242
|
+
*
|
|
243
|
+
* The bundle is ad-hoc signed (no Developer ID), and `tar -xzf` on Sequoia+
|
|
244
|
+
* leaves `com.apple.provenance` on every file (a userspace-protected xattr
|
|
245
|
+
* that we cannot strip). Without intervention, the FIRST execution triggers
|
|
246
|
+
* a full Gatekeeper scan + XProtect check across the ~360 MB bundle, adding
|
|
247
|
+
* many seconds of latency to the user's first crawl.
|
|
248
|
+
*
|
|
249
|
+
* Two-step mitigation, both at install time so the cost lands on `npm install`
|
|
250
|
+
* (where waiting is expected) instead of the first `crawler.run()`:
|
|
251
|
+
*
|
|
252
|
+
* 1. Strip `com.apple.quarantine` if present (this one IS removable —
|
|
253
|
+
* sets perms first because Chromium ships some files read-only).
|
|
254
|
+
* 2. Spawn `Chromium --version` once with a hard timeout, which forces
|
|
255
|
+
* Gatekeeper / XProtect to do their assessment work NOW. macOS caches
|
|
256
|
+
* the verdict, so subsequent launches skip the scan.
|
|
257
|
+
*
|
|
258
|
+
* Re-signing with `codesign --force --deep --sign -` would also work but
|
|
259
|
+
* needs Xcode CLT installed; the pre-warm approach has no extra dependencies.
|
|
260
|
+
*/
|
|
261
|
+
function warmMacGatekeeper(installDir, platformKey) {
|
|
262
|
+
const bundleDirs = {
|
|
263
|
+
'darwin-arm64': path.join(installDir, 'darwin-arm64', 'Chromium.app'),
|
|
264
|
+
'darwin-x64': path.join(installDir, 'darwin-x64', 'Chromium.app'),
|
|
265
|
+
};
|
|
266
|
+
const bundle = bundleDirs[platformKey];
|
|
267
|
+
if (!bundle || !fs.existsSync(bundle)) return;
|
|
268
|
+
|
|
269
|
+
// Step 1: strip the (removable) quarantine bit. Chromium ships some files
|
|
270
|
+
// read-only so chmod first to avoid xattr permission errors.
|
|
271
|
+
spawnSync('chmod', ['-R', 'u+w', bundle], { stdio: 'ignore' });
|
|
272
|
+
spawnSync('xattr', ['-dr', 'com.apple.quarantine', bundle], { stdio: 'ignore' });
|
|
273
|
+
|
|
274
|
+
// Step 2: pre-warm Gatekeeper. `--version` exits quickly without opening a
|
|
275
|
+
// window, but macOS still does the full XProtect scan on first run. We give
|
|
276
|
+
// it 60s — slow Macs with cold caches can take a while on the initial scan;
|
|
277
|
+
// anything beyond that is a stuck process and we should give up.
|
|
278
|
+
const exe = path.join(bundle, 'Contents', 'MacOS', 'Chromium');
|
|
279
|
+
if (!fs.existsSync(exe)) return;
|
|
280
|
+
|
|
281
|
+
process.stdout.write('[cdp-crawler] Pre-warming macOS Gatekeeper (one-time, ~10s)... ');
|
|
282
|
+
const start = Date.now();
|
|
283
|
+
const r = spawnSync(exe, ['--version'], { stdio: 'ignore', timeout: 60_000 });
|
|
284
|
+
const elapsed = ((Date.now() - start) / 1000).toFixed(1);
|
|
285
|
+
if (r.status === 0) {
|
|
286
|
+
process.stdout.write(`done in ${elapsed}s.\n`);
|
|
287
|
+
console.log('[cdp-crawler] First crawl will now launch at normal speed.');
|
|
288
|
+
} else {
|
|
289
|
+
process.stdout.write(`skipped (exit ${r.status}, ${elapsed}s).\n`);
|
|
290
|
+
console.log('[cdp-crawler] First crawl may be slow as macOS does its initial Gatekeeper scan.');
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
236
294
|
// ─── Entry ────────────────────────────────────────────────────────────────────
|
|
237
295
|
|
|
238
296
|
main().catch((err) => {
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Custom Fingerprint Injection Module
|
|
3
|
-
*
|
|
4
|
-
* Replaces the fingerprint-injector library with custom logic that:
|
|
5
|
-
* - Generates injection scripts for all fingerprint properties
|
|
6
|
-
* - Logs successful property overrides
|
|
7
|
-
* - Throws/logs errors instead of silently failing
|
|
8
|
-
* - Uses puppeteer-stealth-style property guards
|
|
9
|
-
*/
|
|
10
|
-
interface BrowserFingerprint {
|
|
11
|
-
navigator?: {
|
|
12
|
-
userAgent?: string;
|
|
13
|
-
platform?: string;
|
|
14
|
-
vendor?: string;
|
|
15
|
-
vendorSub?: string;
|
|
16
|
-
productSub?: string;
|
|
17
|
-
language?: string;
|
|
18
|
-
languages?: string[];
|
|
19
|
-
hardwareConcurrency?: number;
|
|
20
|
-
deviceMemory?: number;
|
|
21
|
-
maxTouchPoints?: number;
|
|
22
|
-
oscpu?: string;
|
|
23
|
-
appVersion?: string;
|
|
24
|
-
appName?: string;
|
|
25
|
-
appCodeName?: string;
|
|
26
|
-
product?: string;
|
|
27
|
-
pdfViewerEnabled?: boolean;
|
|
28
|
-
cookieEnabled?: boolean;
|
|
29
|
-
onLine?: boolean;
|
|
30
|
-
doNotTrack?: string | null;
|
|
31
|
-
};
|
|
32
|
-
screen?: {
|
|
33
|
-
width?: number;
|
|
34
|
-
height?: number;
|
|
35
|
-
availWidth?: number;
|
|
36
|
-
availHeight?: number;
|
|
37
|
-
colorDepth?: number;
|
|
38
|
-
pixelDepth?: number;
|
|
39
|
-
availLeft?: number;
|
|
40
|
-
availTop?: number;
|
|
41
|
-
devicePixelRatio?: number;
|
|
42
|
-
pageXOffset?: number;
|
|
43
|
-
pageYOffset?: number;
|
|
44
|
-
};
|
|
45
|
-
videoCard?: {
|
|
46
|
-
vendor?: string;
|
|
47
|
-
renderer?: string;
|
|
48
|
-
};
|
|
49
|
-
battery?: {
|
|
50
|
-
charging?: boolean;
|
|
51
|
-
chargingTime?: number;
|
|
52
|
-
dischargingTime?: number;
|
|
53
|
-
level?: number;
|
|
54
|
-
};
|
|
55
|
-
audioContext?: {
|
|
56
|
-
sampleRate?: number;
|
|
57
|
-
numberOfChannels?: number;
|
|
58
|
-
maxChannelCount?: number;
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Creates a script that overrides all navigator properties
|
|
63
|
-
*/
|
|
64
|
-
export declare function createNavigatorOverrideScript(fingerprint: BrowserFingerprint): string;
|
|
65
|
-
/**
|
|
66
|
-
* Creates a script that overrides all screen properties
|
|
67
|
-
*/
|
|
68
|
-
export declare function createScreenOverrideScript(fingerprint: BrowserFingerprint): string;
|
|
69
|
-
/**
|
|
70
|
-
* Creates a script that overrides window-level properties
|
|
71
|
-
*/
|
|
72
|
-
export declare function createWindowOverrideScript(fingerprint: BrowserFingerprint): string;
|
|
73
|
-
/**
|
|
74
|
-
* Creates a comprehensive fingerprint injection script
|
|
75
|
-
*/
|
|
76
|
-
export declare function createComprehensiveFingerprintScript(fingerprint: BrowserFingerprint): string;
|
|
77
|
-
export interface CustomFingerprintOptions {
|
|
78
|
-
debug?: boolean;
|
|
79
|
-
throwOnError?: boolean;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Main function to inject custom fingerprint
|
|
83
|
-
* This replaces the fingerprint-injector library's injectable script
|
|
84
|
-
*/
|
|
85
|
-
export declare function createCustomFingerprintInjection(fingerprint: BrowserFingerprint, _options?: CustomFingerprintOptions): string[];
|
|
86
|
-
export {};
|
|
87
|
-
//# sourceMappingURL=custom-fingerprint-injector.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"custom-fingerprint-injector.d.ts","sourceRoot":"","sources":["../../src/fingerprinting/custom-fingerprint-injector.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,UAAU,kBAAkB;IACxB,SAAS,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B,CAAC;IACF,MAAM,CAAC,EAAE;QACL,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,SAAS,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,OAAO,CAAC,EAAE;QACN,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,YAAY,CAAC,EAAE;QACX,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;CACL;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,kBAAkB,GAAG,MAAM,CAqGrF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,kBAAkB,GAAG,MAAM,CA0FlF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,kBAAkB,GAAG,MAAM,CAwElF;AAED;;GAEG;AACH,wBAAgB,oCAAoC,CAAC,WAAW,EAAE,kBAAkB,GAAG,MAAM,CAyB5F;AAED,MAAM,WAAW,wBAAwB;IACrC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAC5C,WAAW,EAAE,kBAAkB,EAC/B,QAAQ,GAAE,wBAA6B,GACxC,MAAM,EAAE,CAiCV"}
|
|
@@ -1,342 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Custom Fingerprint Injection Module
|
|
3
|
-
*
|
|
4
|
-
* Replaces the fingerprint-injector library with custom logic that:
|
|
5
|
-
* - Generates injection scripts for all fingerprint properties
|
|
6
|
-
* - Logs successful property overrides
|
|
7
|
-
* - Throws/logs errors instead of silently failing
|
|
8
|
-
* - Uses puppeteer-stealth-style property guards
|
|
9
|
-
*/
|
|
10
|
-
import { log } from 'crawlee';
|
|
11
|
-
/**
|
|
12
|
-
* Creates a script that overrides all navigator properties
|
|
13
|
-
*/
|
|
14
|
-
export function createNavigatorOverrideScript(fingerprint) {
|
|
15
|
-
const nav = fingerprint.navigator || {};
|
|
16
|
-
return `
|
|
17
|
-
(() => {
|
|
18
|
-
'use strict';
|
|
19
|
-
|
|
20
|
-
const DEBUG_PREFIX = '[CDP-FP-DEBUG]';
|
|
21
|
-
const ERROR_PREFIX = '[CDP-FP-ERROR]';
|
|
22
|
-
|
|
23
|
-
console.log(DEBUG_PREFIX, 'Starting navigator property overrides...');
|
|
24
|
-
|
|
25
|
-
// Get stealth utilities
|
|
26
|
-
const utils = (typeof __stealth !== 'undefined' && __stealth.utils) || {
|
|
27
|
-
overrideGetterWithNative: (obj, prop, getter) => {
|
|
28
|
-
try {
|
|
29
|
-
const existing = Object.getOwnPropertyDescriptor(obj, prop);
|
|
30
|
-
if (existing && existing.configurable === false) {
|
|
31
|
-
console.warn(DEBUG_PREFIX, \`Property navigator.\${prop} is frozen, attempting fallback\`);
|
|
32
|
-
return false;
|
|
33
|
-
}
|
|
34
|
-
Object.defineProperty(obj, prop, {
|
|
35
|
-
get: getter,
|
|
36
|
-
configurable: true,
|
|
37
|
-
enumerable: true
|
|
38
|
-
});
|
|
39
|
-
return true;
|
|
40
|
-
} catch (e) {
|
|
41
|
-
console.error(ERROR_PREFIX, \`Failed to override navigator.\${prop}:\`, e);
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
const overrideNavigatorProperty = (prop, value) => {
|
|
48
|
-
try {
|
|
49
|
-
const success = utils.overrideGetterWithNative(
|
|
50
|
-
navigator,
|
|
51
|
-
prop,
|
|
52
|
-
() => value
|
|
53
|
-
);
|
|
54
|
-
if (success) {
|
|
55
|
-
console.log(DEBUG_PREFIX, \`✓ Overridden navigator.\${prop} to:\`, value);
|
|
56
|
-
} else {
|
|
57
|
-
console.warn(DEBUG_PREFIX, \`⚠ Could not override navigator.\${prop} (frozen property)\`);
|
|
58
|
-
}
|
|
59
|
-
return success;
|
|
60
|
-
} catch (error) {
|
|
61
|
-
console.error(ERROR_PREFIX, \`Exception overriding navigator.\${prop}:\`, error);
|
|
62
|
-
throw error;
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
// Override navigator properties
|
|
67
|
-
const overrides = {
|
|
68
|
-
${nav.userAgent ? `userAgent: ${JSON.stringify(nav.userAgent)},` : ''}
|
|
69
|
-
${nav.platform ? `platform: ${JSON.stringify(nav.platform)},` : ''}
|
|
70
|
-
${nav.vendor ? `vendor: ${JSON.stringify(nav.vendor)},` : ''}
|
|
71
|
-
${nav.vendorSub ? `vendorSub: ${JSON.stringify(nav.vendorSub)},` : ''}
|
|
72
|
-
${nav.productSub ? `productSub: ${JSON.stringify(nav.productSub)},` : ''}
|
|
73
|
-
${nav.language ? `language: ${JSON.stringify(nav.language)},` : ''}
|
|
74
|
-
${nav.languages ? `languages: ${JSON.stringify(nav.languages)},` : ''}
|
|
75
|
-
${nav.hardwareConcurrency ? `hardwareConcurrency: ${nav.hardwareConcurrency},` : ''}
|
|
76
|
-
${nav.deviceMemory ? `deviceMemory: ${nav.deviceMemory},` : ''}
|
|
77
|
-
${nav.maxTouchPoints !== undefined ? `maxTouchPoints: ${nav.maxTouchPoints},` : ''}
|
|
78
|
-
${nav.oscpu ? `oscpu: ${JSON.stringify(nav.oscpu)},` : ''}
|
|
79
|
-
${nav.appVersion ? `appVersion: ${JSON.stringify(nav.appVersion)},` : ''}
|
|
80
|
-
${nav.appName ? `appName: ${JSON.stringify(nav.appName)},` : ''}
|
|
81
|
-
${nav.appCodeName ? `appCodeName: ${JSON.stringify(nav.appCodeName)},` : ''}
|
|
82
|
-
${nav.product ? `product: ${JSON.stringify(nav.product)},` : ''}
|
|
83
|
-
${nav.pdfViewerEnabled !== undefined ? `pdfViewerEnabled: ${nav.pdfViewerEnabled},` : ''}
|
|
84
|
-
${nav.cookieEnabled !== undefined ? `cookieEnabled: ${nav.cookieEnabled},` : ''}
|
|
85
|
-
${nav.onLine !== undefined ? `onLine: ${nav.onLine},` : ''}
|
|
86
|
-
${nav.doNotTrack !== undefined ? `doNotTrack: ${nav.doNotTrack === null ? 'null' : JSON.stringify(nav.doNotTrack)},` : ''}
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
let successCount = 0;
|
|
90
|
-
let failureCount = 0;
|
|
91
|
-
|
|
92
|
-
for (const [prop, value] of Object.entries(overrides)) {
|
|
93
|
-
if (overrideNavigatorProperty(prop, value)) {
|
|
94
|
-
successCount++;
|
|
95
|
-
} else {
|
|
96
|
-
failureCount++;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
console.log(DEBUG_PREFIX, \`Navigator overrides complete: \${successCount} succeeded, \${failureCount} failed\`);
|
|
101
|
-
|
|
102
|
-
// Verify overrides
|
|
103
|
-
console.log(DEBUG_PREFIX, 'Verifying navigator overrides...');
|
|
104
|
-
for (const [prop, expectedValue] of Object.entries(overrides)) {
|
|
105
|
-
const actualValue = navigator[prop];
|
|
106
|
-
if (JSON.stringify(actualValue) === JSON.stringify(expectedValue)) {
|
|
107
|
-
console.log(DEBUG_PREFIX, \`✓ Verified navigator.\${prop}\`);
|
|
108
|
-
} else {
|
|
109
|
-
console.warn(DEBUG_PREFIX, \`⚠ Mismatch for navigator.\${prop}: expected\`, expectedValue, 'got', actualValue);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
})();
|
|
113
|
-
`;
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Creates a script that overrides all screen properties
|
|
117
|
-
*/
|
|
118
|
-
export function createScreenOverrideScript(fingerprint) {
|
|
119
|
-
const scr = fingerprint.screen || {};
|
|
120
|
-
return `
|
|
121
|
-
(() => {
|
|
122
|
-
'use strict';
|
|
123
|
-
|
|
124
|
-
const DEBUG_PREFIX = '[CDP-FP-DEBUG]';
|
|
125
|
-
const ERROR_PREFIX = '[CDP-FP-ERROR]';
|
|
126
|
-
|
|
127
|
-
console.log(DEBUG_PREFIX, 'Starting screen property overrides...');
|
|
128
|
-
|
|
129
|
-
// Get stealth utilities
|
|
130
|
-
const utils = (typeof __stealth !== 'undefined' && __stealth.utils) || {
|
|
131
|
-
overrideGetterWithNative: (obj, prop, getter) => {
|
|
132
|
-
try {
|
|
133
|
-
const existing = Object.getOwnPropertyDescriptor(obj, prop);
|
|
134
|
-
if (existing && existing.configurable === false) {
|
|
135
|
-
console.warn(DEBUG_PREFIX, \`Property screen.\${prop} is frozen, attempting fallback\`);
|
|
136
|
-
return false;
|
|
137
|
-
}
|
|
138
|
-
Object.defineProperty(obj, prop, {
|
|
139
|
-
get: getter,
|
|
140
|
-
configurable: true,
|
|
141
|
-
enumerable: true
|
|
142
|
-
});
|
|
143
|
-
return true;
|
|
144
|
-
} catch (e) {
|
|
145
|
-
console.error(ERROR_PREFIX, \`Failed to override screen.\${prop}:\`, e);
|
|
146
|
-
return false;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
const overrideScreenProperty = (prop, value) => {
|
|
152
|
-
try {
|
|
153
|
-
const success = utils.overrideGetterWithNative(
|
|
154
|
-
screen,
|
|
155
|
-
prop,
|
|
156
|
-
() => value
|
|
157
|
-
);
|
|
158
|
-
if (success) {
|
|
159
|
-
console.log(DEBUG_PREFIX, \`✓ Overridden screen.\${prop} to:\`, value);
|
|
160
|
-
} else {
|
|
161
|
-
console.warn(DEBUG_PREFIX, \`⚠ Could not override screen.\${prop} (frozen property)\`);
|
|
162
|
-
}
|
|
163
|
-
return success;
|
|
164
|
-
} catch (error) {
|
|
165
|
-
console.error(ERROR_PREFIX, \`Exception overriding screen.\${prop}:\`, error);
|
|
166
|
-
throw error;
|
|
167
|
-
}
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
// Override screen properties
|
|
171
|
-
const overrides = {
|
|
172
|
-
${scr.width ? `width: ${scr.width},` : ''}
|
|
173
|
-
${scr.height ? `height: ${scr.height},` : ''}
|
|
174
|
-
${scr.availWidth ? `availWidth: ${scr.availWidth},` : ''}
|
|
175
|
-
${scr.availHeight ? `availHeight: ${scr.availHeight},` : ''}
|
|
176
|
-
${scr.colorDepth ? `colorDepth: ${scr.colorDepth},` : ''}
|
|
177
|
-
${scr.pixelDepth ? `pixelDepth: ${scr.pixelDepth},` : ''}
|
|
178
|
-
${scr.availLeft !== undefined ? `availLeft: ${scr.availLeft},` : ''}
|
|
179
|
-
${scr.availTop !== undefined ? `availTop: ${scr.availTop},` : ''}
|
|
180
|
-
};
|
|
181
|
-
|
|
182
|
-
let successCount = 0;
|
|
183
|
-
let failureCount = 0;
|
|
184
|
-
|
|
185
|
-
for (const [prop, value] of Object.entries(overrides)) {
|
|
186
|
-
if (overrideScreenProperty(prop, value)) {
|
|
187
|
-
successCount++;
|
|
188
|
-
} else {
|
|
189
|
-
failureCount++;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
console.log(DEBUG_PREFIX, \`Screen overrides complete: \${successCount} succeeded, \${failureCount} failed\`);
|
|
194
|
-
|
|
195
|
-
// Verify overrides
|
|
196
|
-
console.log(DEBUG_PREFIX, 'Verifying screen overrides...');
|
|
197
|
-
for (const [prop, expectedValue] of Object.entries(overrides)) {
|
|
198
|
-
const actualValue = screen[prop];
|
|
199
|
-
if (actualValue === expectedValue) {
|
|
200
|
-
console.log(DEBUG_PREFIX, \`✓ Verified screen.\${prop}\`);
|
|
201
|
-
} else {
|
|
202
|
-
console.warn(DEBUG_PREFIX, \`⚠ Mismatch for screen.\${prop}: expected\`, expectedValue, 'got', actualValue);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
})();
|
|
206
|
-
`;
|
|
207
|
-
}
|
|
208
|
-
/**
|
|
209
|
-
* Creates a script that overrides window-level properties
|
|
210
|
-
*/
|
|
211
|
-
export function createWindowOverrideScript(fingerprint) {
|
|
212
|
-
const scr = fingerprint.screen || {};
|
|
213
|
-
return `
|
|
214
|
-
(() => {
|
|
215
|
-
'use strict';
|
|
216
|
-
|
|
217
|
-
const DEBUG_PREFIX = '[CDP-FP-DEBUG]';
|
|
218
|
-
const ERROR_PREFIX = '[CDP-FP-ERROR]';
|
|
219
|
-
|
|
220
|
-
console.log(DEBUG_PREFIX, 'Starting window property overrides...');
|
|
221
|
-
|
|
222
|
-
// Get stealth utilities
|
|
223
|
-
const utils = (typeof __stealth !== 'undefined' && __stealth.utils) || {
|
|
224
|
-
overrideGetterWithNative: (obj, prop, getter) => {
|
|
225
|
-
try {
|
|
226
|
-
const existing = Object.getOwnPropertyDescriptor(obj, prop);
|
|
227
|
-
if (existing && existing.configurable === false) {
|
|
228
|
-
console.warn(DEBUG_PREFIX, \`Property window.\${prop} is frozen, attempting fallback\`);
|
|
229
|
-
return false;
|
|
230
|
-
}
|
|
231
|
-
Object.defineProperty(obj, prop, {
|
|
232
|
-
get: getter,
|
|
233
|
-
configurable: true,
|
|
234
|
-
enumerable: true
|
|
235
|
-
});
|
|
236
|
-
return true;
|
|
237
|
-
} catch (e) {
|
|
238
|
-
console.error(ERROR_PREFIX, \`Failed to override window.\${prop}:\`, e);
|
|
239
|
-
return false;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
const overrideWindowProperty = (prop, value) => {
|
|
245
|
-
try {
|
|
246
|
-
const success = utils.overrideGetterWithNative(
|
|
247
|
-
window,
|
|
248
|
-
prop,
|
|
249
|
-
() => value
|
|
250
|
-
);
|
|
251
|
-
if (success) {
|
|
252
|
-
console.log(DEBUG_PREFIX, \`✓ Overridden window.\${prop} to:\`, value);
|
|
253
|
-
} else {
|
|
254
|
-
console.warn(DEBUG_PREFIX, \`⚠ Could not override window.\${prop} (frozen property)\`);
|
|
255
|
-
}
|
|
256
|
-
return success;
|
|
257
|
-
} catch (error) {
|
|
258
|
-
console.error(ERROR_PREFIX, \`Exception overriding window.\${prop}:\`, error);
|
|
259
|
-
throw error;
|
|
260
|
-
}
|
|
261
|
-
};
|
|
262
|
-
|
|
263
|
-
// Override window properties
|
|
264
|
-
const overrides = {
|
|
265
|
-
${scr.devicePixelRatio ? `devicePixelRatio: ${scr.devicePixelRatio},` : ''}
|
|
266
|
-
};
|
|
267
|
-
|
|
268
|
-
let successCount = 0;
|
|
269
|
-
let failureCount = 0;
|
|
270
|
-
|
|
271
|
-
for (const [prop, value] of Object.entries(overrides)) {
|
|
272
|
-
if (overrideWindowProperty(prop, value)) {
|
|
273
|
-
successCount++;
|
|
274
|
-
} else {
|
|
275
|
-
failureCount++;
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
console.log(DEBUG_PREFIX, \`Window overrides complete: \${successCount} succeeded, \${failureCount} failed\`);
|
|
280
|
-
})();
|
|
281
|
-
`;
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* Creates a comprehensive fingerprint injection script
|
|
285
|
-
*/
|
|
286
|
-
export function createComprehensiveFingerprintScript(fingerprint) {
|
|
287
|
-
log.debug('Creating comprehensive fingerprint injection script', {
|
|
288
|
-
hasNavigator: !!fingerprint.navigator,
|
|
289
|
-
hasScreen: !!fingerprint.screen,
|
|
290
|
-
hasVideoCard: !!fingerprint.videoCard,
|
|
291
|
-
});
|
|
292
|
-
return `
|
|
293
|
-
(() => {
|
|
294
|
-
'use strict';
|
|
295
|
-
|
|
296
|
-
const DEBUG_PREFIX = '[CDP-FP-DEBUG]';
|
|
297
|
-
console.log(DEBUG_PREFIX, '=== Starting Comprehensive Fingerprint Injection ===');
|
|
298
|
-
console.log(DEBUG_PREFIX, 'Timestamp:', new Date().toISOString());
|
|
299
|
-
|
|
300
|
-
// Log fingerprint data structure
|
|
301
|
-
console.log(DEBUG_PREFIX, 'Fingerprint data available:', {
|
|
302
|
-
hasNavigator: ${!!fingerprint.navigator},
|
|
303
|
-
hasScreen: ${!!fingerprint.screen},
|
|
304
|
-
hasVideoCard: ${!!fingerprint.videoCard},
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
console.log(DEBUG_PREFIX, '=== Fingerprint Injection Complete ===');
|
|
308
|
-
})();
|
|
309
|
-
`;
|
|
310
|
-
}
|
|
311
|
-
/**
|
|
312
|
-
* Main function to inject custom fingerprint
|
|
313
|
-
* This replaces the fingerprint-injector library's injectable script
|
|
314
|
-
*/
|
|
315
|
-
export function createCustomFingerprintInjection(fingerprint, _options = {}) {
|
|
316
|
-
const scripts = [];
|
|
317
|
-
log.info('Creating custom fingerprint injection scripts', {
|
|
318
|
-
hasNavigator: !!fingerprint.navigator,
|
|
319
|
-
hasScreen: !!fingerprint.screen,
|
|
320
|
-
hasVideoCard: !!fingerprint.videoCard,
|
|
321
|
-
});
|
|
322
|
-
// Add comprehensive logging script
|
|
323
|
-
scripts.push(createComprehensiveFingerprintScript(fingerprint));
|
|
324
|
-
// Add navigator overrides
|
|
325
|
-
if (fingerprint.navigator && Object.keys(fingerprint.navigator).length > 0) {
|
|
326
|
-
scripts.push(createNavigatorOverrideScript(fingerprint));
|
|
327
|
-
log.debug('Added navigator override script');
|
|
328
|
-
}
|
|
329
|
-
// Add screen overrides
|
|
330
|
-
if (fingerprint.screen && Object.keys(fingerprint.screen).length > 0) {
|
|
331
|
-
scripts.push(createScreenOverrideScript(fingerprint));
|
|
332
|
-
log.debug('Added screen override script');
|
|
333
|
-
}
|
|
334
|
-
// Add window overrides
|
|
335
|
-
if (fingerprint.screen?.devicePixelRatio) {
|
|
336
|
-
scripts.push(createWindowOverrideScript(fingerprint));
|
|
337
|
-
log.debug('Added window override script');
|
|
338
|
-
}
|
|
339
|
-
log.info(`Created ${scripts.length} custom fingerprint injection scripts`);
|
|
340
|
-
return scripts;
|
|
341
|
-
}
|
|
342
|
-
//# sourceMappingURL=custom-fingerprint-injector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"custom-fingerprint-injector.js","sourceRoot":"","sources":["../../src/fingerprinting/custom-fingerprint-injector.ts"],"names":[],"mappings":"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"}
|
package/dist/launcher-wrap.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { Options, Client } from "chrome-remote-interface";
|
|
2
|
-
import type CdpPage from "./page.js";
|
|
3
|
-
export interface LaunchReturn extends Client {
|
|
4
|
-
newPage: () => Promise<CdpPage>;
|
|
5
|
-
}
|
|
6
|
-
export declare class CdpLauncher {
|
|
7
|
-
launch(options: Options): Promise<LaunchReturn>;
|
|
8
|
-
}
|
|
9
|
-
export declare const cdpLauncher: CdpLauncher;
|
|
10
|
-
//# sourceMappingURL=launcher-wrap.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"launcher-wrap.d.ts","sourceRoot":"","sources":["../src/launcher-wrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AAErC,MAAM,WAAW,YAAa,SAAQ,MAAM;IACxC,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CACnC;AACD,qBAAa,WAAW;IACd,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;CAOxD;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|
package/dist/launcher-wrap.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import CDP from "chrome-remote-interface"; // Import necessary types
|
|
2
|
-
export class CdpLauncher {
|
|
3
|
-
async launch(options) {
|
|
4
|
-
const cdp = await CDP(options); // Returns a CDP.Client instance
|
|
5
|
-
// @ts-expect-error
|
|
6
|
-
cdp.newPage = () => { throw new Error("Use BrowserController class for creating new page!"); };
|
|
7
|
-
return cdp;
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
export const cdpLauncher = new CdpLauncher();
|
|
11
|
-
//# sourceMappingURL=launcher-wrap.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"launcher-wrap.js","sourceRoot":"","sources":["../src/launcher-wrap.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,yBAAyB,CAAC,CAAC,yBAAyB;AAOpE,MAAM,OAAO,WAAW;IACpB,KAAK,CAAC,MAAM,CAAC,OAAgB;QACzB,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,gCAAgC;QAChE,oBAAoB;QACpB,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA,CAAC,CAAC,CAAA;QAE7F,OAAO,GAAmB,CAAA;IAC9B,CAAC;CACJ;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC"}
|