imperium-crawl 2.4.0 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/README.md +86 -9
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +23 -3
  4. package/dist/cli.js.map +1 -1
  5. package/dist/constants.d.ts +1 -1
  6. package/dist/constants.d.ts.map +1 -1
  7. package/dist/constants.js +31 -1
  8. package/dist/constants.js.map +1 -1
  9. package/dist/flows/engine.d.ts +7 -0
  10. package/dist/flows/engine.d.ts.map +1 -0
  11. package/dist/flows/engine.js +183 -0
  12. package/dist/flows/engine.js.map +1 -0
  13. package/dist/flows/index.d.ts +6 -0
  14. package/dist/flows/index.d.ts.map +1 -0
  15. package/dist/flows/index.js +6 -0
  16. package/dist/flows/index.js.map +1 -0
  17. package/dist/flows/server.d.ts +11 -0
  18. package/dist/flows/server.d.ts.map +1 -0
  19. package/dist/flows/server.js +81 -0
  20. package/dist/flows/server.js.map +1 -0
  21. package/dist/flows/smart-target.d.ts +9 -0
  22. package/dist/flows/smart-target.d.ts.map +1 -0
  23. package/dist/flows/smart-target.js +84 -0
  24. package/dist/flows/smart-target.js.map +1 -0
  25. package/dist/flows/storage.d.ts +26 -0
  26. package/dist/flows/storage.d.ts.map +1 -0
  27. package/dist/flows/storage.js +118 -0
  28. package/dist/flows/storage.js.map +1 -0
  29. package/dist/flows/templates.d.ts +4 -0
  30. package/dist/flows/templates.d.ts.map +1 -0
  31. package/dist/flows/templates.js +35 -0
  32. package/dist/flows/templates.js.map +1 -0
  33. package/dist/flows/types.d.ts +3356 -0
  34. package/dist/flows/types.d.ts.map +1 -0
  35. package/dist/flows/types.js +133 -0
  36. package/dist/flows/types.js.map +1 -0
  37. package/dist/knowledge/store.d.ts +19 -0
  38. package/dist/knowledge/store.d.ts.map +1 -1
  39. package/dist/knowledge/store.js +63 -4
  40. package/dist/knowledge/store.js.map +1 -1
  41. package/dist/sessions/browser-connect.d.ts +30 -0
  42. package/dist/sessions/browser-connect.d.ts.map +1 -0
  43. package/dist/sessions/browser-connect.js +68 -0
  44. package/dist/sessions/browser-connect.js.map +1 -0
  45. package/dist/sessions/browser-state.d.ts +35 -0
  46. package/dist/sessions/browser-state.d.ts.map +1 -0
  47. package/dist/sessions/browser-state.js +74 -0
  48. package/dist/sessions/browser-state.js.map +1 -0
  49. package/dist/sessions/inject-cookies.d.ts +20 -0
  50. package/dist/sessions/inject-cookies.d.ts.map +1 -0
  51. package/dist/sessions/inject-cookies.js +57 -0
  52. package/dist/sessions/inject-cookies.js.map +1 -0
  53. package/dist/sessions/manager.d.ts +11 -1
  54. package/dist/sessions/manager.d.ts.map +1 -1
  55. package/dist/sessions/manager.js +40 -6
  56. package/dist/sessions/manager.js.map +1 -1
  57. package/dist/snapshot/store.d.ts +8 -0
  58. package/dist/snapshot/store.d.ts.map +1 -1
  59. package/dist/snapshot/store.js +48 -0
  60. package/dist/snapshot/store.js.map +1 -1
  61. package/dist/stealth/antibot-detector.d.ts +1 -1
  62. package/dist/stealth/antibot-detector.d.ts.map +1 -1
  63. package/dist/stealth/antibot-detector.js +56 -0
  64. package/dist/stealth/antibot-detector.js.map +1 -1
  65. package/dist/stealth/browser-image-extract.d.ts +43 -0
  66. package/dist/stealth/browser-image-extract.d.ts.map +1 -0
  67. package/dist/stealth/browser-image-extract.js +268 -0
  68. package/dist/stealth/browser-image-extract.js.map +1 -0
  69. package/dist/stealth/browser.d.ts +5 -0
  70. package/dist/stealth/browser.d.ts.map +1 -1
  71. package/dist/stealth/browser.js +82 -1
  72. package/dist/stealth/browser.js.map +1 -1
  73. package/dist/stealth/chrome-profile.d.ts +1 -0
  74. package/dist/stealth/chrome-profile.d.ts.map +1 -1
  75. package/dist/stealth/chrome-profile.js +28 -5
  76. package/dist/stealth/chrome-profile.js.map +1 -1
  77. package/dist/stealth/detector.d.ts +10 -1
  78. package/dist/stealth/detector.d.ts.map +1 -1
  79. package/dist/stealth/detector.js +117 -25
  80. package/dist/stealth/detector.js.map +1 -1
  81. package/dist/stealth/headers.d.ts +1 -1
  82. package/dist/stealth/headers.d.ts.map +1 -1
  83. package/dist/stealth/headers.js +94 -2
  84. package/dist/stealth/headers.js.map +1 -1
  85. package/dist/stealth/index.d.ts +4 -0
  86. package/dist/stealth/index.d.ts.map +1 -1
  87. package/dist/stealth/index.js +207 -25
  88. package/dist/stealth/index.js.map +1 -1
  89. package/dist/stealth/proxy.d.ts +40 -1
  90. package/dist/stealth/proxy.d.ts.map +1 -1
  91. package/dist/stealth/proxy.js +90 -6
  92. package/dist/stealth/proxy.js.map +1 -1
  93. package/dist/tools/action-executor.d.ts +2 -0
  94. package/dist/tools/action-executor.d.ts.map +1 -1
  95. package/dist/tools/action-executor.js +38 -0
  96. package/dist/tools/action-executor.js.map +1 -1
  97. package/dist/tools/batch-download.d.ts +33 -0
  98. package/dist/tools/batch-download.d.ts.map +1 -0
  99. package/dist/tools/batch-download.js +208 -0
  100. package/dist/tools/batch-download.js.map +1 -0
  101. package/dist/tools/browser.d.ts +100 -0
  102. package/dist/tools/browser.d.ts.map +1 -0
  103. package/dist/tools/browser.js +448 -0
  104. package/dist/tools/browser.js.map +1 -0
  105. package/dist/tools/download.d.ts +35 -2
  106. package/dist/tools/download.d.ts.map +1 -1
  107. package/dist/tools/download.js +245 -44
  108. package/dist/tools/download.js.map +1 -1
  109. package/dist/tools/index.d.ts.map +1 -1
  110. package/dist/tools/index.js +23 -0
  111. package/dist/tools/index.js.map +1 -1
  112. package/dist/tools/inspect-flow.d.ts +24 -0
  113. package/dist/tools/inspect-flow.d.ts.map +1 -0
  114. package/dist/tools/inspect-flow.js +23 -0
  115. package/dist/tools/inspect-flow.js.map +1 -0
  116. package/dist/tools/interact.d.ts +28 -15
  117. package/dist/tools/interact.d.ts.map +1 -1
  118. package/dist/tools/interact.js +48 -1
  119. package/dist/tools/interact.js.map +1 -1
  120. package/dist/tools/list-flows.d.ts +21 -0
  121. package/dist/tools/list-flows.d.ts.map +1 -0
  122. package/dist/tools/list-flows.js +18 -0
  123. package/dist/tools/list-flows.js.map +1 -0
  124. package/dist/tools/manifest.d.ts.map +1 -1
  125. package/dist/tools/manifest.js +43 -0
  126. package/dist/tools/manifest.js.map +1 -1
  127. package/dist/tools/monitor.d.ts +46 -0
  128. package/dist/tools/monitor.d.ts.map +1 -0
  129. package/dist/tools/monitor.js +213 -0
  130. package/dist/tools/monitor.js.map +1 -0
  131. package/dist/tools/pdf-extract.d.ts +38 -0
  132. package/dist/tools/pdf-extract.d.ts.map +1 -0
  133. package/dist/tools/pdf-extract.js +244 -0
  134. package/dist/tools/pdf-extract.js.map +1 -0
  135. package/dist/tools/record-flow.d.ts +39 -0
  136. package/dist/tools/record-flow.d.ts.map +1 -0
  137. package/dist/tools/record-flow.js +406 -0
  138. package/dist/tools/record-flow.js.map +1 -0
  139. package/dist/tools/run-flow.d.ts +54 -0
  140. package/dist/tools/run-flow.d.ts.map +1 -0
  141. package/dist/tools/run-flow.js +47 -0
  142. package/dist/tools/run-flow.js.map +1 -0
  143. package/dist/tools/run-skill.d.ts +2 -2
  144. package/dist/tools/run-skill.d.ts.map +1 -1
  145. package/dist/tools/run-skill.js +1 -0
  146. package/dist/tools/run-skill.js.map +1 -1
  147. package/dist/tools/scrape.d.ts.map +1 -1
  148. package/dist/tools/scrape.js +17 -1
  149. package/dist/tools/scrape.js.map +1 -1
  150. package/dist/tools/serve-flow.d.ts +36 -0
  151. package/dist/tools/serve-flow.d.ts.map +1 -0
  152. package/dist/tools/serve-flow.js +42 -0
  153. package/dist/tools/serve-flow.js.map +1 -0
  154. package/dist/tools/validate-flow.d.ts +24 -0
  155. package/dist/tools/validate-flow.d.ts.map +1 -0
  156. package/dist/tools/validate-flow.js +23 -0
  157. package/dist/tools/validate-flow.js.map +1 -0
  158. package/dist/tools/watch.d.ts +68 -0
  159. package/dist/tools/watch.d.ts.map +1 -0
  160. package/dist/tools/watch.js +224 -0
  161. package/dist/tools/watch.js.map +1 -0
  162. package/dist/utils/fetcher.d.ts +13 -4
  163. package/dist/utils/fetcher.d.ts.map +1 -1
  164. package/dist/utils/fetcher.js +121 -24
  165. package/dist/utils/fetcher.js.map +1 -1
  166. package/package.json +15 -4
