crawlforge-extractors 1.11.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -202,7 +202,7 @@ URL is reported in `reason` as a retired handle.
202
202
  ### Recognising a blocked page
203
203
 
204
204
  `documentVerdict` says what a fetched document is: the page, a bot-wall
205
- interstitial (Cloudflare, Amazon, DataDome, PerimeterX, Akamai, Vercel), an
205
+ interstitial (Cloudflare, Amazon, DataDome, PerimeterX, Akamai, Vercel, AWS WAF), an
206
206
  HTTP error page, an empty shell, a short error-titled placeholder, or a
207
207
  client-rendered app's own short error fallback under a normal title (quora.com's
208
208
  "Something went wrong. Wait a moment and try again."). A wall
package/index.d.ts CHANGED
@@ -308,7 +308,7 @@ export default TemplateRegistry;
308
308
 
309
309
  /** The bot-defence vendor whose interstitial a document is, and what gave it away. */
310
310
  export interface ChallengeVerdict {
311
- vendor: 'cloudflare' | 'amazon' | 'datadome' | 'perimeterx' | 'akamai' | 'vercel';
311
+ vendor: 'cloudflare' | 'amazon' | 'datadome' | 'perimeterx' | 'akamai' | 'vercel' | 'aws-waf';
312
312
  evidence: string;
313
313
  }
314
314
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crawlforge-extractors",
3
- "version": "1.11.0",
3
+ "version": "1.12.0",
4
4
  "description": "Extraction logic shared by the CrawlForge MCP server and REST API — scrape templates, charset-correct capped body reading, structural fingerprinting, embedded-state extraction, and query-scoped highlights. One implementation, so the two surfaces cannot drift apart.",
5
5
  "type": "module",
6
6
  "main": "./index.js",
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * blockedPage.js — decide whether a fetched document is the page or a wall.
3
3
  *
4
- * Cloudflare, Amazon, DataDome, PerimeterX, Akamai and Vercel all answer a
4
+ * Cloudflare, Amazon, DataDome, PerimeterX, Akamai, Vercel and AWS WAF answer a
5
5
  * blocked request with HTTP 200 and a page of their own: a title, some prose
6
6
  * and a challenge script. Reported as a successful scrape, that page hides
7
7
  * the block — producthunt.com came back "success:true, title: Just a
@@ -57,6 +57,17 @@ const CHALLENGES = [
57
57
  title: /^vercel security checkpoint/i,
58
58
  markers: /vercel\.link\/security-checkpoint|_vercel\/challenge|x-vercel-challenge-token/i,
59
59
  evidence: 'a Vercel Security Checkpoint page'
60
+ },
61
+ {
62
+ // AWS WAF's challenge action answers with HTTP 202 and a page with no
63
+ // title and no text: `window.gokuProps = {…}` and a token.awswaf.com
64
+ // challenge.js that reloads into the real page about 0.4 s later
65
+ // (amazon.com to headless Chromium, 4 of 4 runs, 2026-10-03). gokuProps
66
+ // is the payload the WAF injects into its own page; a real page that
67
+ // integrates the WAF SDK loads challenge.js without it.
68
+ vendor: 'aws-waf',
69
+ markers: /window\.gokuProps\s*=/,
70
+ evidence: 'an AWS WAF challenge interstitial'
60
71
  }
61
72
  ];
62
73