jumpy-lion 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-controller.d.ts +22 -3
- package/dist/browser-controller.d.ts.map +1 -1
- package/dist/browser-controller.js +316 -71
- package/dist/browser-controller.js.map +1 -1
- package/dist/browser-plugin.d.ts +56 -7
- package/dist/browser-plugin.d.ts.map +1 -1
- package/dist/browser-plugin.js +268 -56
- package/dist/browser-plugin.js.map +1 -1
- package/dist/browser-process/browser.d.ts +39 -0
- package/dist/browser-process/browser.d.ts.map +1 -1
- package/dist/browser-process/browser.js +127 -16
- package/dist/browser-process/browser.js.map +1 -1
- package/dist/browser-process/process.d.ts +9 -0
- package/dist/browser-process/process.d.ts.map +1 -1
- package/dist/browser-process/process.js +100 -6
- package/dist/browser-process/process.js.map +1 -1
- package/dist/browser-profiles/chrome/default.d.ts +116 -0
- package/dist/browser-profiles/chrome/default.d.ts.map +1 -1
- package/dist/browser-profiles/chrome/default.js +118 -1
- package/dist/browser-profiles/chrome/default.js.map +1 -1
- package/dist/browser-profiles/chrome/populate-profile.d.ts +76 -0
- package/dist/browser-profiles/chrome/populate-profile.d.ts.map +1 -0
- package/dist/browser-profiles/chrome/populate-profile.js +300 -0
- package/dist/browser-profiles/chrome/populate-profile.js.map +1 -0
- package/dist/browser-profiles/index.d.ts +1 -0
- package/dist/browser-profiles/index.d.ts.map +1 -1
- package/dist/browser-profiles/index.js +2 -0
- package/dist/browser-profiles/index.js.map +1 -1
- package/dist/crawler.d.ts +81 -9
- package/dist/crawler.d.ts.map +1 -1
- package/dist/crawler.js +26 -10
- package/dist/crawler.js.map +1 -1
- package/dist/fingerprinting/all-fingerprint-defender/_locales/en/messages.json +95 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.d.ts +2 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.d.ts.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.js +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.js.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.d.ts +2 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.d.ts.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.js +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.js.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.d.ts +83 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.d.ts.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.js +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.js.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.d.ts +2 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.d.ts.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.js +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.js.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.d.ts +2 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.d.ts.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.js +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.js.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.d.ts +2 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.d.ts.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.js +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.js.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.d.ts +2 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.d.ts.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.js +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.js.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/debounce-09920c81.css +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/options-fe2fb5aa.css +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/popup-1886d2ef.css +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/img/icon-128.png +0 -0
- package/dist/fingerprinting/all-fingerprint-defender/img/icon-16.png +0 -0
- package/dist/fingerprinting/all-fingerprint-defender/img/icon-24.png +0 -0
- package/dist/fingerprinting/all-fingerprint-defender/img/icon-32-disabled.png +0 -0
- package/dist/fingerprinting/all-fingerprint-defender/img/icon-32.png +0 -0
- package/dist/fingerprinting/all-fingerprint-defender/img/icon-48.png +0 -0
- package/dist/fingerprinting/all-fingerprint-defender/manifest.json +83 -0
- package/dist/fingerprinting/all-fingerprint-defender/options.html +17 -0
- package/dist/fingerprinting/all-fingerprint-defender/popup.html +23 -0
- package/dist/fingerprinting/anti-webgpu/background.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/background.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/background.js +4 -0
- package/dist/fingerprinting/anti-webgpu/background.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/inject.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/inject.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/inject.js +50 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/inject.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.js +172 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/icons/128.png +0 -0
- package/dist/fingerprinting/anti-webgpu/data/icons/16.png +0 -0
- package/dist/fingerprinting/anti-webgpu/data/icons/32.png +0 -0
- package/dist/fingerprinting/anti-webgpu/data/icons/48.png +0 -0
- package/dist/fingerprinting/anti-webgpu/data/icons/64.png +0 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.css +88 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.html +58 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.js +96 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/chrome.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/lib/chrome.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/chrome.js +249 -0
- package/dist/fingerprinting/anti-webgpu/lib/chrome.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/common.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/lib/common.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/common.js +86 -0
- package/dist/fingerprinting/anti-webgpu/lib/common.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/config.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/lib/config.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/config.js +14 -0
- package/dist/fingerprinting/anti-webgpu/lib/config.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/runtime.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/lib/runtime.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/runtime.js +107 -0
- package/dist/fingerprinting/anti-webgpu/lib/runtime.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/manifest.json +58 -0
- package/dist/fingerprinting/custom-fingerprint-injector.d.ts +87 -0
- package/dist/fingerprinting/custom-fingerprint-injector.d.ts.map +1 -0
- package/dist/fingerprinting/custom-fingerprint-injector.js +342 -0
- package/dist/fingerprinting/custom-fingerprint-injector.js.map +1 -0
- package/dist/fingerprinting/fingerprint-injector.d.ts +163 -0
- package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-injector.js +697 -0
- package/dist/fingerprinting/fingerprint-injector.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js +119 -0
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js +149 -0
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.d.ts +14 -0
- package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.js +763 -0
- package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js +195 -0
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.d.ts +10 -0
- package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.js +195 -0
- package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts +28 -0
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js +1181 -0
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts +7 -0
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js +171 -0
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts +37 -0
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/index.js +41 -0
- package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.d.ts +45 -0
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js +268 -0
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js +301 -0
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.d.ts +14 -0
- package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.js +160 -0
- package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts +7 -0
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js +58 -0
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js +249 -0
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts +33 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +620 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.d.ts +13 -0
- package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.js +356 -0
- package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts +18 -0
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js +171 -0
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.d.ts +55 -0
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js +244 -0
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts +14 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +983 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/storage-consistency.d.ts +13 -0
- package/dist/fingerprinting/fingerprint-overrides/storage-consistency.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/storage-consistency.js +346 -0
- package/dist/fingerprinting/fingerprint-overrides/storage-consistency.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/timing-consistency.d.ts +13 -0
- package/dist/fingerprinting/fingerprint-overrides/timing-consistency.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/timing-consistency.js +264 -0
- package/dist/fingerprinting/fingerprint-overrides/timing-consistency.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts +27 -0
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +213 -0
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/utils.d.ts +12 -0
- package/dist/fingerprinting/fingerprint-overrides/utils.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/utils.js +517 -0
- package/dist/fingerprinting/fingerprint-overrides/utils.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts +12 -0
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +215 -0
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js +202 -0
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +188 -0
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/launcher-wrap.d.ts +2 -2
- package/dist/launcher-wrap.d.ts.map +1 -1
- package/dist/launcher-wrap.js.map +1 -1
- package/dist/page.d.ts +160 -13
- package/dist/page.d.ts.map +1 -1
- package/dist/page.js +1027 -42
- package/dist/page.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +8 -4
package/dist/browser-plugin.js
CHANGED
|
@@ -1,10 +1,120 @@
|
|
|
1
1
|
import net from 'net';
|
|
2
2
|
import { BrowserPlugin, log } from 'crawlee';
|
|
3
3
|
import CDPBrowserController from './browser-controller.js';
|
|
4
|
+
import { launchChromeBrowserWithNewProfile } from './browser-process/browser.js';
|
|
4
5
|
import { CdpLauncher } from './launcher-wrap.js';
|
|
5
6
|
import { anonymizeProxySugar } from './proxy/anonymize-proxy.js';
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
class CDPBrowserPlugin extends BrowserPlugin {
|
|
8
|
+
async getNextAvailablePort() {
|
|
9
|
+
const maxAttempts = CDPBrowserPlugin.PORT_RANGE.max - CDPBrowserPlugin.PORT_RANGE.min + 1; // Try all ports in range
|
|
10
|
+
let attempts = 0;
|
|
11
|
+
while (attempts < maxAttempts) {
|
|
12
|
+
// Wait if another instance is currently assigning a port
|
|
13
|
+
while (CDPBrowserPlugin.portLock) {
|
|
14
|
+
await new Promise(resolve => setTimeout(resolve, 100 + Math.random() * 100));
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
// Set lock before port assignment
|
|
18
|
+
CDPBrowserPlugin.portLock = true;
|
|
19
|
+
// Increment the last assigned port, wrapping around if necessary
|
|
20
|
+
CDPBrowserPlugin.lastAssignedPort++;
|
|
21
|
+
if (CDPBrowserPlugin.lastAssignedPort > CDPBrowserPlugin.PORT_RANGE.max) {
|
|
22
|
+
CDPBrowserPlugin.lastAssignedPort = CDPBrowserPlugin.PORT_RANGE.min;
|
|
23
|
+
log.debug('Port range wrapped around, starting from beginning');
|
|
24
|
+
}
|
|
25
|
+
const candidatePort = CDPBrowserPlugin.lastAssignedPort;
|
|
26
|
+
// Skip if port is already tracked as in use
|
|
27
|
+
if (CDPBrowserPlugin.usedPorts.has(candidatePort)) {
|
|
28
|
+
attempts++;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
// Check if port is actually available
|
|
32
|
+
if (await this._isPortAvailable(candidatePort)) {
|
|
33
|
+
CDPBrowserPlugin.usedPorts.add(candidatePort);
|
|
34
|
+
log.debug(`Reserved port ${candidatePort} for browser instance (attempt ${attempts + 1})`);
|
|
35
|
+
return candidatePort;
|
|
36
|
+
}
|
|
37
|
+
// Port is not available, mark it as used temporarily to avoid immediate retry
|
|
38
|
+
CDPBrowserPlugin.usedPorts.add(candidatePort);
|
|
39
|
+
setTimeout(() => {
|
|
40
|
+
CDPBrowserPlugin.usedPorts.delete(candidatePort);
|
|
41
|
+
}, 5000); // Remove from used ports after 5 seconds
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
// Always release the lock
|
|
45
|
+
CDPBrowserPlugin.portLock = false;
|
|
46
|
+
}
|
|
47
|
+
attempts++;
|
|
48
|
+
}
|
|
49
|
+
// If we've tried all ports and none are available, try to clean up stale ports
|
|
50
|
+
log.warning(`All ports in range ${CDPBrowserPlugin.PORT_RANGE.min}-${CDPBrowserPlugin.PORT_RANGE.max} are in use. Attempting cleanup.`);
|
|
51
|
+
await this._cleanupStalePorts();
|
|
52
|
+
// Try once more after cleanup
|
|
53
|
+
for (let port = CDPBrowserPlugin.PORT_RANGE.min; port <= CDPBrowserPlugin.PORT_RANGE.max; port++) {
|
|
54
|
+
if (!CDPBrowserPlugin.usedPorts.has(port) && await this._isPortAvailable(port)) {
|
|
55
|
+
CDPBrowserPlugin.usedPorts.add(port);
|
|
56
|
+
log.debug(`Reserved port ${port} after cleanup`);
|
|
57
|
+
return port;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
throw new Error(`No available ports found in the configured range ${CDPBrowserPlugin.PORT_RANGE.min}-${CDPBrowserPlugin.PORT_RANGE.max} after maximum attempts and cleanup`);
|
|
61
|
+
}
|
|
62
|
+
async _cleanupStalePorts() {
|
|
63
|
+
log.debug('Cleaning up stale ports');
|
|
64
|
+
const portsToCheck = Array.from(CDPBrowserPlugin.usedPorts);
|
|
65
|
+
for (const port of portsToCheck) {
|
|
66
|
+
if (await this._isPortAvailable(port)) {
|
|
67
|
+
CDPBrowserPlugin.usedPorts.delete(port);
|
|
68
|
+
log.debug(`Cleaned up stale port ${port}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async _isPortAvailable(port) {
|
|
73
|
+
return new Promise((resolve) => {
|
|
74
|
+
const server = net.createServer();
|
|
75
|
+
let resolved = false;
|
|
76
|
+
const cleanup = () => {
|
|
77
|
+
if (!resolved) {
|
|
78
|
+
resolved = true;
|
|
79
|
+
try {
|
|
80
|
+
server.close();
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
// Ignore errors during cleanup
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
server.once('error', () => {
|
|
88
|
+
cleanup();
|
|
89
|
+
resolve(false);
|
|
90
|
+
});
|
|
91
|
+
server.once('listening', () => {
|
|
92
|
+
cleanup();
|
|
93
|
+
resolve(true);
|
|
94
|
+
});
|
|
95
|
+
// Add timeout to prevent hanging
|
|
96
|
+
setTimeout(() => {
|
|
97
|
+
cleanup();
|
|
98
|
+
resolve(false);
|
|
99
|
+
}, 2000); // Reduced timeout
|
|
100
|
+
try {
|
|
101
|
+
server.listen(port, '127.0.0.1');
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
cleanup();
|
|
105
|
+
resolve(false);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
releasePort(port) {
|
|
110
|
+
if (CDPBrowserPlugin.usedPorts.has(port)) {
|
|
111
|
+
CDPBrowserPlugin.usedPorts.delete(port);
|
|
112
|
+
log.debug(`Released port ${port} back to pool. Used ports: ${CDPBrowserPlugin.usedPorts.size}/${CDPBrowserPlugin.PORT_RANGE.max - CDPBrowserPlugin.PORT_RANGE.min + 1}`);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
log.debug(`Attempted to release port ${port} that was not in use`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
8
118
|
/**
|
|
9
119
|
*/
|
|
10
120
|
async _addProxyToLaunchOptions() {
|
|
@@ -25,35 +135,113 @@ export default class CDPBrowserPlugin extends BrowserPlugin {
|
|
|
25
135
|
* @private
|
|
26
136
|
*/
|
|
27
137
|
async _launch(launchContext) {
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
launchOptions.browserType = "chrome";
|
|
31
|
-
}
|
|
32
|
-
let browser;
|
|
33
|
-
launchOptions.useIncognitoPages = useIncognitoPages;
|
|
34
|
-
log.debug("Launch options", launchOptions);
|
|
35
|
-
const [anonymizedProxyUrl, close] = await anonymizeProxySugar(proxyUrl);
|
|
36
|
-
if (anonymizedProxyUrl) {
|
|
37
|
-
launchOptions.proxyUrl = anonymizedProxyUrl;
|
|
38
|
-
}
|
|
39
|
-
const debuggingPort = await this._findFreePort(9233);
|
|
40
|
-
const browserProcess = await this._launchBrowser(debuggingPort, launchOptions);
|
|
41
|
-
log.debug("browserProcess", browserProcess);
|
|
138
|
+
const debuggingPort = await this.getNextAvailablePort();
|
|
139
|
+
let browserProcess;
|
|
42
140
|
try {
|
|
43
|
-
|
|
141
|
+
const { launchOptions, useIncognitoPages, proxyUrl, fingerprint } = launchContext;
|
|
142
|
+
if (!launchOptions.browserType) {
|
|
143
|
+
launchOptions.browserType = "chrome";
|
|
144
|
+
}
|
|
145
|
+
// Extract screen dimensions from fingerprint if available and not already set
|
|
146
|
+
if (fingerprint?.fingerprint?.screen && !launchOptions.windowWidth && !launchOptions.windowHeight) {
|
|
147
|
+
const screen = fingerprint.fingerprint.screen;
|
|
148
|
+
launchOptions.windowWidth = screen.width || 1920;
|
|
149
|
+
launchOptions.windowHeight = screen.height || 1080;
|
|
150
|
+
log.info('Using fingerprint screen dimensions for browser window', {
|
|
151
|
+
width: launchOptions.windowWidth,
|
|
152
|
+
height: launchOptions.windowHeight,
|
|
153
|
+
devicePixelRatio: screen.devicePixelRatio,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
else if (launchOptions.windowWidth && launchOptions.windowHeight) {
|
|
157
|
+
log.info('Using explicitly set window dimensions', {
|
|
158
|
+
width: launchOptions.windowWidth,
|
|
159
|
+
height: launchOptions.windowHeight,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
log.warning('No fingerprint screen dimensions and no explicit dimensions - will use defaults or maximize');
|
|
164
|
+
}
|
|
165
|
+
let browser;
|
|
166
|
+
launchOptions.useIncognitoPages = useIncognitoPages;
|
|
167
|
+
log.debug("Launch options", { ...launchOptions, debuggingPort });
|
|
168
|
+
const [anonymizedProxyUrl, close] = await anonymizeProxySugar(proxyUrl);
|
|
44
169
|
if (anonymizedProxyUrl) {
|
|
170
|
+
launchOptions.proxyUrl = anonymizedProxyUrl;
|
|
171
|
+
}
|
|
172
|
+
browserProcess = await this._launchBrowser(debuggingPort, launchOptions);
|
|
173
|
+
log.debug("Browser process started", { pid: browserProcess.pid, debuggingPort });
|
|
174
|
+
try {
|
|
175
|
+
browser = await this._connectWithRetry(debuggingPort, 10, 4000);
|
|
176
|
+
// Add cleanup handlers
|
|
45
177
|
browser.on('close', async () => {
|
|
46
|
-
|
|
178
|
+
try {
|
|
179
|
+
this.releasePort(debuggingPort);
|
|
180
|
+
if (anonymizedProxyUrl) {
|
|
181
|
+
await close();
|
|
182
|
+
}
|
|
183
|
+
log.debug(`Browser on port ${debuggingPort} closed cleanly`);
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
log.warning(`Error during browser close cleanup on port ${debuggingPort}:`, { error });
|
|
187
|
+
// Still release the port even if other cleanup fails
|
|
188
|
+
this.releasePort(debuggingPort);
|
|
189
|
+
}
|
|
47
190
|
});
|
|
191
|
+
// Add error handler to ensure cleanup
|
|
192
|
+
browser.on('error', async (error) => {
|
|
193
|
+
try {
|
|
194
|
+
log.warning(`Browser error on port ${debuggingPort}:`, error);
|
|
195
|
+
this.releasePort(debuggingPort);
|
|
196
|
+
if (anonymizedProxyUrl) {
|
|
197
|
+
await close();
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
catch (cleanupError) {
|
|
201
|
+
log.error(`Error during browser error cleanup on port ${debuggingPort}:`, { error: cleanupError });
|
|
202
|
+
// Still release the port even if other cleanup fails
|
|
203
|
+
this.releasePort(debuggingPort);
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
// Add disconnect handler for CDP connection issues
|
|
207
|
+
browser.on('disconnect', async () => {
|
|
208
|
+
try {
|
|
209
|
+
log.warning(`Browser disconnected on port ${debuggingPort}, cleaning up`);
|
|
210
|
+
this.releasePort(debuggingPort);
|
|
211
|
+
if (anonymizedProxyUrl) {
|
|
212
|
+
await close();
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch (cleanupError) {
|
|
216
|
+
log.error(`Error during browser disconnect cleanup on port ${debuggingPort}:`, { error: cleanupError });
|
|
217
|
+
// Still release the port even if other cleanup fails
|
|
218
|
+
this.releasePort(debuggingPort);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
launchContext.debuggingPort = debuggingPort;
|
|
222
|
+
launchContext.process = browserProcess;
|
|
223
|
+
return browser;
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
if (anonymizedProxyUrl) {
|
|
227
|
+
await close();
|
|
228
|
+
}
|
|
229
|
+
throw error;
|
|
48
230
|
}
|
|
49
231
|
}
|
|
50
232
|
catch (error) {
|
|
51
|
-
|
|
233
|
+
this.releasePort(debuggingPort);
|
|
234
|
+
// Ensure browser process is killed if it was started
|
|
235
|
+
if (browserProcess) {
|
|
236
|
+
try {
|
|
237
|
+
await browserProcess.kill();
|
|
238
|
+
}
|
|
239
|
+
catch (killError) {
|
|
240
|
+
log.warning(`Failed to kill browser process: ${killError}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
52
243
|
throw error;
|
|
53
244
|
}
|
|
54
|
-
launchContext.debuggingPort = debuggingPort;
|
|
55
|
-
launchContext.process = browserProcess;
|
|
56
|
-
return browser;
|
|
57
245
|
}
|
|
58
246
|
/**
|
|
59
247
|
* Creates a new browser controller.
|
|
@@ -61,10 +249,8 @@ export default class CDPBrowserPlugin extends BrowserPlugin {
|
|
|
61
249
|
* @private
|
|
62
250
|
*/
|
|
63
251
|
// @TODO:
|
|
64
|
-
// @ts-expect-error Fix types
|
|
65
252
|
_createController() {
|
|
66
253
|
// @TODO:
|
|
67
|
-
// @ts-expect-error Fix types
|
|
68
254
|
return new CDPBrowserController(this);
|
|
69
255
|
}
|
|
70
256
|
/**
|
|
@@ -73,11 +259,22 @@ export default class CDPBrowserPlugin extends BrowserPlugin {
|
|
|
73
259
|
* @private
|
|
74
260
|
*/
|
|
75
261
|
async _launchBrowser(debuggingPort, launchOptions) {
|
|
76
|
-
const { proxyUrl, browserType, ignoreHttpsErrors = true, headless, executablePath } = launchOptions;
|
|
262
|
+
const { proxyUrl, browserType, ignoreHttpsErrors = true, headless, executablePath, useExperimentalFingerprints, fingerprintOptions, maximizeWindow, windowWidth, windowHeight } = launchOptions;
|
|
77
263
|
let browserProcess;
|
|
78
264
|
switch (browserType) {
|
|
79
265
|
case "chrome": {
|
|
80
|
-
browserProcess = await launchChromeBrowserWithNewProfile({
|
|
266
|
+
browserProcess = await launchChromeBrowserWithNewProfile({
|
|
267
|
+
debuggingPort,
|
|
268
|
+
anonymizedProxyUrl: proxyUrl,
|
|
269
|
+
ignoreHttpsErrors,
|
|
270
|
+
headless,
|
|
271
|
+
executablePath,
|
|
272
|
+
useExperimentalFingerprints,
|
|
273
|
+
fingerprintOptions,
|
|
274
|
+
maximizeWindow,
|
|
275
|
+
windowWidth,
|
|
276
|
+
windowHeight,
|
|
277
|
+
});
|
|
81
278
|
break;
|
|
82
279
|
}
|
|
83
280
|
default: {
|
|
@@ -120,31 +317,6 @@ export default class CDPBrowserPlugin extends BrowserPlugin {
|
|
|
120
317
|
}());
|
|
121
318
|
});
|
|
122
319
|
}
|
|
123
|
-
/**
|
|
124
|
-
* Finds a free port to use.
|
|
125
|
-
*
|
|
126
|
-
* @private
|
|
127
|
-
*/
|
|
128
|
-
async _findFreePort(startingPort) {
|
|
129
|
-
return new Promise((resolve, reject) => {
|
|
130
|
-
const server = net.createServer();
|
|
131
|
-
server.on('error', (err) => {
|
|
132
|
-
if (err.code === 'EADDRINUSE') {
|
|
133
|
-
this._findFreePort(startingPort + 1).then(resolve).catch(reject); // Port is in use, try the next one
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
reject(err);
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
server.on('listening', () => {
|
|
140
|
-
const { port } = server.address();
|
|
141
|
-
server.close(() => {
|
|
142
|
-
resolve(port);
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
server.listen(startingPort, '127.0.0.1');
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
320
|
/**
|
|
149
321
|
* Tries to connect to the browser using CDP with retries.
|
|
150
322
|
*
|
|
@@ -153,24 +325,64 @@ export default class CDPBrowserPlugin extends BrowserPlugin {
|
|
|
153
325
|
async _connectWithRetry(port, maxRetries, retryDelay) {
|
|
154
326
|
let attempt = 0;
|
|
155
327
|
let lastError = null;
|
|
328
|
+
// Add delay before first attempt to allow browser to fully start
|
|
329
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
156
330
|
while (attempt < maxRetries) {
|
|
157
331
|
try {
|
|
158
332
|
const cdpLauncher = new CdpLauncher();
|
|
159
|
-
const browser = await
|
|
333
|
+
const browser = await Promise.race([
|
|
334
|
+
cdpLauncher.launch({ port }),
|
|
335
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Launch timeout')), 10000)),
|
|
336
|
+
]);
|
|
160
337
|
log.info(`Connected to browser on port ${port} on attempt ${attempt + 1}`);
|
|
161
338
|
return browser;
|
|
162
339
|
}
|
|
163
340
|
catch (error) {
|
|
164
341
|
attempt++;
|
|
165
|
-
|
|
166
|
-
|
|
342
|
+
if (error instanceof Error) {
|
|
343
|
+
lastError = error;
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
lastError = new Error(String(error));
|
|
347
|
+
}
|
|
348
|
+
log.warning(`Failed to connect to browser on attempt ${attempt}. Error: ${lastError.message}`);
|
|
167
349
|
if (attempt < maxRetries) {
|
|
168
|
-
|
|
350
|
+
// Exponential backoff
|
|
351
|
+
const backoffDelay = retryDelay * 2 ** (attempt - 1);
|
|
352
|
+
await new Promise(resolve => setTimeout(resolve, backoffDelay));
|
|
169
353
|
}
|
|
170
354
|
}
|
|
171
355
|
}
|
|
172
|
-
|
|
356
|
+
// Always throw the wrapped error with our standard message
|
|
173
357
|
throw new Error(`Failed to connect to browser after ${maxRetries} attempts.`);
|
|
174
358
|
}
|
|
175
359
|
}
|
|
360
|
+
Object.defineProperty(CDPBrowserPlugin, "PORT_RANGE", {
|
|
361
|
+
enumerable: true,
|
|
362
|
+
configurable: true,
|
|
363
|
+
writable: true,
|
|
364
|
+
value: {
|
|
365
|
+
min: 9200,
|
|
366
|
+
max: 9600, // Give a range of 400 ports instead of 200
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
Object.defineProperty(CDPBrowserPlugin, "usedPorts", {
|
|
370
|
+
enumerable: true,
|
|
371
|
+
configurable: true,
|
|
372
|
+
writable: true,
|
|
373
|
+
value: new Set()
|
|
374
|
+
});
|
|
375
|
+
Object.defineProperty(CDPBrowserPlugin, "lastAssignedPort", {
|
|
376
|
+
enumerable: true,
|
|
377
|
+
configurable: true,
|
|
378
|
+
writable: true,
|
|
379
|
+
value: CDPBrowserPlugin.PORT_RANGE.min - 1
|
|
380
|
+
});
|
|
381
|
+
Object.defineProperty(CDPBrowserPlugin, "portLock", {
|
|
382
|
+
enumerable: true,
|
|
383
|
+
configurable: true,
|
|
384
|
+
writable: true,
|
|
385
|
+
value: false
|
|
386
|
+
});
|
|
387
|
+
export default CDPBrowserPlugin;
|
|
176
388
|
//# sourceMappingURL=browser-plugin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-plugin.js","sourceRoot":"","sources":["../src/browser-plugin.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browser-plugin.js","sourceRoot":"","sources":["../src/browser-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,16 @@
|
|
|
1
1
|
import { BrowserProcess } from './process.js';
|
|
2
|
+
/**
|
|
3
|
+
* Humanization options for simulating realistic user behavior
|
|
4
|
+
* All options are disabled by default for performance
|
|
5
|
+
*/
|
|
6
|
+
export interface HumanizationOptions {
|
|
7
|
+
/** Enable mouse movement humanization. Default: false */
|
|
8
|
+
mouse?: boolean;
|
|
9
|
+
/** Enable keyboard humanization. Default: false */
|
|
10
|
+
keyboard?: boolean;
|
|
11
|
+
/** Enable scroll humanization. Default: false */
|
|
12
|
+
scroll?: boolean;
|
|
13
|
+
}
|
|
2
14
|
export interface LaunchBrowserOptions {
|
|
3
15
|
anonymizedProxyUrl?: string;
|
|
4
16
|
debuggingPort?: number;
|
|
@@ -7,6 +19,33 @@ export interface LaunchBrowserOptions {
|
|
|
7
19
|
ignoreHttpsErrors?: boolean;
|
|
8
20
|
headless?: boolean;
|
|
9
21
|
executablePath?: string;
|
|
22
|
+
useExperimentalFingerprints?: boolean;
|
|
23
|
+
/** Whether to start the browser maximized and fullscreen. Default: true */
|
|
24
|
+
maximizeWindow?: boolean;
|
|
25
|
+
/** Enable all stealth arguments for anti-bot evasion. Default: true */
|
|
26
|
+
enableStealthMode?: boolean;
|
|
27
|
+
/** Populate profile with realistic user data. Default: true */
|
|
28
|
+
populateProfile?: boolean;
|
|
29
|
+
fingerprintOptions?: {
|
|
30
|
+
enableAdvancedStealth?: boolean;
|
|
31
|
+
bypassRuntimeEnable?: boolean;
|
|
32
|
+
spoofWebGL?: boolean;
|
|
33
|
+
spoofAudioContext?: boolean;
|
|
34
|
+
spoofClientRects?: boolean;
|
|
35
|
+
maskAutomationFlags?: boolean;
|
|
36
|
+
spoofFonts?: boolean;
|
|
37
|
+
spoofPerformance?: boolean;
|
|
38
|
+
spoofLocale?: boolean;
|
|
39
|
+
useExperimentalFingerprints?: boolean;
|
|
40
|
+
useFingerprintDefaults?: boolean;
|
|
41
|
+
platform?: 'Win32' | 'MacIntel' | 'Linux x86_64';
|
|
42
|
+
bypassCDPDetection?: boolean;
|
|
43
|
+
spoofStorage?: boolean;
|
|
44
|
+
spoofTiming?: boolean;
|
|
45
|
+
enableDataDomeBypass?: boolean;
|
|
46
|
+
/** Humanization options (all disabled by default) */
|
|
47
|
+
humanization?: HumanizationOptions;
|
|
48
|
+
};
|
|
10
49
|
}
|
|
11
50
|
export declare const launchBrowserWithNewProfile: (executablePath: string, options?: LaunchBrowserOptions) => Promise<BrowserProcess>;
|
|
12
51
|
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;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,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,qDAAqD;QACrD,YAAY,CAAC,EAAE,mBAAmB,CAAC;KACtC,CAAC;CACL;AAED,eAAO,MAAM,2BAA2B,mBACpB,MAAM,YACb,oBAAoB,KAC9B,OAAO,CAAC,cAAc,CAiGxB,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAa,OAAO,CAAC,MAAM,CAwC5D,CAAC;AAEF,eAAO,MAAM,iCAAiC,aAAmB,oBAAoB,4BAKpF,CAAC"}
|
|
@@ -6,44 +6,123 @@ import { log } from '@crawlee/core';
|
|
|
6
6
|
import { getChromeExecutablePath } from './get-chrome-executable.js';
|
|
7
7
|
import { BrowserProcess } from './process.js';
|
|
8
8
|
import { createChromeProfile } from '../browser-profiles/index.js';
|
|
9
|
+
import { populateChromeProfile } from '../browser-profiles/chrome/populate-profile.js';
|
|
10
|
+
const EXTENSION_PATH = path.resolve(import.meta.dirname, '../fingerprinting/all-fingerprint-defender');
|
|
11
|
+
const EXTENSION_PATH2 = path.resolve(import.meta.dirname, '../fingerprinting/anti-webgpu');
|
|
12
|
+
/**
|
|
13
|
+
* Stealth Chrome arguments for 2024-2025 bot detection bypass
|
|
14
|
+
*/
|
|
15
|
+
const STEALTH_ARGS = [
|
|
16
|
+
// Disable automation-controlled flag
|
|
17
|
+
'--disable-blink-features=AutomationControlled',
|
|
18
|
+
// Disable infobars (including "Chrome is being controlled" banner)
|
|
19
|
+
'--disable-infobars',
|
|
20
|
+
// Consistent language for fingerprint
|
|
21
|
+
'--lang=en-US,en',
|
|
22
|
+
// Disable dev-shm-usage for consistent memory reporting
|
|
23
|
+
'--disable-dev-shm-usage',
|
|
24
|
+
// Disable background networking that can reveal automation
|
|
25
|
+
'--disable-background-networking',
|
|
26
|
+
// Disable default apps that add fingerprint entropy
|
|
27
|
+
'--disable-default-apps',
|
|
28
|
+
// Disable extensions that auto-install
|
|
29
|
+
'--disable-component-extensions-with-background-pages',
|
|
30
|
+
// Disable sync which can leak automation
|
|
31
|
+
'--disable-sync',
|
|
32
|
+
// Disable translate popup
|
|
33
|
+
'--disable-translate',
|
|
34
|
+
// Disable password saving prompts
|
|
35
|
+
'--password-store=basic',
|
|
36
|
+
// Use mock keychain on macOS
|
|
37
|
+
'--use-mock-keychain',
|
|
38
|
+
// Disable client-side phishing detection
|
|
39
|
+
'--disable-client-side-phishing-detection',
|
|
40
|
+
// Disable hang monitor
|
|
41
|
+
'--disable-hang-monitor',
|
|
42
|
+
// Disable popup blocking for consistent behavior
|
|
43
|
+
'--disable-popup-blocking',
|
|
44
|
+
// Disable prompt on external protocol
|
|
45
|
+
'--disable-prompt-on-repost',
|
|
46
|
+
// Metrics reporting disabled
|
|
47
|
+
'--metrics-recording-only',
|
|
48
|
+
// Disable backgrounding of renderer processes
|
|
49
|
+
'--disable-renderer-backgrounding',
|
|
50
|
+
// Disable backgrounding occluded windows
|
|
51
|
+
'--disable-backgrounding-occluded-windows',
|
|
52
|
+
// Disable IPC flooding protection (can cause timing detection)
|
|
53
|
+
'--disable-ipc-flooding-protection',
|
|
54
|
+
// Enable features that real browsers have
|
|
55
|
+
'--enable-features=NetworkService,NetworkServiceInProcess',
|
|
56
|
+
];
|
|
9
57
|
export const launchBrowserWithNewProfile = async (executablePath, options = {}) => {
|
|
10
|
-
const { anonymizedProxyUrl, debuggingPort, windowWidth = 1920, windowHeight = 1080, ignoreHttpsErrors, headless, } = options;
|
|
58
|
+
const { anonymizedProxyUrl, debuggingPort, windowWidth = 1920, windowHeight = 1080, ignoreHttpsErrors, headless, useExperimentalFingerprints = false, maximizeWindow = true, enableStealthMode = true, populateProfile: shouldPopulateProfile = true, } = options;
|
|
11
59
|
try {
|
|
12
60
|
const userDataDir = await createTempUserDataDir();
|
|
13
61
|
await createChromeProfile(userDataDir);
|
|
62
|
+
// Populate profile with realistic user data for 2024-2025 anti-bot evasion
|
|
63
|
+
if (shouldPopulateProfile) {
|
|
64
|
+
try {
|
|
65
|
+
await populateChromeProfile(userDataDir, {
|
|
66
|
+
addHistory: true,
|
|
67
|
+
addEngagement: true,
|
|
68
|
+
addMediaEngagement: true,
|
|
69
|
+
});
|
|
70
|
+
log.debug('Populated Chrome profile with realistic user data');
|
|
71
|
+
}
|
|
72
|
+
catch (popError) {
|
|
73
|
+
log.debug(`Could not populate profile: ${popError}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
14
76
|
const browserArgs = [
|
|
15
77
|
`--remote-debugging-port=${debuggingPort}`,
|
|
16
|
-
|
|
78
|
+
// NOTE: --disable-gpu REMOVED - it's a major detection vector.
|
|
79
|
+
// Real browsers never use this flag and it forces software rendering,
|
|
80
|
+
// making WebGL vendor/renderer inconsistent with spoofed GPU values.
|
|
17
81
|
'--no-sandbox',
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
// '--start-fullscreen',
|
|
22
|
-
// '--no-default-browser-check',
|
|
23
|
-
// '--disable-infobars',
|
|
24
|
-
// '--disable-features=IsolateOrigins,site-per-process',
|
|
82
|
+
`--user-data-dir=${userDataDir}`,
|
|
83
|
+
'--no-first-run',
|
|
84
|
+
'--no-default-browser-check',
|
|
25
85
|
];
|
|
26
|
-
|
|
27
|
-
|
|
86
|
+
// Add stealth arguments for anti-bot evasion (2024-2025)
|
|
87
|
+
if (enableStealthMode) {
|
|
88
|
+
browserArgs.push(...STEALTH_ARGS);
|
|
28
89
|
}
|
|
90
|
+
// Set window size - either specific dimensions or maximize
|
|
91
|
+
// Don't maximize if specific dimensions are provided to avoid conflicts
|
|
29
92
|
if (windowWidth && windowHeight) {
|
|
30
93
|
browserArgs.push(`--window-size=${windowWidth},${windowHeight}`);
|
|
94
|
+
log.debug(`Browser window size set to: ${windowWidth}x${windowHeight}`);
|
|
95
|
+
}
|
|
96
|
+
else if (maximizeWindow) {
|
|
97
|
+
browserArgs.push('--start-maximized', '--start-fullscreen');
|
|
98
|
+
log.debug('Browser window set to maximize/fullscreen');
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
log.debug('No window size or maximize specified');
|
|
102
|
+
}
|
|
103
|
+
if (useExperimentalFingerprints) {
|
|
104
|
+
const EXTENSIONS = [EXTENSION_PATH, EXTENSION_PATH2 /* , more… */];
|
|
105
|
+
const extList = EXTENSIONS.join(',');
|
|
106
|
+
browserArgs.push(`--disable-extensions-except=${extList}`, // optional, keeps Chrome from loading the rest
|
|
107
|
+
`--load-extension=${extList}`);
|
|
108
|
+
}
|
|
109
|
+
if (anonymizedProxyUrl) {
|
|
110
|
+
browserArgs.push(`--proxy-server=${anonymizedProxyUrl}`);
|
|
31
111
|
}
|
|
32
112
|
if (ignoreHttpsErrors) {
|
|
33
113
|
browserArgs.push('--ignore-certificate-errors');
|
|
34
|
-
|
|
114
|
+
// disabled because of cloudflare blocking
|
|
115
|
+
// browserArgs.push('--disable-web-security');
|
|
35
116
|
}
|
|
36
117
|
if (headless) {
|
|
37
118
|
browserArgs.push('--headless=new');
|
|
38
|
-
browserArgs.push('--disable-gpu');
|
|
39
119
|
}
|
|
40
120
|
log.debug(`Launching browser with user data dir: ${userDataDir}`);
|
|
41
121
|
log.debug('browserArgs', browserArgs);
|
|
122
|
+
log.debug(`Stealth mode: ${enableStealthMode}, Profile populated: ${shouldPopulateProfile}`);
|
|
42
123
|
const browserProcess = spawn(executablePath, browserArgs, {
|
|
43
124
|
stdio: 'ignore',
|
|
44
|
-
detached: true,
|
|
45
125
|
});
|
|
46
|
-
browserProcess.unref();
|
|
47
126
|
return new BrowserProcess(browserProcess, userDataDir);
|
|
48
127
|
}
|
|
49
128
|
catch (error) {
|
|
@@ -52,8 +131,40 @@ export const launchBrowserWithNewProfile = async (executablePath, options = {})
|
|
|
52
131
|
}
|
|
53
132
|
};
|
|
54
133
|
export const createTempUserDataDir = async () => {
|
|
55
|
-
|
|
134
|
+
// Try to create temp directory in order of preference:
|
|
135
|
+
// 1. Project's temp directory (if we're in a project)
|
|
136
|
+
// 2. User's home directory temp folder
|
|
137
|
+
// 3. System temp directory as fallback
|
|
138
|
+
const tempDirCandidates = [
|
|
139
|
+
// Project temp directory
|
|
140
|
+
path.resolve(process.cwd(), 'temp', 'browser-profiles'),
|
|
141
|
+
// User home temp directory
|
|
142
|
+
path.join(os.homedir(), '.tmp', 'cdp-crawler-browsers'),
|
|
143
|
+
// System temp directory (fallback)
|
|
144
|
+
path.join(os.tmpdir(), 'cdp-crawler-browsers'),
|
|
145
|
+
];
|
|
146
|
+
let baseTempDir = null;
|
|
147
|
+
for (const candidate of tempDirCandidates) {
|
|
148
|
+
try {
|
|
149
|
+
await fs.mkdir(candidate, { recursive: true });
|
|
150
|
+
// Test if we can write to this directory
|
|
151
|
+
const testFile = path.join(candidate, '.write-test');
|
|
152
|
+
await fs.writeFile(testFile, 'test');
|
|
153
|
+
await fs.unlink(testFile);
|
|
154
|
+
baseTempDir = candidate;
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
log.debug(`Cannot use temp directory ${candidate}: ${error}`);
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (!baseTempDir) {
|
|
163
|
+
throw new Error('Could not find a writable directory for browser profiles');
|
|
164
|
+
}
|
|
165
|
+
const tempDirPrefix = path.join(baseTempDir, 'browser_');
|
|
56
166
|
const userDataDir = await fs.mkdtemp(tempDirPrefix);
|
|
167
|
+
log.debug(`Created browser profile directory: ${userDataDir}`);
|
|
57
168
|
return userDataDir;
|
|
58
169
|
};
|
|
59
170
|
export const launchChromeBrowserWithNewProfile = async (options = {}) => {
|