imperium-crawl 2.4.0 → 2.5.2

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 +130 -11
  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,5 +1,5 @@
1
1
  import { generateHeaders } from "./headers.js";
2
- import { isBlocked, needsJSRendering } from "./detector.js";
2
+ import { isBlocked, needsJSRendering, isCaptchaPage } from "./detector.js";
3
3
  import { detectAntiBot, parseCookieNames } from "./antibot-detector.js";
4
4
  import { stealthFetch } from "./tls.js";
5
5
  import { browserFetch, isPlaywrightAvailable } from "./browser.js";
@@ -7,6 +7,7 @@ import { resolveProxy } from "./proxy.js";
7
7
  import { DEFAULT_TIMEOUT_MS } from "../constants.js";
8
8
  import { getDomain } from "../utils/url.js";
9
9
  import { getKnowledgeEngine } from "../knowledge/index.js";
10
+ import { getTwoCaptchaApiKey } from "../config.js";
10
11
  /**
11
12
  * Build a Cookie header string from stored session cookies,
12
13
  * filtering by domain and path match for the given URL.
@@ -46,10 +47,95 @@ async function getSessionCookieHeader(sessionId, url) {
46
47
  const header = buildCookieHeader(session.cookies, url);
47
48
  return header || undefined;
48
49
  }
50
+ /**
51
+ * Parse Set-Cookie headers into StoredCookie objects for accumulation.
52
+ */
53
+ function parseSetCookieHeaders(setCookieHeader, url) {
54
+ if (!setCookieHeader)
55
+ return [];
56
+ const parsed = new URL(url);
57
+ const cookies = [];
58
+ // Set-Cookie headers are joined by comma, but cookie values can contain commas in expires
59
+ // Split carefully: split on commas NOT followed by a space and day-of-week pattern
60
+ const rawCookies = setCookieHeader.split(/,(?=\s*[a-zA-Z_][a-zA-Z0-9_]*=)/);
61
+ for (const raw of rawCookies) {
62
+ const trimmed = raw.trim();
63
+ if (!trimmed)
64
+ continue;
65
+ const parts = trimmed.split(";").map((p) => p.trim());
66
+ const nameValue = parts[0];
67
+ const eqIdx = nameValue.indexOf("=");
68
+ if (eqIdx <= 0)
69
+ continue;
70
+ const name = nameValue.substring(0, eqIdx).trim();
71
+ const value = nameValue.substring(eqIdx + 1).trim();
72
+ const cookie = {
73
+ name,
74
+ value,
75
+ domain: parsed.hostname,
76
+ path: "/",
77
+ };
78
+ // Parse cookie attributes
79
+ for (let i = 1; i < parts.length; i++) {
80
+ const attr = parts[i].toLowerCase();
81
+ if (attr.startsWith("domain=")) {
82
+ cookie.domain = parts[i].substring(7).trim();
83
+ }
84
+ else if (attr.startsWith("path=")) {
85
+ cookie.path = parts[i].substring(5).trim();
86
+ }
87
+ else if (attr.startsWith("expires=")) {
88
+ const expiresStr = parts[i].substring(8).trim();
89
+ const ts = Date.parse(expiresStr);
90
+ if (!isNaN(ts))
91
+ cookie.expires = ts / 1000;
92
+ }
93
+ else if (attr.startsWith("max-age=")) {
94
+ const maxAge = parseInt(parts[i].substring(8).trim(), 10);
95
+ if (!isNaN(maxAge))
96
+ cookie.expires = Date.now() / 1000 + maxAge;
97
+ }
98
+ else if (attr === "httponly") {
99
+ cookie.httpOnly = true;
100
+ }
101
+ else if (attr === "secure") {
102
+ cookie.secure = true;
103
+ }
104
+ else if (attr.startsWith("samesite=")) {
105
+ const ss = parts[i].substring(9).trim();
106
+ if (ss === "Strict" || ss === "Lax" || ss === "None")
107
+ cookie.sameSite = ss;
108
+ }
109
+ }
110
+ cookies.push(cookie);
111
+ }
112
+ return cookies;
113
+ }
114
+ /**
115
+ * Merge new cookies into accumulated map (last write wins per name+domain).
116
+ */
117
+ function mergeAccumulatedCookies(accumulated, newCookies) {
118
+ for (const cookie of newCookies) {
119
+ const key = `${cookie.domain}:${cookie.name}`;
120
+ accumulated.set(key, cookie);
121
+ }
122
+ }
123
+ /**
124
+ * Build a Cookie header string from accumulated cookies for a given URL.
125
+ */
126
+ function buildAccumulatedCookieHeader(accumulated, url) {
127
+ if (accumulated.size === 0)
128
+ return undefined;
129
+ const cookies = Array.from(accumulated.values());
130
+ const header = buildCookieHeader(cookies, url);
131
+ return header || undefined;
132
+ }
49
133
  export class StealthError extends Error {
50
134
  lastLevel;
51
135
  httpStatus;
52
136
  antiBotSystem;
137
+ /** Best partial result collected during escalation, if any */
138
+ partialResult;
53
139
  constructor(message, lastLevel, httpStatus, antiBotSystem) {
54
140
  super(message);
55
141
  this.lastLevel = lastLevel;
@@ -90,12 +176,14 @@ function cacheLevel(url, level) {
90
176
  renderingCache.set(getDomain(url), { level, timestamp: Date.now() });
91
177
  }
92
178
  // ── Level Fetchers ──
93
- async function level1Fetch(url, timeout, proxyUrl, sessionId) {
94
- const headers = generateHeaders();
179
+ async function level1Fetch(url, timeout, proxyUrl, sessionId, accumulatedCookieHeader) {
180
+ const headers = generateHeaders(undefined, url);
95
181
  // Inject session cookies if available
96
- const cookieHeader = await getSessionCookieHeader(sessionId, url);
97
- if (cookieHeader) {
98
- headers["Cookie"] = cookieHeader;
182
+ const sessionCookieHeader = await getSessionCookieHeader(sessionId, url);
183
+ // Merge: session cookies + accumulated cookies (accumulated take precedence)
184
+ const cookieParts = [sessionCookieHeader, accumulatedCookieHeader].filter(Boolean);
185
+ if (cookieParts.length > 0) {
186
+ headers["Cookie"] = cookieParts.join("; ");
99
187
  }
100
188
  const fetchOptions = {
101
189
  headers,
@@ -112,21 +200,44 @@ async function level1Fetch(url, timeout, proxyUrl, sessionId) {
112
200
  const responseHeaders = Object.fromEntries(res.headers.entries());
113
201
  return { html, status: res.status, url: res.url, level: 1, headers: responseHeaders, proxyUsed: proxyUrl };
114
202
  }
115
- async function level2Fetch(url, timeout, proxyUrl, sessionId) {
203
+ async function level2Fetch(url, timeout, proxyUrl, sessionId, accumulatedCookieHeader) {
116
204
  // Inject session cookies as custom headers for Impit
117
- const cookieHeader = await getSessionCookieHeader(sessionId, url);
118
- const extraHeaders = cookieHeader ? { Cookie: cookieHeader } : undefined;
205
+ const sessionCookieHeader = await getSessionCookieHeader(sessionId, url);
206
+ const cookieParts = [sessionCookieHeader, accumulatedCookieHeader].filter(Boolean);
207
+ const extraHeaders = cookieParts.length > 0 ? { Cookie: cookieParts.join("; ") } : undefined;
119
208
  const result = await stealthFetch({ url, timeout, proxyUrl, headers: extraHeaders });
120
209
  return { ...result, level: 2, proxyUsed: proxyUrl };
121
210
  }
122
- async function level3Fetch(url, timeout, screenshot, proxyUrl, chromeProfile) {
123
- const result = await browserFetch(url, { timeout, screenshot, proxyUrl, chromeProfile });
211
+ async function level3Fetch(url, timeout, screenshot, proxyUrl, chromeProfile, accumulatedCookies) {
212
+ const result = await browserFetch(url, {
213
+ timeout,
214
+ screenshot,
215
+ proxyUrl,
216
+ chromeProfile,
217
+ cookies: accumulatedCookies,
218
+ });
124
219
  return { ...result, level: 3, proxyUsed: proxyUrl, chromeProfile: result.chromeProfile };
125
220
  }
126
- // ── Smart Fetch with Cache + Anti-bot Detection ──
127
- function checkResult(result) {
221
+ // ── Smart Fetch with Cache + Anti-bot Detection + Cookie Preservation ──
222
+ function checkResult(result, hasCaptchaKey) {
223
+ const responseHeaders = result.headers || {};
224
+ const blocked = isBlocked(result.html, result.status, responseHeaders);
225
+ // If page has CAPTCHA and we have a key to solve it, don't treat as blocked
226
+ // (L3 browserFetch will handle CAPTCHA solving)
227
+ if (blocked && hasCaptchaKey && isCaptchaPage(result.html)) {
228
+ return false; // Not "ok" yet, but not a hard block — let escalation handle it
229
+ }
230
+ return !blocked && !needsJSRendering(result.html);
231
+ }
232
+ /**
233
+ * Check if a result is blocked specifically by CAPTCHA only (solvable).
234
+ */
235
+ function isBlockedByCaptchaOnly(result) {
128
236
  const responseHeaders = result.headers || {};
129
- return !isBlocked(result.html, result.status, responseHeaders) && !needsJSRendering(result.html);
237
+ if (!isCaptchaPage(result.html))
238
+ return false;
239
+ // If it's a CAPTCHA page, check if removing CAPTCHA indicators would make it "not blocked"
240
+ return isBlocked(result.html, result.status, responseHeaders);
130
241
  }
131
242
  export async function smartFetch(url, options) {
132
243
  const timeout = options?.timeout || DEFAULT_TIMEOUT_MS;
@@ -137,10 +248,42 @@ export async function smartFetch(url, options) {
137
248
  const domain = getDomain(url);
138
249
  const engine = getKnowledgeEngine();
139
250
  const fetchStart = Date.now();
251
+ const hasCaptchaKey = !!getTwoCaptchaApiKey();
252
+ // ── Cookie accumulation across escalation levels ──
253
+ const accumulatedCookies = new Map();
254
+ /** Extract and accumulate cookies from a fetch result */
255
+ function accumulateCookies(result) {
256
+ const setCookie = result.headers?.["set-cookie"];
257
+ if (setCookie) {
258
+ const parsed = parseSetCookieHeaders(setCookie, result.url);
259
+ mergeAccumulatedCookies(accumulatedCookies, parsed);
260
+ }
261
+ }
262
+ /** Get accumulated cookies as header string */
263
+ function getAccumulatedCookieHeader() {
264
+ return buildAccumulatedCookieHeader(accumulatedCookies, url);
265
+ }
266
+ /** Get accumulated cookies as StoredCookie array (for browser injection) */
267
+ function getAccumulatedCookiesArray() {
268
+ if (accumulatedCookies.size === 0)
269
+ return undefined;
270
+ return Array.from(accumulatedCookies.values());
271
+ }
140
272
  // ── Tracking state across escalation ──
141
273
  let detectedAntiBot = null;
142
274
  let lastHttpStatus = 0;
143
275
  let lastLevel = 1;
276
+ let bestPartialResult = null;
277
+ /** Track the best partial result (most content) for error recovery */
278
+ function trackBestResult(result) {
279
+ if (!bestPartialResult || result.html.length > bestPartialResult.html.length) {
280
+ bestPartialResult = result;
281
+ }
282
+ }
283
+ /** Get the best partial result (avoids TS narrowing issues with closured variable) */
284
+ function getBestPartial() {
285
+ return bestPartialResult;
286
+ }
144
287
  /** Record success outcome and return enriched result */
145
288
  function recordSuccess(result) {
146
289
  result.antiBotSystem = detectedAntiBot ?? undefined;
@@ -174,10 +317,12 @@ export async function smartFetch(url, options) {
174
317
  if (cachedLevel && cachedLevel <= maxLevel) {
175
318
  try {
176
319
  const result = await fetchByLevel(url, timeout, cachedLevel, options?.screenshot, proxyUrl, sessionId);
177
- if (checkResult(result)) {
320
+ if (checkResult(result, hasCaptchaKey)) {
178
321
  return recordSuccess(result);
179
322
  }
180
323
  // Cache was wrong — invalidate and fall through to full escalation
324
+ accumulateCookies(result);
325
+ trackBestResult(result);
181
326
  lastHttpStatus = result.status;
182
327
  lastLevel = cachedLevel;
183
328
  renderingCache.delete(getDomain(url));
@@ -192,10 +337,12 @@ export async function smartFetch(url, options) {
192
337
  const startLevel = Math.min(prediction.startLevel, maxLevel);
193
338
  try {
194
339
  const result = await fetchByLevel(url, timeout, startLevel, options?.screenshot, proxyUrl, sessionId);
195
- if (checkResult(result)) {
340
+ if (checkResult(result, hasCaptchaKey)) {
196
341
  cacheLevel(url, startLevel);
197
342
  return recordSuccess(result);
198
343
  }
344
+ accumulateCookies(result);
345
+ trackBestResult(result);
199
346
  lastHttpStatus = result.status;
200
347
  lastLevel = startLevel;
201
348
  // Predicted level failed — fall through to normal escalation
@@ -207,8 +354,10 @@ export async function smartFetch(url, options) {
207
354
  // Level 1: native fetch + realistic headers
208
355
  if (maxLevel >= 1) {
209
356
  try {
210
- const result = await level1Fetch(url, timeout, proxyUrl, sessionId);
211
- if (checkResult(result)) {
357
+ const result = await level1Fetch(url, timeout, proxyUrl, sessionId, getAccumulatedCookieHeader());
358
+ accumulateCookies(result);
359
+ trackBestResult(result);
360
+ if (checkResult(result, hasCaptchaKey)) {
212
361
  cacheLevel(url, 1);
213
362
  return recordSuccess(result);
214
363
  }
@@ -221,10 +370,24 @@ export async function smartFetch(url, options) {
221
370
  if (detection.system !== "none") {
222
371
  detectedAntiBot = detection.system;
223
372
  }
373
+ // If blocked by CAPTCHA only and we have a key, skip to L3 directly
374
+ if (hasCaptchaKey && isBlockedByCaptchaOnly(result) && maxLevel >= 3) {
375
+ if (await isPlaywrightAvailable()) {
376
+ const l3Result = await level3Fetch(url, timeout, options?.screenshot, proxyUrl, undefined, getAccumulatedCookiesArray());
377
+ accumulateCookies(l3Result);
378
+ // If L3 solved CAPTCHA, re-check the result
379
+ if (l3Result.captchaSolved || checkResult(l3Result, false)) {
380
+ cacheLevel(url, 3);
381
+ return recordSuccess(l3Result);
382
+ }
383
+ trackBestResult(l3Result);
384
+ }
385
+ }
224
386
  // If anti-bot detected and recommends Level 3, skip Level 2
225
387
  if (detection.system !== "none" && detection.recommendedLevel === 3 && maxLevel >= 3) {
226
388
  if (await isPlaywrightAvailable()) {
227
- const l3Result = await level3Fetch(url, timeout, options?.screenshot, proxyUrl);
389
+ const l3Result = await level3Fetch(url, timeout, options?.screenshot, proxyUrl, undefined, getAccumulatedCookiesArray());
390
+ accumulateCookies(l3Result);
228
391
  cacheLevel(url, 3);
229
392
  return recordSuccess(l3Result);
230
393
  }
@@ -237,8 +400,10 @@ export async function smartFetch(url, options) {
237
400
  // Level 2: impit TLS stealth
238
401
  if (maxLevel >= 2) {
239
402
  try {
240
- const result = await level2Fetch(url, timeout, proxyUrl, sessionId);
241
- if (checkResult(result)) {
403
+ const result = await level2Fetch(url, timeout, proxyUrl, sessionId, getAccumulatedCookieHeader());
404
+ accumulateCookies(result);
405
+ trackBestResult(result);
406
+ if (checkResult(result, hasCaptchaKey)) {
242
407
  cacheLevel(url, 2);
243
408
  return recordSuccess(result);
244
409
  }
@@ -251,19 +416,27 @@ export async function smartFetch(url, options) {
251
416
  }
252
417
  // Level 3: headless browser
253
418
  if (maxLevel >= 3 && (await isPlaywrightAvailable())) {
254
- const result = await level3Fetch(url, timeout, options?.screenshot, proxyUrl);
419
+ const result = await level3Fetch(url, timeout, options?.screenshot, proxyUrl, undefined, getAccumulatedCookiesArray());
420
+ accumulateCookies(result);
421
+ trackBestResult(result);
422
+ // If CAPTCHA was solved or result is OK, return success
423
+ if (result.captchaSolved || checkResult(result, false)) {
424
+ cacheLevel(url, 3);
425
+ return recordSuccess(result);
426
+ }
427
+ // L3 got content but failed checks — still return if it's the best we have
255
428
  cacheLevel(url, 3);
256
429
  return recordSuccess(result);
257
430
  }
258
431
  // Fallback: return best effort from level 2, then level 1
259
432
  try {
260
- const result = await level2Fetch(url, timeout, proxyUrl, sessionId);
433
+ const result = await level2Fetch(url, timeout, proxyUrl, sessionId, getAccumulatedCookieHeader());
261
434
  lastLevel = 2;
262
435
  return recordSuccess(result);
263
436
  }
264
437
  catch {
265
438
  try {
266
- const result = await level1Fetch(url, timeout, proxyUrl, sessionId);
439
+ const result = await level1Fetch(url, timeout, proxyUrl, sessionId, getAccumulatedCookieHeader());
267
440
  lastLevel = 1;
268
441
  return recordSuccess(result);
269
442
  }
@@ -280,7 +453,16 @@ export async function smartFetch(url, options) {
280
453
  blocked: true,
281
454
  httpStatus: lastHttpStatus,
282
455
  });
283
- throw new StealthError(`All stealth levels failed for ${url}: ${finalErr instanceof Error ? finalErr.message : String(finalErr)}`, lastLevel, lastHttpStatus, detectedAntiBot);
456
+ // If we have a partial result, return it as degraded instead of throwing
457
+ const partial = getBestPartial();
458
+ if (partial && partial.html.length > 100) {
459
+ partial.degraded = true;
460
+ partial.antiBotSystem = detectedAntiBot ?? undefined;
461
+ return partial;
462
+ }
463
+ const error = new StealthError(`All stealth levels failed for ${url}: ${finalErr instanceof Error ? finalErr.message : String(finalErr)}`, lastLevel, lastHttpStatus, detectedAntiBot);
464
+ error.partialResult = partial ?? undefined;
465
+ throw error;
284
466
  }
285
467
  }
286
468
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/stealth/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/stealth/index.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,11 @@
1
1
  /**
2
- * Proxy parsing, validation, and round-robin rotation.
2
+ * Proxy parsing, validation, round-robin rotation with health tracking.
3
3
  *
4
4
  * Supports: http, https, socks4, socks5 proxy URLs.
5
5
  * Priority: per-request override > rotator.next() > undefined (no proxy).
6
+ *
7
+ * Health tracking: each proxy tracks success/failure counts and cooldown.
8
+ * Failed proxies are skipped for COOLDOWN_MS before being retried.
6
9
  */
7
10
  export interface ParsedProxy {
8
11
  url: string;
@@ -12,13 +15,40 @@ export interface ParsedProxy {
12
15
  username?: string;
13
16
  password?: string;
14
17
  }
18
+ interface ProxyHealth {
19
+ successCount: number;
20
+ failureCount: number;
21
+ lastSuccessTime: number;
22
+ lastFailureTime: number;
23
+ cooldownUntil: number;
24
+ }
15
25
  export declare function parseProxyUrl(raw: string): ParsedProxy;
16
26
  export declare class ProxyRotator {
17
27
  private proxies;
18
28
  private index;
29
+ private health;
19
30
  constructor(urls: string[]);
20
31
  get size(): number;
32
+ /**
33
+ * Get next healthy proxy, skipping those in cooldown.
34
+ * If ALL proxies are in cooldown, returns the one whose cooldown expires soonest.
35
+ */
21
36
  next(): ParsedProxy | undefined;
37
+ /**
38
+ * Mark a proxy as having succeeded. Resets its failure state.
39
+ */
40
+ markSuccess(proxyUrl: string): void;
41
+ /**
42
+ * Mark a proxy as having failed. Puts it in cooldown.
43
+ */
44
+ markFailed(proxyUrl: string): void;
45
+ /**
46
+ * Get health stats for all proxies (for debugging/monitoring).
47
+ */
48
+ getHealthStats(): Array<{
49
+ url: string;
50
+ health: ProxyHealth;
51
+ }>;
22
52
  }
23
53
  export declare function initProxyRotator(): void;
24
54
  /**
@@ -26,5 +56,14 @@ export declare function initProxyRotator(): void;
26
56
  * Priority: per-request override > rotator > undefined.
27
57
  */
28
58
  export declare function resolveProxy(override?: string): string | undefined;
59
+ /**
60
+ * Mark a proxy as having succeeded (for health tracking).
61
+ */
62
+ export declare function markProxySuccess(proxyUrl?: string): void;
63
+ /**
64
+ * Mark a proxy as having failed (puts it in cooldown).
65
+ */
66
+ export declare function markProxyFailed(proxyUrl?: string): void;
29
67
  export declare function hasProxyConfigured(): boolean;
68
+ export {};
30
69
  //# sourceMappingURL=proxy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/stealth/proxy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAgBtD;AAID,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,KAAK,CAAK;gBAEN,IAAI,EAAE,MAAM,EAAE;IAW1B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,WAAW,GAAG,SAAS;CAMhC;AAMD,wBAAgB,gBAAgB,IAAI,IAAI,CAmBvC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGlE;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C"}
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/stealth/proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,WAAW;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAQD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAgBtD;AAMD,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,MAAM,CAAkC;gBAEpC,IAAI,EAAE,MAAM,EAAE;IAmB1B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;OAGG;IACH,IAAI,IAAI,WAAW,GAAG,SAAS;IAiC/B;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IASnC;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IASlC;;OAEG;IACH,cAAc,IAAI,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,CAAC;CAM9D;AAMD,wBAAgB,gBAAgB,IAAI,IAAI,CAmBvC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGlE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAIxD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAIvD;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C"}
@@ -1,8 +1,11 @@
1
1
  /**
2
- * Proxy parsing, validation, and round-robin rotation.
2
+ * Proxy parsing, validation, round-robin rotation with health tracking.
3
3
  *
4
4
  * Supports: http, https, socks4, socks5 proxy URLs.
5
5
  * Priority: per-request override > rotator.next() > undefined (no proxy).
6
+ *
7
+ * Health tracking: each proxy tracks success/failure counts and cooldown.
8
+ * Failed proxies are skipped for COOLDOWN_MS before being retried.
6
9
  */
7
10
  function defaultPort(protocol) {
8
11
  if (protocol === "socks4:" || protocol === "socks5:")
@@ -27,15 +30,25 @@ export function parseProxyUrl(raw) {
27
30
  password: parsed.password || undefined,
28
31
  };
29
32
  }
30
- // ── Round-Robin Rotator ──
33
+ // ── Round-Robin Rotator with Health Tracking ──
34
+ const COOLDOWN_MS = 60_000; // 60s cooldown after failure
31
35
  export class ProxyRotator {
32
36
  proxies;
33
37
  index = 0;
38
+ health = new Map();
34
39
  constructor(urls) {
35
40
  this.proxies = [];
36
41
  for (const url of urls) {
37
42
  try {
38
- this.proxies.push(parseProxyUrl(url));
43
+ const proxy = parseProxyUrl(url);
44
+ this.proxies.push(proxy);
45
+ this.health.set(proxy.url, {
46
+ successCount: 0,
47
+ failureCount: 0,
48
+ lastSuccessTime: 0,
49
+ lastFailureTime: 0,
50
+ cooldownUntil: 0,
51
+ });
39
52
  }
40
53
  catch {
41
54
  console.warn(`[imperium-crawl] Skipping invalid proxy URL: ${url}`);
@@ -45,12 +58,67 @@ export class ProxyRotator {
45
58
  get size() {
46
59
  return this.proxies.length;
47
60
  }
61
+ /**
62
+ * Get next healthy proxy, skipping those in cooldown.
63
+ * If ALL proxies are in cooldown, returns the one whose cooldown expires soonest.
64
+ */
48
65
  next() {
49
66
  if (this.proxies.length === 0)
50
67
  return undefined;
51
- const proxy = this.proxies[this.index];
52
- this.index = (this.index + 1) % this.proxies.length;
53
- return proxy;
68
+ const now = Date.now();
69
+ // Try to find a healthy proxy (not in cooldown)
70
+ for (let i = 0; i < this.proxies.length; i++) {
71
+ const idx = (this.index + i) % this.proxies.length;
72
+ const proxy = this.proxies[idx];
73
+ const h = this.health.get(proxy.url);
74
+ if (!h || now >= h.cooldownUntil) {
75
+ this.index = (idx + 1) % this.proxies.length;
76
+ return proxy;
77
+ }
78
+ }
79
+ // All in cooldown — return the one with soonest expiry
80
+ let bestProxy = this.proxies[this.index];
81
+ let soonestCooldown = Infinity;
82
+ for (const proxy of this.proxies) {
83
+ const h = this.health.get(proxy.url);
84
+ if (h && h.cooldownUntil < soonestCooldown) {
85
+ soonestCooldown = h.cooldownUntil;
86
+ bestProxy = proxy;
87
+ }
88
+ }
89
+ this.index = (this.proxies.indexOf(bestProxy) + 1) % this.proxies.length;
90
+ return bestProxy;
91
+ }
92
+ /**
93
+ * Mark a proxy as having succeeded. Resets its failure state.
94
+ */
95
+ markSuccess(proxyUrl) {
96
+ const h = this.health.get(proxyUrl);
97
+ if (h) {
98
+ h.successCount++;
99
+ h.lastSuccessTime = Date.now();
100
+ h.cooldownUntil = 0; // Clear cooldown on success
101
+ }
102
+ }
103
+ /**
104
+ * Mark a proxy as having failed. Puts it in cooldown.
105
+ */
106
+ markFailed(proxyUrl) {
107
+ const h = this.health.get(proxyUrl);
108
+ if (h) {
109
+ h.failureCount++;
110
+ h.lastFailureTime = Date.now();
111
+ h.cooldownUntil = Date.now() + COOLDOWN_MS;
112
+ }
113
+ }
114
+ /**
115
+ * Get health stats for all proxies (for debugging/monitoring).
116
+ */
117
+ getHealthStats() {
118
+ return this.proxies.map((p) => ({
119
+ url: p.url,
120
+ health: this.health.get(p.url),
121
+ }));
54
122
  }
55
123
  }
56
124
  // ── Singleton ──
@@ -82,6 +150,22 @@ export function resolveProxy(override) {
82
150
  return override;
83
151
  return rotator?.next()?.url;
84
152
  }
153
+ /**
154
+ * Mark a proxy as having succeeded (for health tracking).
155
+ */
156
+ export function markProxySuccess(proxyUrl) {
157
+ if (proxyUrl && rotator) {
158
+ rotator.markSuccess(proxyUrl);
159
+ }
160
+ }
161
+ /**
162
+ * Mark a proxy as having failed (puts it in cooldown).
163
+ */
164
+ export function markProxyFailed(proxyUrl) {
165
+ if (proxyUrl && rotator) {
166
+ rotator.markFailed(proxyUrl);
167
+ }
168
+ }
85
169
  export function hasProxyConfigured() {
86
170
  return !!(process.env.PROXY_URL?.trim() || process.env.PROXY_URLS?.trim());
87
171
  }
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/stealth/proxy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/stealth/proxy.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,8 @@ export type ActionInput = {
41
41
  extract_script?: string;
42
42
  max_pages?: number;
43
43
  wait_after_click?: number;
44
+ keywords?: string[];
45
+ max_clicks?: number;
44
46
  cookies?: Array<{
45
47
  name: string;
46
48
  value: string;