imperium-crawl 1.0.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/LICENSE +21 -0
- package/README.md +221 -0
- package/dist/brave-api/index.d.ts +6 -0
- package/dist/brave-api/index.d.ts.map +1 -0
- package/dist/brave-api/index.js +31 -0
- package/dist/brave-api/index.js.map +1 -0
- package/dist/captcha/detector.d.ts +25 -0
- package/dist/captcha/detector.d.ts.map +1 -0
- package/dist/captcha/detector.js +137 -0
- package/dist/captcha/detector.js.map +1 -0
- package/dist/captcha/index.d.ts +31 -0
- package/dist/captcha/index.d.ts.map +1 -0
- package/dist/captcha/index.js +281 -0
- package/dist/captcha/index.js.map +1 -0
- package/dist/captcha/solver.d.ts +53 -0
- package/dist/captcha/solver.d.ts.map +1 -0
- package/dist/captcha/solver.js +164 -0
- package/dist/captcha/solver.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +25 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +13 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +13 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/protocols/http.d.ts +3 -0
- package/dist/protocols/http.d.ts.map +1 -0
- package/dist/protocols/http.js +21 -0
- package/dist/protocols/http.js.map +1 -0
- package/dist/protocols/index.d.ts +3 -0
- package/dist/protocols/index.d.ts.map +1 -0
- package/dist/protocols/index.js +3 -0
- package/dist/protocols/index.js.map +1 -0
- package/dist/protocols/stdio.d.ts +3 -0
- package/dist/protocols/stdio.d.ts.map +1 -0
- package/dist/protocols/stdio.js +6 -0
- package/dist/protocols/stdio.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +26 -0
- package/dist/server.js.map +1 -0
- package/dist/skills/detector.d.ts +12 -0
- package/dist/skills/detector.d.ts.map +1 -0
- package/dist/skills/detector.js +172 -0
- package/dist/skills/detector.js.map +1 -0
- package/dist/skills/manager.d.ts +24 -0
- package/dist/skills/manager.d.ts.map +1 -0
- package/dist/skills/manager.js +58 -0
- package/dist/skills/manager.js.map +1 -0
- package/dist/stealth/antibot-detector.d.ts +17 -0
- package/dist/stealth/antibot-detector.d.ts.map +1 -0
- package/dist/stealth/antibot-detector.js +97 -0
- package/dist/stealth/antibot-detector.js.map +1 -0
- package/dist/stealth/browser.d.ts +16 -0
- package/dist/stealth/browser.d.ts.map +1 -0
- package/dist/stealth/browser.js +89 -0
- package/dist/stealth/browser.js.map +1 -0
- package/dist/stealth/detector.d.ts +10 -0
- package/dist/stealth/detector.d.ts.map +1 -0
- package/dist/stealth/detector.js +94 -0
- package/dist/stealth/detector.js.map +1 -0
- package/dist/stealth/headers.d.ts +3 -0
- package/dist/stealth/headers.d.ts.map +1 -0
- package/dist/stealth/headers.js +19 -0
- package/dist/stealth/headers.js.map +1 -0
- package/dist/stealth/index.d.ts +19 -0
- package/dist/stealth/index.d.ts.map +1 -0
- package/dist/stealth/index.js +144 -0
- package/dist/stealth/index.js.map +1 -0
- package/dist/stealth/tls.d.ts +12 -0
- package/dist/stealth/tls.d.ts.map +1 -0
- package/dist/stealth/tls.js +16 -0
- package/dist/stealth/tls.js.map +1 -0
- package/dist/tools/crawl.d.ts +27 -0
- package/dist/tools/crawl.d.ts.map +1 -0
- package/dist/tools/crawl.js +160 -0
- package/dist/tools/crawl.js.map +1 -0
- package/dist/tools/create-skill.d.ts +27 -0
- package/dist/tools/create-skill.d.ts.map +1 -0
- package/dist/tools/create-skill.js +111 -0
- package/dist/tools/create-skill.js.map +1 -0
- package/dist/tools/discover-apis.d.ts +30 -0
- package/dist/tools/discover-apis.d.ts.map +1 -0
- package/dist/tools/discover-apis.js +199 -0
- package/dist/tools/discover-apis.js.map +1 -0
- package/dist/tools/extract.d.ts +24 -0
- package/dist/tools/extract.d.ts.map +1 -0
- package/dist/tools/extract.js +72 -0
- package/dist/tools/extract.js.map +1 -0
- package/dist/tools/image-search.d.ts +24 -0
- package/dist/tools/image-search.d.ts.map +1 -0
- package/dist/tools/image-search.js +31 -0
- package/dist/tools/image-search.js.map +1 -0
- package/dist/tools/index.d.ts +16 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +39 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-skills.d.ts +12 -0
- package/dist/tools/list-skills.d.ts.map +1 -0
- package/dist/tools/list-skills.js +40 -0
- package/dist/tools/list-skills.js.map +1 -0
- package/dist/tools/map.d.ts +24 -0
- package/dist/tools/map.d.ts.map +1 -0
- package/dist/tools/map.js +87 -0
- package/dist/tools/map.js.map +1 -0
- package/dist/tools/monitor-websocket.d.ts +30 -0
- package/dist/tools/monitor-websocket.d.ts.map +1 -0
- package/dist/tools/monitor-websocket.js +111 -0
- package/dist/tools/monitor-websocket.js.map +1 -0
- package/dist/tools/news-search.d.ts +27 -0
- package/dist/tools/news-search.d.ts.map +1 -0
- package/dist/tools/news-search.js +36 -0
- package/dist/tools/news-search.js.map +1 -0
- package/dist/tools/query-api.d.ts +36 -0
- package/dist/tools/query-api.d.ts.map +1 -0
- package/dist/tools/query-api.js +116 -0
- package/dist/tools/query-api.js.map +1 -0
- package/dist/tools/readability.d.ts +21 -0
- package/dist/tools/readability.d.ts.map +1 -0
- package/dist/tools/readability.js +69 -0
- package/dist/tools/readability.js.map +1 -0
- package/dist/tools/run-skill.d.ts +24 -0
- package/dist/tools/run-skill.d.ts.map +1 -0
- package/dist/tools/run-skill.js +86 -0
- package/dist/tools/run-skill.js.map +1 -0
- package/dist/tools/scrape.d.ts +30 -0
- package/dist/tools/scrape.d.ts.map +1 -0
- package/dist/tools/scrape.js +83 -0
- package/dist/tools/scrape.js.map +1 -0
- package/dist/tools/screenshot.d.ts +27 -0
- package/dist/tools/screenshot.d.ts.map +1 -0
- package/dist/tools/screenshot.js +46 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/search.d.ts +27 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +36 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/video-search.d.ts +27 -0
- package/dist/tools/video-search.d.ts.map +1 -0
- package/dist/tools/video-search.js +36 -0
- package/dist/tools/video-search.js.map +1 -0
- package/dist/utils/fetcher.d.ts +15 -0
- package/dist/utils/fetcher.d.ts.map +1 -0
- package/dist/utils/fetcher.js +123 -0
- package/dist/utils/fetcher.js.map +1 -0
- package/dist/utils/markdown.d.ts +7 -0
- package/dist/utils/markdown.d.ts.map +1 -0
- package/dist/utils/markdown.js +62 -0
- package/dist/utils/markdown.js.map +1 -0
- package/dist/utils/robots.d.ts +3 -0
- package/dist/utils/robots.d.ts.map +1 -0
- package/dist/utils/robots.js +42 -0
- package/dist/utils/robots.js.map +1 -0
- package/dist/utils/structured-data.d.ts +17 -0
- package/dist/utils/structured-data.d.ts.map +1 -0
- package/dist/utils/structured-data.js +123 -0
- package/dist/utils/structured-data.js.map +1 -0
- package/dist/utils/url.d.ts +23 -0
- package/dist/utils/url.d.ts.map +1 -0
- package/dist/utils/url.js +114 -0
- package/dist/utils/url.js.map +1 -0
- package/package.json +65 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 ceoimperiumprojects
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# imperium-crawl
|
|
2
|
+
|
|
3
|
+
The most powerful open-source MCP server for web scraping, crawling, and data extraction. **16 tools. Zero API keys required for scraping. One `npx` command to install.**
|
|
4
|
+
|
|
5
|
+
While others charge $19+/month for basic scraping, imperium-crawl gives you **more features for free** — including capabilities that no other MCP server offers at any price.
|
|
6
|
+
|
|
7
|
+
## vs. The Competition
|
|
8
|
+
|
|
9
|
+
| Feature | **imperium-crawl** | Firecrawl MCP | fetch MCP | Crawl4AI MCP | Browserbase MCP |
|
|
10
|
+
|---------|:------------------:|:-------------:|:---------:|:------------:|:---------------:|
|
|
11
|
+
| Price | **Free forever** | $19+/month | Free | Free | $0.01/min |
|
|
12
|
+
| Scraping tools | **6** | 3 | 1 | 1 | 1 |
|
|
13
|
+
| Search tools | **4** | 0 | 0 | 0 | 0 |
|
|
14
|
+
| Stealth levels | **3 (auto-escalate)** | Cloud-based | None | 1 | Cloud-based |
|
|
15
|
+
| Anti-bot detection | **7 systems** | Partial | None | Partial | Partial |
|
|
16
|
+
| TLS fingerprinting | **Yes (JA3/JA4)** | No | No | No | No |
|
|
17
|
+
| CAPTCHA auto-solving | **Yes (2Captcha)** | No | No | No | No |
|
|
18
|
+
| API discovery from network traffic | **Yes** | No | No | No | No |
|
|
19
|
+
| WebSocket monitoring | **Yes** | No | No | No | No |
|
|
20
|
+
| Direct API calls | **Yes** | No | No | No | No |
|
|
21
|
+
| Reusable skills system | **Yes** | No | No | No | No |
|
|
22
|
+
| Structured data extraction (JSON-LD/OG) | **Yes** | Partial | No | No | No |
|
|
23
|
+
| Priority-based crawling | **Yes** | No | No | No | No |
|
|
24
|
+
| Circuit breaker + jitter backoff | **Yes** | No | No | No | No |
|
|
25
|
+
| URL normalization (11 steps) | **Yes** | No | No | No | No |
|
|
26
|
+
| Self-hosted | **Yes** | No | N/A | Yes | No |
|
|
27
|
+
| Requires external service | **No** | Yes | No | No | Yes |
|
|
28
|
+
| Total tools | **16** | 5 | 2 | 2 | 4 |
|
|
29
|
+
|
|
30
|
+
> **TLDR:** More tools, more features, zero cost, no external dependencies. Self-hosted, open-source, and it runs on your machine.
|
|
31
|
+
|
|
32
|
+
## Installation
|
|
33
|
+
|
|
34
|
+
Add to your MCP client config (Claude Code, Cursor, VS Code, Windsurf, or any MCP client):
|
|
35
|
+
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"mcpServers": {
|
|
39
|
+
"imperium-crawl": {
|
|
40
|
+
"type": "stdio",
|
|
41
|
+
"command": "npx",
|
|
42
|
+
"args": ["-y", "imperium-crawl"],
|
|
43
|
+
"env": {
|
|
44
|
+
"BRAVE_API_KEY": "your-brave-api-key"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
> **API keys are optional.** Without `BRAVE_API_KEY`, only the 4 search tools are disabled. All 12 other tools work out of the box.
|
|
52
|
+
|
|
53
|
+
### Enable full stealth (Level 3 — headless browser)
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npm i rebrowser-playwright
|
|
57
|
+
npx playwright install chromium
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Enable CAPTCHA auto-solving
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# Add to your MCP config env:
|
|
64
|
+
"TWOCAPTCHA_API_KEY": "your-2captcha-api-key"
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Supports reCAPTCHA v2/v3, hCaptcha, and Cloudflare Turnstile. Auto-detects CAPTCHA type and solves transparently.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 16 Tools
|
|
72
|
+
|
|
73
|
+
### Scraping (no API key needed)
|
|
74
|
+
|
|
75
|
+
| Tool | What It Does |
|
|
76
|
+
|------|-------------|
|
|
77
|
+
| **scrape** | URL to clean Markdown/HTML with 3-level auto-escalating stealth. Returns structured data (JSON-LD, OpenGraph, Microdata), metadata, and links on request. |
|
|
78
|
+
| **crawl** | Priority-based crawling with depth control, concurrency limiting, and smart URL scoring. Content paths rank higher, tracking params are stripped. |
|
|
79
|
+
| **map** | Discover all URLs on a domain via sitemap.xml parsing + page link extraction. |
|
|
80
|
+
| **extract** | CSS selectors to structured JSON. Point at any repeating pattern and get clean data. |
|
|
81
|
+
| **readability** | Mozilla Readability article extraction — title, author, content, publish date. 3x faster with linkedom. |
|
|
82
|
+
| **screenshot** | Full-page or viewport PNG screenshots via headless Chromium. |
|
|
83
|
+
|
|
84
|
+
### Search (requires free Brave API key)
|
|
85
|
+
|
|
86
|
+
| Tool | What It Does |
|
|
87
|
+
|------|-------------|
|
|
88
|
+
| **search** | Web search via Brave Search API. |
|
|
89
|
+
| **news_search** | News-specific search with freshness ranking. |
|
|
90
|
+
| **image_search** | Image search with thumbnails and source URLs. |
|
|
91
|
+
| **video_search** | Video search across platforms. |
|
|
92
|
+
|
|
93
|
+
### Skills (no API key needed)
|
|
94
|
+
|
|
95
|
+
| Tool | What It Does |
|
|
96
|
+
|------|-------------|
|
|
97
|
+
| **create_skill** | Analyze any page, auto-detect repeating patterns (articles, products, listings), generate CSS selectors, and save as a reusable skill. |
|
|
98
|
+
| **run_skill** | Run a saved skill to get fresh structured data instantly. Supports pagination. |
|
|
99
|
+
| **list_skills** | List all saved skills with their configurations. |
|
|
100
|
+
|
|
101
|
+
### API Discovery & Real-Time (no API key needed, requires Playwright)
|
|
102
|
+
|
|
103
|
+
| Tool | What It Does |
|
|
104
|
+
|------|-------------|
|
|
105
|
+
| **discover_apis** | Navigate to any page, intercept all XHR/fetch calls, and map every hidden REST/GraphQL API endpoint. Auto-detects GraphQL, filters noise, returns response previews. **No other MCP server does this.** |
|
|
106
|
+
| **query_api** | Call any API endpoint directly with stealth headers. Bypass DOM rendering entirely for 10x faster data access. Use after `discover_apis` to hit endpoints directly. |
|
|
107
|
+
| **monitor_websocket** | Capture real-time WebSocket messages from any page — financial tickers, chat feeds, live dashboards. Returns connection details and message payloads. **No other MCP server does this.** |
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Stealth Engine
|
|
112
|
+
|
|
113
|
+
imperium-crawl uses a 3-level stealth system that **auto-escalates** based on the target site's defenses:
|
|
114
|
+
|
|
115
|
+
| Level | Method | What It Defeats |
|
|
116
|
+
|-------|--------|-----------------|
|
|
117
|
+
| **1** | `header-generator` — Bayesian realistic headers + UA rotation | Basic bot detection, simple WAFs |
|
|
118
|
+
| **2** | `impit` — browser-identical TLS fingerprints (JA3/JA4) | Cloudflare, Akamai, TLS fingerprinting WAFs |
|
|
119
|
+
| **3** | `rebrowser-playwright` + `fingerprint-injector` + auto CAPTCHA solving | JavaScript challenges, SPAs, advanced anti-bot, CAPTCHAs |
|
|
120
|
+
|
|
121
|
+
### Anti-Bot System Detection
|
|
122
|
+
|
|
123
|
+
Automatically identifies which anti-bot system a site uses and chooses the optimal strategy:
|
|
124
|
+
|
|
125
|
+
| System | Detection Method |
|
|
126
|
+
|--------|-----------------|
|
|
127
|
+
| **Cloudflare** | `cf_clearance` cookies, `cf-mitigated` header, challenge page title |
|
|
128
|
+
| **Akamai** | `_abck`, `bm_sz` cookies |
|
|
129
|
+
| **PerimeterX / HUMAN** | `_px` cookies, `_pxhd` headers |
|
|
130
|
+
| **DataDome** | `datadome` cookies, `datadome` response header |
|
|
131
|
+
| **Kasada** | `x-kpsdk-*` headers |
|
|
132
|
+
| **AWS WAF** | `aws-waf-token` cookie |
|
|
133
|
+
| **F5 / Shape Security** | `TS` prefix cookies |
|
|
134
|
+
|
|
135
|
+
### Smart Rendering Cache
|
|
136
|
+
|
|
137
|
+
Once imperium-crawl determines a domain needs Level 3 (browser), it **caches that decision** for 1 hour. Subsequent requests to the same domain skip straight to browser rendering — no wasted time on failed lower levels.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Skills System
|
|
142
|
+
|
|
143
|
+
Skills let you teach imperium-crawl how to extract data from any website, then re-run it for fresh content whenever you want.
|
|
144
|
+
|
|
145
|
+
**Create a skill:**
|
|
146
|
+
```
|
|
147
|
+
create_skill({
|
|
148
|
+
url: "https://techcrunch.com/category/artificial-intelligence",
|
|
149
|
+
name: "tc-ai-news",
|
|
150
|
+
description: "Latest AI news from TechCrunch"
|
|
151
|
+
})
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
The tool analyzes the page, auto-detects repeating elements (articles, products, listings), generates CSS selectors for each field, and saves the skill config.
|
|
155
|
+
|
|
156
|
+
**Run a skill:**
|
|
157
|
+
```
|
|
158
|
+
run_skill({ name: "tc-ai-news" })
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Returns fresh structured data with all detected fields. Skills are saved in `~/.imperium-crawl/skills/` as JSON files — human-readable, editable, and portable.
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## API Discovery Workflow
|
|
166
|
+
|
|
167
|
+
This is the workflow that no other MCP server supports:
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
1. discover_apis({ url: "https://github.com/anthropics" })
|
|
171
|
+
→ Finds 5 hidden JSON API endpoints (refs, tree-commit-info, overview-files...)
|
|
172
|
+
|
|
173
|
+
2. query_api({ url: "https://github.com/.../refs", method: "GET" })
|
|
174
|
+
→ Direct API call, bypasses DOM entirely — 10x faster, structured JSON response
|
|
175
|
+
|
|
176
|
+
3. monitor_websocket({ url: "https://binance.com/en/trade/BTC_USDT", duration_seconds: 10 })
|
|
177
|
+
→ Captures 38 real-time WebSocket messages from 3 connections
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Turn any website into an API. No documentation needed.
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Resilience
|
|
185
|
+
|
|
186
|
+
- **Exponential backoff with full jitter** — AWS-recommended retry pattern, no thundering herd
|
|
187
|
+
- **Per-domain circuit breaker** — 5 consecutive failures opens the circuit for 60s, then half-open probing
|
|
188
|
+
- **URL normalization** — 11-step pipeline removes tracking params (utm_*, fbclid, gclid), sorts query params, normalizes encoding
|
|
189
|
+
- **Concurrency limiting** — per-domain request throttling via p-queue
|
|
190
|
+
- **robots.txt** — respected by default (configurable)
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Environment Variables
|
|
195
|
+
|
|
196
|
+
| Variable | Required | Description |
|
|
197
|
+
|----------|----------|-------------|
|
|
198
|
+
| `BRAVE_API_KEY` | No | Brave Search API key (enables 4 search tools) |
|
|
199
|
+
| `TWOCAPTCHA_API_KEY` | No | 2Captcha API key (enables auto CAPTCHA solving) |
|
|
200
|
+
| `TRANSPORT` | No | `stdio` (default) or `http` |
|
|
201
|
+
| `PORT` | No | HTTP port (default: 3000) |
|
|
202
|
+
| `RESPECT_ROBOTS` | No | Respect robots.txt (default: `true`) |
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Development
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
git clone https://github.com/AiExperts/imperium-crawl
|
|
210
|
+
cd imperium-crawl
|
|
211
|
+
npm install
|
|
212
|
+
npm run build
|
|
213
|
+
npm test # 120 tests
|
|
214
|
+
npm start
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## License
|
|
220
|
+
|
|
221
|
+
MIT — use it however you want. Free forever.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare class BraveApiError extends Error {
|
|
2
|
+
status: number;
|
|
3
|
+
constructor(status: number, message: string);
|
|
4
|
+
}
|
|
5
|
+
export declare function issueRequest(apiKey: string, endpoint: string, params: Record<string, string | number | undefined>): Promise<unknown>;
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/brave-api/index.ts"],"names":[],"mappings":"AAEA,qBAAa,aAAc,SAAQ,KAAK;IAE7B,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAKlB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,GAClD,OAAO,CAAC,OAAO,CAAC,CAuBlB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { BRAVE_API_BASE } from "../constants.js";
|
|
2
|
+
export class BraveApiError extends Error {
|
|
3
|
+
status;
|
|
4
|
+
constructor(status, message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.status = status;
|
|
7
|
+
this.name = "BraveApiError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export async function issueRequest(apiKey, endpoint, params) {
|
|
11
|
+
const url = new URL(`${BRAVE_API_BASE}${endpoint}`);
|
|
12
|
+
for (const [key, value] of Object.entries(params)) {
|
|
13
|
+
if (value !== undefined) {
|
|
14
|
+
url.searchParams.set(key, String(value));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const res = await fetch(url.toString(), {
|
|
18
|
+
headers: {
|
|
19
|
+
Accept: "application/json",
|
|
20
|
+
"Accept-Encoding": "gzip",
|
|
21
|
+
"X-Subscription-Token": apiKey,
|
|
22
|
+
},
|
|
23
|
+
signal: AbortSignal.timeout(15_000),
|
|
24
|
+
});
|
|
25
|
+
if (!res.ok) {
|
|
26
|
+
const text = await res.text().catch(() => "Unknown error");
|
|
27
|
+
throw new BraveApiError(res.status, `Brave API ${res.status}: ${text}`);
|
|
28
|
+
}
|
|
29
|
+
return res.json();
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/brave-api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,OAAO,aAAc,SAAQ,KAAK;IAE7B;IADT,YACS,MAAc,EACrB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,WAAM,GAAN,MAAM,CAAQ;QAIrB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,QAAgB,EAChB,MAAmD;IAEnD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,cAAc,GAAG,QAAQ,EAAE,CAAC,CAAC;IACpD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;QACtC,OAAO,EAAE;YACP,MAAM,EAAE,kBAAkB;YAC1B,iBAAiB,EAAE,MAAM;YACzB,sBAAsB,EAAE,MAAM;SAC/B;QACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC;QAC3D,MAAM,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CAPTCHA type detection from HTML.
|
|
3
|
+
* Identifies reCAPTCHA v2/v3, hCaptcha, and Cloudflare Turnstile,
|
|
4
|
+
* and extracts the sitekey needed for solving.
|
|
5
|
+
*/
|
|
6
|
+
export type CaptchaType = "recaptcha_v2" | "recaptcha_v3" | "hcaptcha" | "turnstile";
|
|
7
|
+
export interface CaptchaInfo {
|
|
8
|
+
type: CaptchaType;
|
|
9
|
+
sitekey: string;
|
|
10
|
+
action?: string;
|
|
11
|
+
enterprise?: boolean;
|
|
12
|
+
s?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Detect CAPTCHA type and extract sitekey from HTML.
|
|
16
|
+
* Checks in order: Turnstile (most specific) → hCaptcha → reCAPTCHA.
|
|
17
|
+
* Returns null if no CAPTCHA detected.
|
|
18
|
+
*/
|
|
19
|
+
export declare function detectCaptcha(html: string): CaptchaInfo | null;
|
|
20
|
+
/**
|
|
21
|
+
* Quick check if HTML contains any CAPTCHA indicators.
|
|
22
|
+
* Faster than full detection — use as pre-filter.
|
|
23
|
+
*/
|
|
24
|
+
export declare function hasCaptcha(html: string): boolean;
|
|
25
|
+
//# sourceMappingURL=detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/captcha/detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,cAAc,GAAG,UAAU,GAAG,WAAW,CAAC;AAErF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAyHD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAc9D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAShD"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CAPTCHA type detection from HTML.
|
|
3
|
+
* Identifies reCAPTCHA v2/v3, hCaptcha, and Cloudflare Turnstile,
|
|
4
|
+
* and extracts the sitekey needed for solving.
|
|
5
|
+
*/
|
|
6
|
+
// ── reCAPTCHA Detection ──
|
|
7
|
+
const RECAPTCHA_SITEKEY_PATTERNS = [
|
|
8
|
+
/data-sitekey=["']([A-Za-z0-9_-]{40})["']/,
|
|
9
|
+
/grecaptcha\.render\s*\([^,]*,\s*\{\s*['"]?sitekey['"]?\s*:\s*['"]([A-Za-z0-9_-]{40})["']/,
|
|
10
|
+
/['"]sitekey['"]\s*:\s*['"]([A-Za-z0-9_-]{40})["']/,
|
|
11
|
+
/recaptcha\/api2?\/anchor\?.*?k=([A-Za-z0-9_-]{40})/,
|
|
12
|
+
/recaptcha\/enterprise\/anchor\?.*?k=([A-Za-z0-9_-]{40})/,
|
|
13
|
+
];
|
|
14
|
+
const RECAPTCHA_V3_INDICATORS = [
|
|
15
|
+
"grecaptcha.execute",
|
|
16
|
+
"recaptcha/api.js?render=",
|
|
17
|
+
"recaptcha/enterprise.js?render=",
|
|
18
|
+
"recaptcha-v3",
|
|
19
|
+
'"size":"invisible"',
|
|
20
|
+
];
|
|
21
|
+
const RECAPTCHA_ENTERPRISE_INDICATORS = [
|
|
22
|
+
"recaptcha/enterprise",
|
|
23
|
+
"grecaptcha.enterprise",
|
|
24
|
+
];
|
|
25
|
+
function detectRecaptcha(html) {
|
|
26
|
+
// Try to find sitekey
|
|
27
|
+
let sitekey = null;
|
|
28
|
+
for (const pattern of RECAPTCHA_SITEKEY_PATTERNS) {
|
|
29
|
+
const match = html.match(pattern);
|
|
30
|
+
if (match) {
|
|
31
|
+
sitekey = match[1];
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (!sitekey) {
|
|
36
|
+
// Check for general reCAPTCHA presence without sitekey
|
|
37
|
+
if (!html.includes("g-recaptcha") && !html.includes("grecaptcha") && !html.includes("recaptcha/api")) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
// Try render param as sitekey
|
|
41
|
+
const renderMatch = html.match(/recaptcha\/(?:enterprise\/)?api\.js\?.*?render=([A-Za-z0-9_-]{40})/);
|
|
42
|
+
if (renderMatch) {
|
|
43
|
+
sitekey = renderMatch[1];
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const isEnterprise = RECAPTCHA_ENTERPRISE_INDICATORS.some((i) => html.includes(i));
|
|
50
|
+
const isV3 = RECAPTCHA_V3_INDICATORS.some((i) => html.includes(i));
|
|
51
|
+
// Try to extract action for v3
|
|
52
|
+
let action;
|
|
53
|
+
if (isV3) {
|
|
54
|
+
const actionMatch = html.match(/grecaptcha\.(?:enterprise\.)?execute\s*\(\s*['"][^'"]*['"]\s*,\s*\{\s*action\s*:\s*['"]([^'"]+)['"]/);
|
|
55
|
+
action = actionMatch?.[1] || "verify";
|
|
56
|
+
}
|
|
57
|
+
// Extract data-s if present (invisible reCAPTCHA)
|
|
58
|
+
const sMatch = html.match(/data-s=["']([^"']+)["']/);
|
|
59
|
+
return {
|
|
60
|
+
type: isV3 ? "recaptcha_v3" : "recaptcha_v2",
|
|
61
|
+
sitekey,
|
|
62
|
+
action,
|
|
63
|
+
enterprise: isEnterprise || undefined,
|
|
64
|
+
s: sMatch?.[1],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// ── hCaptcha Detection ──
|
|
68
|
+
const HCAPTCHA_SITEKEY_PATTERNS = [
|
|
69
|
+
/data-sitekey=["']([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})["']/,
|
|
70
|
+
/hcaptcha\.render\s*\([^,]*,\s*\{[^}]*sitekey['"]\s*:\s*['"]([0-9a-f-]{36})["']/,
|
|
71
|
+
/['"]sitekey['"]\s*:\s*['"]([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})["']/,
|
|
72
|
+
];
|
|
73
|
+
function detectHcaptcha(html) {
|
|
74
|
+
// Must have hCaptcha indicators
|
|
75
|
+
if (!html.includes("h-captcha") && !html.includes("hcaptcha") && !html.includes("hcaptcha.com")) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
for (const pattern of HCAPTCHA_SITEKEY_PATTERNS) {
|
|
79
|
+
const match = html.match(pattern);
|
|
80
|
+
if (match) {
|
|
81
|
+
return { type: "hcaptcha", sitekey: match[1] };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
// ── Cloudflare Turnstile Detection ──
|
|
87
|
+
const TURNSTILE_SITEKEY_PATTERNS = [
|
|
88
|
+
/class=["'][^"']*cf-turnstile[^"']*["'][^>]*data-sitekey=["']([A-Za-z0-9_-]+)["']/,
|
|
89
|
+
/data-sitekey=["']([A-Za-z0-9_-]+)["'][^>]*class=["'][^"']*cf-turnstile/,
|
|
90
|
+
/turnstile\.render\s*\([^,]*,\s*\{[^}]*sitekey['"]\s*:\s*['"]([A-Za-z0-9_-]+)["']/,
|
|
91
|
+
];
|
|
92
|
+
function detectTurnstile(html) {
|
|
93
|
+
if (!html.includes("cf-turnstile") && !html.includes("challenges.cloudflare.com/turnstile")) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
for (const pattern of TURNSTILE_SITEKEY_PATTERNS) {
|
|
97
|
+
const match = html.match(pattern);
|
|
98
|
+
if (match) {
|
|
99
|
+
return { type: "turnstile", sitekey: match[1] };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
// ── Main Detector ──
|
|
105
|
+
/**
|
|
106
|
+
* Detect CAPTCHA type and extract sitekey from HTML.
|
|
107
|
+
* Checks in order: Turnstile (most specific) → hCaptcha → reCAPTCHA.
|
|
108
|
+
* Returns null if no CAPTCHA detected.
|
|
109
|
+
*/
|
|
110
|
+
export function detectCaptcha(html) {
|
|
111
|
+
// Turnstile first (Cloudflare-specific, most precise match)
|
|
112
|
+
const turnstile = detectTurnstile(html);
|
|
113
|
+
if (turnstile)
|
|
114
|
+
return turnstile;
|
|
115
|
+
// hCaptcha (UUID sitekey is very specific)
|
|
116
|
+
const hcaptcha = detectHcaptcha(html);
|
|
117
|
+
if (hcaptcha)
|
|
118
|
+
return hcaptcha;
|
|
119
|
+
// reCAPTCHA (most common, check last)
|
|
120
|
+
const recaptcha = detectRecaptcha(html);
|
|
121
|
+
if (recaptcha)
|
|
122
|
+
return recaptcha;
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Quick check if HTML contains any CAPTCHA indicators.
|
|
127
|
+
* Faster than full detection — use as pre-filter.
|
|
128
|
+
*/
|
|
129
|
+
export function hasCaptcha(html) {
|
|
130
|
+
return (html.includes("g-recaptcha") ||
|
|
131
|
+
html.includes("grecaptcha") ||
|
|
132
|
+
html.includes("h-captcha") ||
|
|
133
|
+
html.includes("hcaptcha") ||
|
|
134
|
+
html.includes("cf-turnstile") ||
|
|
135
|
+
html.includes("challenges.cloudflare.com/turnstile"));
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/captcha/detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CAPTCHA orchestrator: detect → solve via 2Captcha → inject into Playwright page.
|
|
3
|
+
*
|
|
4
|
+
* This is the high-level module that ties detection, solving, and injection together.
|
|
5
|
+
* Used by the stealth engine's browser-level fetch to auto-solve CAPTCHAs.
|
|
6
|
+
*/
|
|
7
|
+
export { detectCaptcha, hasCaptcha, type CaptchaInfo } from "./detector.js";
|
|
8
|
+
export { TwoCaptchaSolver, CaptchaSolverError, type SolveResult } from "./solver.js";
|
|
9
|
+
type PlaywrightPage = any;
|
|
10
|
+
export interface CaptchaSolveAttempt {
|
|
11
|
+
detected: boolean;
|
|
12
|
+
solved: boolean;
|
|
13
|
+
captchaType?: string;
|
|
14
|
+
solveTimeMs?: number;
|
|
15
|
+
error?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Attempt to detect and solve a CAPTCHA on a Playwright page.
|
|
19
|
+
*
|
|
20
|
+
* Flow:
|
|
21
|
+
* 1. Get page HTML
|
|
22
|
+
* 2. Detect CAPTCHA type + sitekey
|
|
23
|
+
* 3. Submit to 2Captcha
|
|
24
|
+
* 4. Poll for solution
|
|
25
|
+
* 5. Inject token into page
|
|
26
|
+
* 6. Wait for page to process the token
|
|
27
|
+
*
|
|
28
|
+
* Returns details about the attempt. Non-throwing — errors are captured in result.
|
|
29
|
+
*/
|
|
30
|
+
export declare function trySolveCaptcha(page: PlaywrightPage, apiKey: string): Promise<CaptchaSolveAttempt>;
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/captcha/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAIrF,KAAK,cAAc,GAAG,GAAG,CAAC;AAE1B,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,mBAAmB,CAAC,CA0E9B"}
|