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.
Files changed (234) hide show
  1. package/dist/browser-controller.d.ts +22 -3
  2. package/dist/browser-controller.d.ts.map +1 -1
  3. package/dist/browser-controller.js +316 -71
  4. package/dist/browser-controller.js.map +1 -1
  5. package/dist/browser-plugin.d.ts +56 -7
  6. package/dist/browser-plugin.d.ts.map +1 -1
  7. package/dist/browser-plugin.js +268 -56
  8. package/dist/browser-plugin.js.map +1 -1
  9. package/dist/browser-process/browser.d.ts +39 -0
  10. package/dist/browser-process/browser.d.ts.map +1 -1
  11. package/dist/browser-process/browser.js +127 -16
  12. package/dist/browser-process/browser.js.map +1 -1
  13. package/dist/browser-process/process.d.ts +9 -0
  14. package/dist/browser-process/process.d.ts.map +1 -1
  15. package/dist/browser-process/process.js +100 -6
  16. package/dist/browser-process/process.js.map +1 -1
  17. package/dist/browser-profiles/chrome/default.d.ts +116 -0
  18. package/dist/browser-profiles/chrome/default.d.ts.map +1 -1
  19. package/dist/browser-profiles/chrome/default.js +118 -1
  20. package/dist/browser-profiles/chrome/default.js.map +1 -1
  21. package/dist/browser-profiles/chrome/populate-profile.d.ts +76 -0
  22. package/dist/browser-profiles/chrome/populate-profile.d.ts.map +1 -0
  23. package/dist/browser-profiles/chrome/populate-profile.js +300 -0
  24. package/dist/browser-profiles/chrome/populate-profile.js.map +1 -0
  25. package/dist/browser-profiles/index.d.ts +1 -0
  26. package/dist/browser-profiles/index.d.ts.map +1 -1
  27. package/dist/browser-profiles/index.js +2 -0
  28. package/dist/browser-profiles/index.js.map +1 -1
  29. package/dist/crawler.d.ts +81 -9
  30. package/dist/crawler.d.ts.map +1 -1
  31. package/dist/crawler.js +26 -10
  32. package/dist/crawler.js.map +1 -1
  33. package/dist/fingerprinting/all-fingerprint-defender/_locales/en/messages.json +95 -0
  34. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.d.ts +2 -0
  35. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.d.ts.map +1 -0
  36. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.js +1 -0
  37. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.js.map +1 -0
  38. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.d.ts +2 -0
  39. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.d.ts.map +1 -0
  40. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.js +1 -0
  41. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.js.map +1 -0
  42. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.d.ts +83 -0
  43. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.d.ts.map +1 -0
  44. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.js +1 -0
  45. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.js.map +1 -0
  46. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.d.ts +2 -0
  47. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.d.ts.map +1 -0
  48. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.js +1 -0
  49. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.js.map +1 -0
  50. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.d.ts +2 -0
  51. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.d.ts.map +1 -0
  52. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.js +1 -0
  53. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.js.map +1 -0
  54. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.d.ts +2 -0
  55. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.d.ts.map +1 -0
  56. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.js +1 -0
  57. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.js.map +1 -0
  58. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.d.ts +2 -0
  59. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.d.ts.map +1 -0
  60. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.js +1 -0
  61. package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.js.map +1 -0
  62. package/dist/fingerprinting/all-fingerprint-defender/assets/debounce-09920c81.css +1 -0
  63. package/dist/fingerprinting/all-fingerprint-defender/assets/options-fe2fb5aa.css +1 -0
  64. package/dist/fingerprinting/all-fingerprint-defender/assets/popup-1886d2ef.css +1 -0
  65. package/dist/fingerprinting/all-fingerprint-defender/img/icon-128.png +0 -0
  66. package/dist/fingerprinting/all-fingerprint-defender/img/icon-16.png +0 -0
  67. package/dist/fingerprinting/all-fingerprint-defender/img/icon-24.png +0 -0
  68. package/dist/fingerprinting/all-fingerprint-defender/img/icon-32-disabled.png +0 -0
  69. package/dist/fingerprinting/all-fingerprint-defender/img/icon-32.png +0 -0
  70. package/dist/fingerprinting/all-fingerprint-defender/img/icon-48.png +0 -0
  71. package/dist/fingerprinting/all-fingerprint-defender/manifest.json +83 -0
  72. package/dist/fingerprinting/all-fingerprint-defender/options.html +17 -0
  73. package/dist/fingerprinting/all-fingerprint-defender/popup.html +23 -0
  74. package/dist/fingerprinting/anti-webgpu/background.d.ts +2 -0
  75. package/dist/fingerprinting/anti-webgpu/background.d.ts.map +1 -0
  76. package/dist/fingerprinting/anti-webgpu/background.js +4 -0
  77. package/dist/fingerprinting/anti-webgpu/background.js.map +1 -0
  78. package/dist/fingerprinting/anti-webgpu/data/content_script/inject.d.ts +2 -0
  79. package/dist/fingerprinting/anti-webgpu/data/content_script/inject.d.ts.map +1 -0
  80. package/dist/fingerprinting/anti-webgpu/data/content_script/inject.js +50 -0
  81. package/dist/fingerprinting/anti-webgpu/data/content_script/inject.js.map +1 -0
  82. package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.d.ts +2 -0
  83. package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.d.ts.map +1 -0
  84. package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.js +172 -0
  85. package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.js.map +1 -0
  86. package/dist/fingerprinting/anti-webgpu/data/icons/128.png +0 -0
  87. package/dist/fingerprinting/anti-webgpu/data/icons/16.png +0 -0
  88. package/dist/fingerprinting/anti-webgpu/data/icons/32.png +0 -0
  89. package/dist/fingerprinting/anti-webgpu/data/icons/48.png +0 -0
  90. package/dist/fingerprinting/anti-webgpu/data/icons/64.png +0 -0
  91. package/dist/fingerprinting/anti-webgpu/data/popup/popup.css +88 -0
  92. package/dist/fingerprinting/anti-webgpu/data/popup/popup.d.ts +2 -0
  93. package/dist/fingerprinting/anti-webgpu/data/popup/popup.d.ts.map +1 -0
  94. package/dist/fingerprinting/anti-webgpu/data/popup/popup.html +58 -0
  95. package/dist/fingerprinting/anti-webgpu/data/popup/popup.js +96 -0
  96. package/dist/fingerprinting/anti-webgpu/data/popup/popup.js.map +1 -0
  97. package/dist/fingerprinting/anti-webgpu/lib/chrome.d.ts +2 -0
  98. package/dist/fingerprinting/anti-webgpu/lib/chrome.d.ts.map +1 -0
  99. package/dist/fingerprinting/anti-webgpu/lib/chrome.js +249 -0
  100. package/dist/fingerprinting/anti-webgpu/lib/chrome.js.map +1 -0
  101. package/dist/fingerprinting/anti-webgpu/lib/common.d.ts +2 -0
  102. package/dist/fingerprinting/anti-webgpu/lib/common.d.ts.map +1 -0
  103. package/dist/fingerprinting/anti-webgpu/lib/common.js +86 -0
  104. package/dist/fingerprinting/anti-webgpu/lib/common.js.map +1 -0
  105. package/dist/fingerprinting/anti-webgpu/lib/config.d.ts +2 -0
  106. package/dist/fingerprinting/anti-webgpu/lib/config.d.ts.map +1 -0
  107. package/dist/fingerprinting/anti-webgpu/lib/config.js +14 -0
  108. package/dist/fingerprinting/anti-webgpu/lib/config.js.map +1 -0
  109. package/dist/fingerprinting/anti-webgpu/lib/runtime.d.ts +2 -0
  110. package/dist/fingerprinting/anti-webgpu/lib/runtime.d.ts.map +1 -0
  111. package/dist/fingerprinting/anti-webgpu/lib/runtime.js +107 -0
  112. package/dist/fingerprinting/anti-webgpu/lib/runtime.js.map +1 -0
  113. package/dist/fingerprinting/anti-webgpu/manifest.json +58 -0
  114. package/dist/fingerprinting/custom-fingerprint-injector.d.ts +87 -0
  115. package/dist/fingerprinting/custom-fingerprint-injector.d.ts.map +1 -0
  116. package/dist/fingerprinting/custom-fingerprint-injector.js +342 -0
  117. package/dist/fingerprinting/custom-fingerprint-injector.js.map +1 -0
  118. package/dist/fingerprinting/fingerprint-injector.d.ts +163 -0
  119. package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -0
  120. package/dist/fingerprinting/fingerprint-injector.js +697 -0
  121. package/dist/fingerprinting/fingerprint-injector.js.map +1 -0
  122. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts +6 -0
  123. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts.map +1 -0
  124. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js +119 -0
  125. package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js.map +1 -0
  126. package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts +6 -0
  127. package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts.map +1 -0
  128. package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js +149 -0
  129. package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js.map +1 -0
  130. package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.d.ts +14 -0
  131. package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.d.ts.map +1 -0
  132. package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.js +763 -0
  133. package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.js.map +1 -0
  134. package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts +6 -0
  135. package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts.map +1 -0
  136. package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js +195 -0
  137. package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js.map +1 -0
  138. package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.d.ts +10 -0
  139. package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.d.ts.map +1 -0
  140. package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.js +195 -0
  141. package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.js.map +1 -0
  142. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts +28 -0
  143. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts.map +1 -0
  144. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js +1181 -0
  145. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js.map +1 -0
  146. package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts +7 -0
  147. package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts.map +1 -0
  148. package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js +171 -0
  149. package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js.map +1 -0
  150. package/dist/fingerprinting/fingerprint-overrides/index.d.ts +37 -0
  151. package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -0
  152. package/dist/fingerprinting/fingerprint-overrides/index.js +41 -0
  153. package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -0
  154. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.d.ts +45 -0
  155. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.d.ts.map +1 -0
  156. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js +268 -0
  157. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js.map +1 -0
  158. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts +6 -0
  159. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts.map +1 -0
  160. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js +301 -0
  161. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js.map +1 -0
  162. package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.d.ts +14 -0
  163. package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.d.ts.map +1 -0
  164. package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.js +160 -0
  165. package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.js.map +1 -0
  166. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts +7 -0
  167. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts.map +1 -0
  168. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js +58 -0
  169. package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js.map +1 -0
  170. package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts +6 -0
  171. package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts.map +1 -0
  172. package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js +249 -0
  173. package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js.map +1 -0
  174. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts +33 -0
  175. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -0
  176. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +620 -0
  177. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -0
  178. package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.d.ts +13 -0
  179. package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.d.ts.map +1 -0
  180. package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.js +356 -0
  181. package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.js.map +1 -0
  182. package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts +18 -0
  183. package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts.map +1 -0
  184. package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js +171 -0
  185. package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js.map +1 -0
  186. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.d.ts +55 -0
  187. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.d.ts.map +1 -0
  188. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js +244 -0
  189. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js.map +1 -0
  190. package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts +14 -0
  191. package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -0
  192. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +983 -0
  193. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -0
  194. package/dist/fingerprinting/fingerprint-overrides/storage-consistency.d.ts +13 -0
  195. package/dist/fingerprinting/fingerprint-overrides/storage-consistency.d.ts.map +1 -0
  196. package/dist/fingerprinting/fingerprint-overrides/storage-consistency.js +346 -0
  197. package/dist/fingerprinting/fingerprint-overrides/storage-consistency.js.map +1 -0
  198. package/dist/fingerprinting/fingerprint-overrides/timing-consistency.d.ts +13 -0
  199. package/dist/fingerprinting/fingerprint-overrides/timing-consistency.d.ts.map +1 -0
  200. package/dist/fingerprinting/fingerprint-overrides/timing-consistency.js +264 -0
  201. package/dist/fingerprinting/fingerprint-overrides/timing-consistency.js.map +1 -0
  202. package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts +27 -0
  203. package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts.map +1 -0
  204. package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +213 -0
  205. package/dist/fingerprinting/fingerprint-overrides/ua-ch.js.map +1 -0
  206. package/dist/fingerprinting/fingerprint-overrides/utils.d.ts +12 -0
  207. package/dist/fingerprinting/fingerprint-overrides/utils.d.ts.map +1 -0
  208. package/dist/fingerprinting/fingerprint-overrides/utils.js +517 -0
  209. package/dist/fingerprinting/fingerprint-overrides/utils.js.map +1 -0
  210. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts +12 -0
  211. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -0
  212. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +215 -0
  213. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -0
  214. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts +6 -0
  215. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts.map +1 -0
  216. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js +202 -0
  217. package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js.map +1 -0
  218. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts +6 -0
  219. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts.map +1 -0
  220. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +188 -0
  221. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js.map +1 -0
  222. package/dist/index.d.ts +4 -0
  223. package/dist/index.d.ts.map +1 -1
  224. package/dist/index.js +2 -0
  225. package/dist/index.js.map +1 -1
  226. package/dist/launcher-wrap.d.ts +2 -2
  227. package/dist/launcher-wrap.d.ts.map +1 -1
  228. package/dist/launcher-wrap.js.map +1 -1
  229. package/dist/page.d.ts +160 -13
  230. package/dist/page.d.ts.map +1 -1
  231. package/dist/page.js +1027 -42
  232. package/dist/page.js.map +1 -1
  233. package/dist/tsconfig.build.tsbuildinfo +1 -1
  234. package/package.json +8 -4
