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 +1 -1
- package/index.d.ts +1 -1
- package/package.json +1 -1
- package/src/blockedPage.js +12 -1
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.
|
|
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",
|
package/src/blockedPage.js
CHANGED
|
@@ -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
|
|
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
|
|