@@ -1,11 +1,9 @@
1
1
  const BLOCKED_INDICATORS = [
2
2
  "access denied",
3
- "403 forbidden",
4
3
  "captcha",
5
4
  "cf-challenge",
6
5
  "just a moment",
7
6
  "checking your browser",
8
- "blocked",
9
7
  "rate limit",
10
8
  "too many requests",
11
9
  // Extended soft-block patterns
@@ -40,43 +38,137 @@ const SPA_INDICATORS = [
40
38
  "ng-app",
41
39
  'id="__nuxt"',
42
40
  ];
41
+ // ── Anti-bot signal headers that confirm a status code is actually a block ──
42
+ const ANTI_BOT_HEADERS = [
43
+ "cf-ray",
44
+ "cf-mitigated",
45
+ "x-datadome",
46
+ "x-datadome-cid",
47
+ "x-kpsdk-ct",
48
+ "x-sucuri-id",
49
+ "x-distil-cs",
50
+ ];
51
+ /**
52
+ * Extract text content from HTML, stripping script/style tags.
53
+ * Returns the text length and the cleaned text.
54
+ */
55
+ function extractTextContent(html) {
56
+ const bodyMatch = html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
57
+ const content = bodyMatch ? bodyMatch[1] : html;
58
+ const text = content
59
+ .replace(/<script[\s\S]*?<\/script>/gi, "")
60
+ .replace(/<style[\s\S]*?<\/style>/gi, "")
61
+ .replace(/<[^>]*>/g, "")
62
+ .trim();
63
+ return { text, length: text.length };
64
+ }
65
+ /**
66
+ * Count links in HTML.
67
+ */
68
+ function countLinks(html) {
69
+ const matches = html.match(/<a\s/gi);
70
+ return matches ? matches.length : 0;
71
+ }
72
+ /**
73
+ * Check if response headers contain known anti-bot signals.
74
+ */
75
+ function hasAntiBotHeaders(headers) {
76
+ const lowerHeaders = Object.keys(headers).map((k) => k.toLowerCase());
77
+ return ANTI_BOT_HEADERS.some((h) => lowerHeaders.includes(h));
78
+ }
79
+ /**
80
+ * Check if the page has challenge scripts (Cloudflare, DataDome, etc.)
81
+ */
82
+ function hasChallengeScript(html) {
83
+ return (html.includes("/cdn-cgi/challenge-platform/") ||
84
+ html.includes("js.datadome.co") ||
85
+ html.includes("client.perimeterx.net") ||
86
+ html.includes("awswaf") ||
87
+ html.includes("_kpsdk"));
88
+ }
89
+ // ── Legitimate page threshold: pages above this are almost never block pages ──
90
+ const LEGITIMATE_TEXT_THRESHOLD = 5000; // 5KB of text content
91
+ const SMALL_PAGE_THRESHOLD = 5000; // Only check content indicators on small pages
92
+ const MIN_LINKS_FOR_LEGITIMATE = 10;
43
93
  /**
44
94
  * Detect if a response is blocked by anti-bot protection.
45
- * Checks HTTP status, page content, and structural signals.
95
+ *
96
+ * Uses a layered approach to minimize false positives:
97
+ * 1. Status codes (403/429/503) only trigger block if paired with anti-bot signals
98
+ * 2. Content-based checks only run on small pages (<5KB text)
99
+ * 3. Large pages with navigation are treated as legitimate regardless
46
100
  */
47
101
  export function isBlocked(html, status, headers) {
48
- // Hard blocks by status
49
- if (status === 403 || status === 429 || status === 503)
102
+ const responseHeaders = headers || {};
103
+ const hasAntiBot = hasAntiBotHeaders(responseHeaders);
104
+ const hasChallengeJs = hasChallengeScript(html);
105
+ const { text: bodyText, length: textLength } = extractTextContent(html);
106
+ // ── cf-mitigated header is an explicit block signal ──
107
+ if (responseHeaders["cf-mitigated"])
50
108
  return true;
51
- // cf-mitigated header
52
- if (headers && headers["cf-mitigated"])
53
- return true;
54
- const lower = html.toLowerCase();
55
- // Content-based indicators
56
- if (BLOCKED_INDICATORS.some((indicator) => lower.includes(indicator)))
57
- return true;
58
- // Challenge page title patterns
109
+ // ── Status-based detection (only with anti-bot confirmation) ──
110
+ if (status === 403 || status === 429 || status === 503) {
111
+ // If anti-bot headers or challenge scripts present → definitely blocked
112
+ if (hasAntiBot || hasChallengeJs)
113
+ return true;
114
+ // If response body is very small, likely a block page
115
+ if (textLength < SMALL_PAGE_THRESHOLD) {
116
+ // Check title for challenge patterns
117
+ const titleMatch = html.match(/<title[^>]*>(.*?)<\/title>/i);
118
+ if (titleMatch) {
119
+ const title = titleMatch[1].trim();
120
+ if (CHALLENGE_TITLE_PATTERNS.some((p) => p.test(title)))
121
+ return true;
122
+ }
123
+ // Small body + error status + blocked indicators in body → block
124
+ const lower = bodyText.toLowerCase();
125
+ if (BLOCKED_INDICATORS.some((indicator) => lower.includes(indicator)))
126
+ return true;
127
+ }
128
+ // Large 403/503 without anti-bot signals → NOT a block (e.g. custom error page, maintenance)
129
+ return false;
130
+ }
131
+ // ── Legitimate page signals — bail early for large, link-rich pages ──
132
+ if (textLength > LEGITIMATE_TEXT_THRESHOLD && countLinks(html) > MIN_LINKS_FOR_LEGITIMATE) {
133
+ return false;
134
+ }
135
+ // ── Challenge page title patterns (any status) ──
59
136
  const titleMatch = html.match(/<title[^>]*>(.*?)<\/title>/i);
60
137
  if (titleMatch) {
61
138
  const title = titleMatch[1].trim();
62
139
  if (CHALLENGE_TITLE_PATTERNS.some((p) => p.test(title)))
63
140
  return true;
64
141
  }
65
- // Unusually small response body for what should be a full page
66
- // (challenge pages are typically <1KB of real content)
67
- const bodyMatch = html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
68
- if (bodyMatch) {
69
- const bodyContent = bodyMatch[1]
70
- .replace(/<script[\s\S]*?<\/script>/gi, "")
71
- .replace(/<style[\s\S]*?<\/style>/gi, "")
72
- .replace(/<[^>]*>/g, "")
73
- .trim();
74
- // If page has a title but almost no body text, likely a block page
75
- if (titleMatch && bodyContent.length < 50 && status >= 400)
76
- return true;
142
+ // ── Content-based indicators (only for small pages to avoid article false positives) ──
143
+ if (textLength < SMALL_PAGE_THRESHOLD) {
144
+ const lower = bodyText.toLowerCase();
145
+ if (BLOCKED_INDICATORS.some((indicator) => lower.includes(indicator))) {
146
+ // Extra check: if page also has challenge scripts or anti-bot headers → block
147
+ if (hasChallengeJs || hasAntiBot)
148
+ return true;
149
+ // If body is VERY small (<1KB), indicator match is strong enough alone
150
+ if (textLength < 1000)
151
+ return true;
152
+ }
77
153
  }
154
+ // ── Structural check: title but almost no body text on error status ──
155
+ if (titleMatch && textLength < 50 && status >= 400)
156
+ return true;
78
157
  return false;
79
158
  }
159
+ /**
160
+ * Detect if a page contains a CAPTCHA challenge.
161
+ * Separate from isBlocked — a CAPTCHA page CAN be solved, it's not a hard block.
162
+ */
163
+ export function isCaptchaPage(html) {
164
+ const lower = html.toLowerCase();
165
+ return (lower.includes("captcha") ||
166
+ lower.includes("cf-turnstile") ||
167
+ lower.includes("g-recaptcha") ||
168
+ lower.includes("h-captcha") ||
169
+ lower.includes("verify you are human") ||
170
+ lower.includes("please complete the security check"));
171
+ }
80
172
  /**
81
173
  * Detect if a page requires JavaScript rendering to get content.
82
174
  */
@@ -1 +1 @@
1
- {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/stealth/detector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/stealth/detector.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- export declare function generateHeaders(overrides?: Record<string, string>): Record<string, string>;
1
+ export declare function generateHeaders(overrides?: Record<string, string>, url?: string): Record<string, string>;
2
2
  export declare function getRandomUserAgent(): string;
3
3
  //# sourceMappingURL=headers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/stealth/headers.ts"],"names":[],"mappings":"AAYA,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAG1F;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C"}
1
+ {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/stealth/headers.ts"],"names":[],"mappings":"AAuCA,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA4ExG;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C"}
@@ -2,14 +2,106 @@ import { HeaderGenerator } from "header-generator";
2
2
  const generator = new HeaderGenerator({
3
3
  browsers: [
4
4
  { name: "chrome", minVersion: 120 },
5
- { name: "firefox", minVersion: 120 },
5
+ { name: "firefox", minVersion: 121 },
6
6
  { name: "edge", minVersion: 120 },
7
+ { name: "safari", minVersion: 17 },
7
8
  ],
8
9
  devices: ["desktop"],
9
10
  operatingSystems: ["windows", "macos", "linux"],
10
11
  });
11
- export function generateHeaders(overrides) {
12
+ /**
13
+ * Parse Chrome major version from User-Agent string.
14
+ */
15
+ function parseChromeVersion(ua) {
16
+ const match = ua.match(/Chrome\/(\d+)/);
17
+ return match ? match[1] : null;
18
+ }
19
+ /**
20
+ * Detect platform from User-Agent for sec-ch-ua-platform.
21
+ */
22
+ function detectPlatform(ua) {
23
+ if (ua.includes("Windows"))
24
+ return '"Windows"';
25
+ if (ua.includes("Macintosh") || ua.includes("Mac OS"))
26
+ return '"macOS"';
27
+ if (ua.includes("Linux"))
28
+ return '"Linux"';
29
+ return '"Windows"';
30
+ }
31
+ /**
32
+ * Build sec-ch-ua hint from Chrome version.
33
+ * Matches real Chrome's format with Chromium brand + version.
34
+ */
35
+ function buildSecChUa(majorVersion) {
36
+ return `"Chromium";v="${majorVersion}", "Google Chrome";v="${majorVersion}", "Not-A.Brand";v="99"`;
37
+ }
38
+ export function generateHeaders(overrides, url) {
12
39
  const headers = generator.getHeaders();
40
+ // ── Add Client Hints if Chrome/Edge UA detected ──
41
+ const ua = headers["user-agent"] || "";
42
+ const chromeVersion = parseChromeVersion(ua);
43
+ if (chromeVersion) {
44
+ // sec-ch-ua hints — must be consistent with User-Agent
45
+ headers["sec-ch-ua"] = buildSecChUa(chromeVersion);
46
+ headers["sec-ch-ua-mobile"] = "?0";
47
+ headers["sec-ch-ua-platform"] = detectPlatform(ua);
48
+ }
49
+ // ── URL-aware header enrichment ──
50
+ if (url) {
51
+ try {
52
+ const parsed = new URL(url);
53
+ const hostname = parsed.hostname;
54
+ // Add origin-based Referer for API endpoints and .gov sites
55
+ if (hostname.endsWith(".gov") || hostname.endsWith(".gov.com") ||
56
+ parsed.pathname.includes(".ashx") || parsed.pathname.includes("/api/") ||
57
+ parsed.pathname.includes("/proxy") || parsed.pathname.includes("Proxy")) {
58
+ headers["referer"] = `${parsed.origin}/`;
59
+ headers["origin"] = parsed.origin;
60
+ }
61
+ // .gov sites: add DNT and cache-control for less aggressive fingerprint
62
+ if (hostname.endsWith(".gov")) {
63
+ headers["dnt"] = "1";
64
+ headers["cache-control"] = "no-cache";
65
+ }
66
+ }
67
+ catch {
68
+ // Invalid URL, skip enrichment
69
+ }
70
+ }
71
+ // ── Standard Accept headers ──
72
+ if (!headers["accept"]) {
73
+ headers["accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8";
74
+ }
75
+ if (!headers["accept-language"]) {
76
+ headers["accept-language"] = "en-US,en;q=0.9";
77
+ }
78
+ if (!headers["accept-encoding"]) {
79
+ headers["accept-encoding"] = "gzip, deflate, br";
80
+ }
81
+ // ── Navigation headers ──
82
+ headers["sec-fetch-dest"] = "document";
83
+ headers["sec-fetch-mode"] = "navigate";
84
+ headers["sec-fetch-site"] = headers["referer"] ? "same-origin" : "none";
85
+ headers["sec-fetch-user"] = "?1";
86
+ headers["upgrade-insecure-requests"] = "1";
87
+ headers["priority"] = "u=0, i";
88
+ // ── Additional realistic browser headers ──
89
+ // sec-gpc: Global Privacy Control — sent by Chrome/Firefox for GDPR compliance
90
+ headers["sec-gpc"] = "1";
91
+ // te: trailers — real Chrome sends this on HTTP/2+ requests
92
+ headers["te"] = "trailers";
93
+ // pragma for HTTP/1.1 backwards compatibility with older proxies/caches
94
+ if (!headers["pragma"]) {
95
+ headers["pragma"] = "no-cache";
96
+ }
97
+ // cache-control — real browsers send this on navigations
98
+ if (!headers["cache-control"]) {
99
+ headers["cache-control"] = "max-age=0";
100
+ }
101
+ // x-requested-with is sent by some sites to identify non-AJAX vs AJAX
102
+ delete headers["x-requested-with"];
103
+ // Remove any non-standard headers that could fingerprint the scraper
104
+ delete headers["x-devtools-emulate-network-conditions-client-id"];
13
105
  return { ...headers, ...overrides };
14
106
  }
15
107
  export function getRandomUserAgent() {
@@ -1 +1 @@
1
- {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../src/stealth/headers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC;IACpC,QAAQ,EAAE;QACR,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE;QACnC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE;QACpC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE;KAClC;IACD,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,gBAAgB,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC;CAChD,CAAC,CAAC;AAEH,MAAM,UAAU,eAAe,CAAC,SAAkC;IAChE,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC;IACvC,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,SAAS,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC;IACvC,OAAO,OAAO,CAAC,YAAY,CAAC,IAAI,8DAA8D,CAAC;AACjG,CAAC"}
1
+ {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../src/stealth/headers.ts"],"names":[],"mappings":"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"}
@@ -10,11 +10,15 @@ export interface FetchResult {
10
10
  proxyUsed?: string;
11
11
  chromeProfile?: string;
12
12
  antiBotSystem?: string;
13
+ /** Indicates the result may be incomplete due to partial failure */
14
+ degraded?: boolean;
13
15
  }
14
16
  export declare class StealthError extends Error {
15
17
  readonly lastLevel: StealthLevel;
16
18
  readonly httpStatus: number;
17
19
  readonly antiBotSystem: string | null;
20
+ /** Best partial result collected during escalation, if any */
21
+ partialResult?: FetchResult;
18
22
  constructor(message: string, lastLevel: StealthLevel, httpStatus: number, antiBotSystem: string | null);
19
23
  }
20
24
  export interface StealthOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stealth/index.ts"],"names":[],"mappings":"AAgDA,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAErC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,YAAY,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,YAAa,SAAQ,KAAK;aAGnB,SAAS,EAAE,YAAY;aACvB,UAAU,EAAE,MAAM;aAClB,aAAa,EAAE,MAAM,GAAG,IAAI;gBAH5C,OAAO,EAAE,MAAM,EACC,SAAS,EAAE,YAAY,EACvB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GAAG,IAAI;CAK/C;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkGD,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAyK5F;AAoBD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stealth/index.ts"],"names":[],"mappings":"AAsIA,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAErC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,YAAY,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,YAAa,SAAQ,KAAK;aAMnB,SAAS,EAAE,YAAY;aACvB,UAAU,EAAE,MAAM;aAClB,aAAa,EAAE,MAAM,GAAG,IAAI;IAP9C,8DAA8D;IACvD,aAAa,CAAC,EAAE,WAAW,CAAC;gBAGjC,OAAO,EAAE,MAAM,EACC,SAAS,EAAE,YAAY,EACvB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GAAG,IAAI;CAK/C;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA0ID,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAmQ5F;AAoBD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC"}