@@ -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
- import { launchChromeBrowserWithNewProfile } from './browser-process/browser.js';
7
- export default class CDPBrowserPlugin extends BrowserPlugin {
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 { launchOptions, useIncognitoPages, proxyUrl } = launchContext;
29
- if (!launchOptions.browserType) {
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
- browser = await this._connectWithRetry(debuggingPort, 10, 4000);
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
- await close();
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
- await close();
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({ debuggingPort, anonymizedProxyUrl: proxyUrl, ignoreHttpsErrors, headless, executablePath });
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 cdpLauncher.launch({ port });
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
- lastError = error;
166
- log.warning(`Failed to connect to browser on attempt ${attempt}. Retrying in ${retryDelay}ms...`);
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
- await new Promise(resolve => setTimeout(resolve, retryDelay)); // Wait before retrying
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
- log.error(`Failed to connect to browser after ${maxRetries} attempts.`, lastError);
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;AAG9C,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;CAC3B;AAED,eAAO,MAAM,2BAA2B,mBACpB,MAAM,YACb,oBAAoB,KAC9B,OAAO,CAAC,cAAc,CA6DxB,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAa,OAAO,CAAC,MAAM,CAI5D,CAAC;AAEF,eAAO,MAAM,iCAAiC,aAAmB,oBAAoB,4BAKpF,CAAC"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/browser-process/browser.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;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
- `--user-data-dir=${userDataDir}`,
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
- // '--disable-notifications',
19
- // '--start-maximized',
20
- // '--no-first-run',
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
- if (anonymizedProxyUrl) {
27
- browserArgs.push(`--proxy-server=${anonymizedProxyUrl}`);
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
- browserArgs.push('--disable-web-security');
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
- const tempDirPrefix = path.join(os.tmpdir(), 'browser_');
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 = {}) => {