stealth-cli 0.5.0 → 0.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.
- package/README.md +234 -146
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,186 +1,250 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
|
+
<h1>🦊 stealth-cli</h1>
|
|
3
|
+
<p><strong>Anti-detection browser CLI powered by Camoufox</strong></p>
|
|
4
|
+
<p>Browse, search, scrape, and crawl the web with C++ level fingerprint spoofing.<br/>Bypasses Cloudflare, Google, and most bot detection systems.</p>
|
|
5
|
+
<p>
|
|
6
|
+
<a href="https://www.npmjs.com/package/stealth-cli"><img src="https://img.shields.io/npm/v/stealth-cli?color=blue" alt="npm version" /></a>
|
|
7
|
+
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/license-MIT-blue" alt="License" /></a>
|
|
8
|
+
<a href="https://camoufox.com"><img src="https://img.shields.io/badge/engine-Camoufox-red" alt="Camoufox" /></a>
|
|
9
|
+
<img src="https://img.shields.io/badge/node-%3E%3D18-green" alt="Node" />
|
|
10
|
+
<img src="https://img.shields.io/badge/tests-59%20passing-brightgreen" alt="Tests" />
|
|
11
|
+
</p>
|
|
12
|
+
</div>
|
|
2
13
|
|
|
3
|
-
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Why
|
|
4
17
|
|
|
5
|
-
|
|
6
|
-
[](https://nodejs.org)
|
|
18
|
+
Headless Chrome gets fingerprinted. Playwright gets blocked. Stealth plugins become the fingerprint.
|
|
7
19
|
|
|
8
|
-
|
|
20
|
+
**stealth-cli** uses [Camoufox](https://camoufox.com) — a Firefox fork that patches fingerprint generation at the **C++ implementation level**. No JavaScript shims, no wrappers, no tells. The browser reports spoofed values natively.
|
|
9
21
|
|
|
10
|
-
|
|
11
|
-
- 🔍 **14 search engines** — Google, Bing, DuckDuckGo, YouTube, GitHub, and more
|
|
12
|
-
- 🕷️ **Recursive crawler** — Depth control, regex filters, delay, output to JSONL
|
|
13
|
-
- 📸 **Screenshots & PDF** — Full page, viewport, custom resolution
|
|
14
|
-
- 🧲 **Data extraction** — Links, images, meta, headings, CSS selectors
|
|
15
|
-
- 🎭 **Browser profiles** — Persistent fingerprint identities with cookie storage
|
|
16
|
-
- 🔄 **Proxy rotation** — Pool management with health checking
|
|
17
|
-
- 🤖 **Human simulation** — Bezier mouse curves, natural typing, scroll patterns
|
|
18
|
-
- 👻 **Daemon mode** — Background browser for instant command execution
|
|
19
|
-
- 🧩 **MCP server** — Plug into Claude Desktop, Cursor, and other AI agents
|
|
20
|
-
- 📦 **SDK mode** — Import as a library in your own Node.js projects
|
|
22
|
+
Wrap that in a developer-friendly CLI with 16 commands, and you get a tool that both humans and AI agents can use.
|
|
21
23
|
|
|
22
24
|
## Install
|
|
23
25
|
|
|
24
26
|
```bash
|
|
25
|
-
|
|
27
|
+
# From npm (recommended)
|
|
28
|
+
npm install -g stealth-cli
|
|
29
|
+
|
|
30
|
+
# From source
|
|
31
|
+
git clone https://github.com/user/stealth-cli.git
|
|
26
32
|
cd stealth-cli
|
|
27
33
|
npm install # Installs deps + downloads Camoufox browser (~300MB)
|
|
28
|
-
npm link # Makes 'stealth' command available
|
|
34
|
+
npm link # Makes 'stealth' command globally available
|
|
29
35
|
```
|
|
30
36
|
|
|
37
|
+
> First run downloads the Camoufox browser binary (~300MB). Subsequent runs are instant.
|
|
38
|
+
|
|
31
39
|
## Quick Start
|
|
32
40
|
|
|
33
41
|
```bash
|
|
34
|
-
# Browse a page
|
|
42
|
+
# Browse a page with anti-detection
|
|
35
43
|
stealth browse https://example.com
|
|
36
44
|
|
|
37
|
-
#
|
|
45
|
+
# Take a screenshot
|
|
38
46
|
stealth screenshot https://example.com -o page.png
|
|
39
47
|
|
|
40
|
-
# Search
|
|
48
|
+
# Search Google without getting blocked
|
|
41
49
|
stealth search google "best coffee beans" -f json
|
|
42
50
|
|
|
43
|
-
# Extract
|
|
44
|
-
stealth extract https://example.com --links
|
|
51
|
+
# Extract all links from a page
|
|
52
|
+
stealth extract https://example.com --links
|
|
45
53
|
|
|
46
54
|
# Crawl a site
|
|
47
55
|
stealth crawl https://example.com --depth 2 --limit 50 -o results.jsonl
|
|
48
56
|
|
|
49
|
-
# Interactive REPL
|
|
57
|
+
# Interactive browsing (REPL)
|
|
50
58
|
stealth interactive --url https://example.com
|
|
51
59
|
```
|
|
52
60
|
|
|
53
61
|
## Commands
|
|
54
62
|
|
|
55
|
-
### Core
|
|
63
|
+
### Core (11 commands)
|
|
56
64
|
|
|
57
65
|
| Command | Description |
|
|
58
66
|
|---------|-------------|
|
|
59
|
-
| `stealth browse <url>` | Visit URL, print page content |
|
|
60
|
-
| `stealth screenshot <url>` | Take a screenshot |
|
|
61
|
-
| `stealth
|
|
62
|
-
| `stealth
|
|
63
|
-
| `stealth
|
|
64
|
-
| `stealth
|
|
65
|
-
| `stealth
|
|
66
|
-
| `stealth batch <file>` | Batch process URLs from file |
|
|
67
|
-
| `stealth monitor <url>` |
|
|
68
|
-
| `stealth fingerprint` |
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
| `stealth browse <url>` | Visit URL, print page content (text/json/snapshot) |
|
|
68
|
+
| `stealth screenshot <url>` | Take a screenshot (PNG/JPEG, full page, custom size) |
|
|
69
|
+
| `stealth search <engine> <query>` | Search with anti-detection (14 engines) |
|
|
70
|
+
| `stealth extract <url>` | Extract links, images, meta, headings, CSS selectors |
|
|
71
|
+
| `stealth crawl <url>` | Recursive crawling with depth/filter/delay control |
|
|
72
|
+
| `stealth interactive` | Interactive REPL with 20+ browsing commands |
|
|
73
|
+
| `stealth pdf <url>` | Save page as PDF / full-page screenshot |
|
|
74
|
+
| `stealth batch <file>` | Batch process URLs from a file |
|
|
75
|
+
| `stealth monitor <url>` | Watch a page for changes (price drops, stock alerts) |
|
|
76
|
+
| `stealth fingerprint` | Check browser fingerprint & anti-detection status |
|
|
77
|
+
| `stealth serve` | Start HTTP API server for external integrations |
|
|
78
|
+
|
|
79
|
+
### Management (5 commands)
|
|
71
80
|
|
|
72
81
|
| Command | Description |
|
|
73
82
|
|---------|-------------|
|
|
74
|
-
| `stealth daemon start` |
|
|
75
|
-
| `stealth
|
|
76
|
-
| `stealth
|
|
77
|
-
| `stealth
|
|
78
|
-
| `stealth
|
|
79
|
-
| `stealth proxy add <url>` | Add proxy to pool |
|
|
80
|
-
| `stealth proxy list` | List proxies |
|
|
81
|
-
| `stealth proxy test` | Test proxy connectivity |
|
|
82
|
-
| `stealth config set <key> <val>` | Set default config |
|
|
83
|
-
| `stealth mcp` | Start MCP server for AI agents |
|
|
83
|
+
| `stealth daemon start/stop/status` | Background browser for instant startup (~1s vs ~6s) |
|
|
84
|
+
| `stealth profile create/list/delete` | Persistent browser identities (8 presets + random) |
|
|
85
|
+
| `stealth proxy add/list/test` | Proxy pool with rotation and health checking |
|
|
86
|
+
| `stealth config set/get/list/reset` | Global defaults (~/.stealth/config.json) |
|
|
87
|
+
| `stealth mcp` | MCP server for Claude Desktop / Cursor |
|
|
84
88
|
|
|
85
89
|
---
|
|
86
90
|
|
|
87
|
-
|
|
91
|
+
## Usage
|
|
92
|
+
|
|
93
|
+
### Browse
|
|
88
94
|
|
|
89
95
|
```bash
|
|
90
|
-
stealth browse https://example.com # Text
|
|
91
|
-
stealth browse https://example.com -f json # JSON
|
|
96
|
+
stealth browse https://example.com # Text output
|
|
97
|
+
stealth browse https://example.com -f json # JSON with metadata
|
|
92
98
|
stealth browse https://example.com -f snapshot # Accessibility tree
|
|
99
|
+
stealth browse https://example.com --humanize # Human behavior simulation
|
|
100
|
+
stealth browse https://example.com --profile us-desktop # Use saved identity
|
|
93
101
|
stealth browse https://example.com --proxy http://proxy:8080
|
|
94
|
-
stealth browse https://example.com --cookies cookies.txt
|
|
95
|
-
stealth browse https://example.com --profile us-desktop # Use saved profile
|
|
96
|
-
stealth browse https://example.com --humanize # Human behavior
|
|
97
102
|
```
|
|
98
103
|
|
|
99
|
-
###
|
|
104
|
+
### Screenshot
|
|
100
105
|
|
|
101
106
|
```bash
|
|
102
|
-
stealth screenshot https://example.com
|
|
103
|
-
stealth screenshot https://example.com
|
|
104
|
-
stealth screenshot https://example.com --full # Full page
|
|
107
|
+
stealth screenshot https://example.com -o page.png
|
|
108
|
+
stealth screenshot https://example.com --full # Full page
|
|
105
109
|
stealth screenshot https://example.com --width 1920 --height 1080
|
|
106
110
|
```
|
|
107
111
|
|
|
108
|
-
###
|
|
112
|
+
### Search
|
|
109
113
|
|
|
110
|
-
|
|
114
|
+
14 supported engines with structured result extraction.
|
|
115
|
+
|
|
116
|
+
Google uses a special anti-detection flow: visits homepage → types query → presses Enter (not direct URL).
|
|
111
117
|
|
|
112
118
|
```bash
|
|
113
|
-
stealth search google "web scraping tools" -f json
|
|
114
|
-
stealth search
|
|
115
|
-
stealth search duckduckgo "privacy browser" -f
|
|
119
|
+
stealth search google "web scraping tools" -f json # Auto-humanized
|
|
120
|
+
stealth search google "query" -f json --warmup # Extra: visit random site first
|
|
121
|
+
stealth search duckduckgo "privacy browser" -f json
|
|
122
|
+
stealth search bing "anti-detect browser" -f json
|
|
123
|
+
stealth search youtube "tutorial" -f json # Video metadata
|
|
124
|
+
stealth search github "camoufox" -f json # Repo results
|
|
125
|
+
stealth search amazon "mechanical keyboard" -f json
|
|
116
126
|
```
|
|
117
127
|
|
|
118
|
-
|
|
128
|
+
**All 14 engines:** google, bing, duckduckgo, youtube, github, amazon, reddit, wikipedia, twitter, linkedin, tiktok, stackoverflow, npmjs, yelp
|
|
129
|
+
|
|
130
|
+
### Extract
|
|
119
131
|
|
|
120
132
|
```bash
|
|
121
133
|
stealth extract https://example.com --links # All links
|
|
122
134
|
stealth extract https://example.com --images # All images
|
|
123
|
-
stealth extract https://example.com --meta #
|
|
135
|
+
stealth extract https://example.com --meta # Title, description, OG tags
|
|
124
136
|
stealth extract https://example.com --headers # h1-h6 headings
|
|
125
137
|
stealth extract https://example.com -s ".price" --all # CSS selector
|
|
126
|
-
stealth extract https://example.com -s "a" -a "href"
|
|
138
|
+
stealth extract https://example.com -s "a" -a "href" --all # Attributes
|
|
127
139
|
```
|
|
128
140
|
|
|
129
|
-
###
|
|
141
|
+
### Crawl
|
|
130
142
|
|
|
131
143
|
```bash
|
|
132
|
-
stealth crawl https://example.com -d 2 -l 50 # Depth 2, max 50
|
|
133
|
-
stealth crawl https://example.com
|
|
144
|
+
stealth crawl https://example.com -d 2 -l 50 # Depth 2, max 50 pages
|
|
145
|
+
stealth crawl https://example.com -o results.jsonl # Save to file
|
|
134
146
|
stealth crawl https://example.com --include "blog" # URL regex filter
|
|
135
147
|
stealth crawl https://example.com --exclude "login|admin"
|
|
136
|
-
stealth crawl https://example.com
|
|
148
|
+
stealth crawl https://example.com --delay 2000 --humanize # Human-like crawling
|
|
149
|
+
stealth crawl https://example.com --proxy-rotate # Rotate through proxy pool
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Monitor
|
|
153
|
+
|
|
154
|
+
Watch pages for changes — ideal for price tracking, stock alerts, content monitoring.
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
stealth monitor https://shop.com/item -s ".price" -i 60 # Check price every 60s
|
|
158
|
+
stealth monitor https://shop.com/item --contains "In Stock"
|
|
159
|
+
stealth monitor https://example.com --not-contains "Sold Out"
|
|
160
|
+
stealth monitor https://example.com --json -n 10 # JSON output, 10 checks max
|
|
137
161
|
```
|
|
138
162
|
|
|
139
|
-
###
|
|
163
|
+
### Batch
|
|
140
164
|
|
|
141
|
-
|
|
165
|
+
```bash
|
|
166
|
+
echo "https://example.com
|
|
167
|
+
https://github.com
|
|
168
|
+
https://httpbin.org/ip" > urls.txt
|
|
169
|
+
|
|
170
|
+
stealth batch urls.txt -c browse --skip-errors # Browse all
|
|
171
|
+
stealth batch urls.txt -c screenshot -o ./screenshots/ # Screenshot all
|
|
172
|
+
stealth batch urls.txt -c extract -s "h1" # Extract from all
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Fingerprint
|
|
142
176
|
|
|
143
177
|
```bash
|
|
144
|
-
stealth
|
|
145
|
-
stealth
|
|
146
|
-
stealth
|
|
178
|
+
stealth fingerprint # Show current browser fingerprint
|
|
179
|
+
stealth fingerprint --check # Run anti-detection tests (CreepJS, WebDriver)
|
|
180
|
+
stealth fingerprint --compare 3 # Launch 3 times, compare if fingerprints vary
|
|
181
|
+
stealth fingerprint --profile jp-desktop --json
|
|
147
182
|
```
|
|
148
183
|
|
|
149
|
-
|
|
184
|
+
### Interactive REPL
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
stealth interactive --url https://example.com
|
|
188
|
+
|
|
189
|
+
stealth> goto https://google.com
|
|
190
|
+
stealth> search duckduckgo hello world
|
|
191
|
+
stealth> click "button.submit"
|
|
192
|
+
stealth> hclick "a.link" # Human-like click (mouse movement)
|
|
193
|
+
stealth> type "input[name=q]" hello
|
|
194
|
+
stealth> htype "input[name=q]" hello # Human-like typing (variable speed)
|
|
195
|
+
stealth> scroll down 3
|
|
196
|
+
stealth> text # Page text
|
|
197
|
+
stealth> snapshot # Accessibility tree
|
|
198
|
+
stealth> links # All links
|
|
199
|
+
stealth> screenshot page.png
|
|
200
|
+
stealth> eval document.title # Run JavaScript
|
|
201
|
+
stealth> back / forward / reload
|
|
202
|
+
stealth> exit
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
---
|
|
150
206
|
|
|
151
207
|
## Daemon Mode
|
|
152
208
|
|
|
153
|
-
Keep a browser alive in the background
|
|
209
|
+
Keep a browser alive in the background. Commands reuse it instantly.
|
|
154
210
|
|
|
155
211
|
```bash
|
|
156
212
|
stealth daemon start # Start background browser
|
|
157
|
-
stealth browse https://example.com #
|
|
213
|
+
stealth browse https://example.com # ~1.2s (vs ~6s cold start)
|
|
214
|
+
stealth browse https://other.com # ~1.2s
|
|
158
215
|
stealth daemon status # Check status
|
|
159
|
-
stealth daemon stop # Shut down
|
|
216
|
+
stealth daemon stop # Shut down (auto-stops after 5min idle)
|
|
160
217
|
```
|
|
161
218
|
|
|
162
|
-
The daemon auto-shuts down after 5 minutes of idle time.
|
|
163
|
-
|
|
164
219
|
## Browser Profiles
|
|
165
220
|
|
|
166
|
-
|
|
221
|
+
Persistent browser identities with unique fingerprints. Cookies auto-save between sessions.
|
|
167
222
|
|
|
168
223
|
```bash
|
|
169
|
-
|
|
170
|
-
stealth profile create
|
|
171
|
-
stealth profile create
|
|
224
|
+
stealth profile create work --preset us-desktop
|
|
225
|
+
stealth profile create japan --preset jp-desktop
|
|
226
|
+
stealth profile create rand1 --random # Random fingerprint
|
|
227
|
+
stealth profile list
|
|
228
|
+
stealth profile presets # Show all 8 presets
|
|
172
229
|
|
|
173
|
-
#
|
|
174
|
-
stealth
|
|
230
|
+
# Use profile — fingerprint + cookies auto-applied
|
|
231
|
+
stealth browse https://example.com --profile work
|
|
232
|
+
# → User-Agent: Windows, locale: en-US, timezone: America/New_York
|
|
233
|
+
```
|
|
175
234
|
|
|
176
|
-
|
|
177
|
-
stealth browse https://example.com --profile mybot
|
|
235
|
+
**Presets:** `us-desktop` · `us-laptop` · `uk-desktop` · `de-desktop` · `jp-desktop` · `cn-desktop` · `mobile-ios` · `mobile-android`
|
|
178
236
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
237
|
+
## Session Persistence
|
|
238
|
+
|
|
239
|
+
Save and restore browsing sessions (cookies + last URL + history).
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
stealth browse https://example.com --session my-task --profile work
|
|
243
|
+
# → Cookies saved, URL remembered
|
|
182
244
|
|
|
183
|
-
|
|
245
|
+
# Later: auto-restores cookies and navigates to last URL
|
|
246
|
+
stealth browse https://other.com --session my-task
|
|
247
|
+
```
|
|
184
248
|
|
|
185
249
|
## Proxy Support
|
|
186
250
|
|
|
@@ -188,87 +252,93 @@ stealth profile list
|
|
|
188
252
|
# Single proxy
|
|
189
253
|
stealth browse https://example.com --proxy http://user:pass@host:port
|
|
190
254
|
|
|
191
|
-
# Proxy pool rotation
|
|
192
|
-
stealth proxy add http://proxy1:8080
|
|
193
|
-
stealth proxy add http://proxy2:8080
|
|
194
|
-
stealth proxy
|
|
255
|
+
# Proxy pool with rotation
|
|
256
|
+
stealth proxy add http://proxy1:8080 --label us --region US
|
|
257
|
+
stealth proxy add http://proxy2:8080 --label eu --region EU
|
|
258
|
+
stealth proxy test # Test all proxies
|
|
259
|
+
stealth proxy list # List with status
|
|
195
260
|
stealth browse https://example.com --proxy-rotate # Auto-rotate
|
|
196
|
-
|
|
197
|
-
# Test proxies
|
|
198
|
-
stealth proxy test
|
|
261
|
+
stealth crawl https://example.com --proxy-rotate # Rotate per page
|
|
199
262
|
```
|
|
200
263
|
|
|
201
|
-
When a proxy
|
|
264
|
+
GeoIP: When using a proxy, Camoufox auto-matches locale, timezone, and geolocation to the proxy's exit IP.
|
|
202
265
|
|
|
203
|
-
##
|
|
266
|
+
## Pipe-Friendly
|
|
204
267
|
|
|
205
|
-
|
|
268
|
+
stdout = data, stderr = status. Perfect for Unix pipes:
|
|
206
269
|
|
|
207
270
|
```bash
|
|
208
|
-
stealth
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
```json
|
|
214
|
-
{
|
|
215
|
-
"mcpServers": {
|
|
216
|
-
"stealth": {
|
|
217
|
-
"command": "node",
|
|
218
|
-
"args": ["/path/to/stealth-cli/bin/stealth.js", "mcp"]
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
}
|
|
271
|
+
stealth browse https://api.example.com -f json | jq '.title'
|
|
272
|
+
stealth search google "query" -f json | jq '.results[].url'
|
|
273
|
+
stealth extract https://example.com --links -f json | jq '.data[].url'
|
|
274
|
+
stealth crawl https://example.com -o - | wc -l
|
|
222
275
|
```
|
|
223
276
|
|
|
224
|
-
|
|
277
|
+
## HTTP API Server
|
|
225
278
|
|
|
226
|
-
|
|
279
|
+
```bash
|
|
280
|
+
stealth serve --port 9377
|
|
227
281
|
|
|
228
|
-
|
|
282
|
+
# Create tab + browse
|
|
283
|
+
curl -X POST localhost:9377/tabs -H 'Content-Type: application/json' \
|
|
284
|
+
-d '{"url":"https://example.com"}'
|
|
229
285
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
stealth browse https://api.example.com -f json | jq '.title'
|
|
286
|
+
# Get page text
|
|
287
|
+
curl localhost:9377/tabs/tab-1/text
|
|
233
288
|
|
|
234
|
-
#
|
|
235
|
-
|
|
236
|
-
| jq '.[].url' \
|
|
237
|
-
| xargs -I {} stealth screenshot {} -o {}.png
|
|
289
|
+
# Screenshot (base64)
|
|
290
|
+
curl localhost:9377/tabs/tab-1/screenshot
|
|
238
291
|
|
|
239
|
-
#
|
|
240
|
-
|
|
292
|
+
# All endpoints: /health, /tabs, /tabs/:id/navigate, /tabs/:id/snapshot,
|
|
293
|
+
# /tabs/:id/text, /tabs/:id/screenshot, /tabs/:id/click, /tabs/:id/type,
|
|
294
|
+
# /tabs/:id/evaluate, /tabs/:id/close, /shutdown
|
|
241
295
|
```
|
|
242
296
|
|
|
243
297
|
## As a Library (SDK)
|
|
244
298
|
|
|
245
299
|
```javascript
|
|
246
|
-
import {
|
|
247
|
-
launchBrowser, closeBrowser, navigate,
|
|
248
|
-
getTextContent, takeScreenshot
|
|
249
|
-
} from 'stealth-cli';
|
|
300
|
+
import { launchBrowser, closeBrowser, navigate, getTextContent } from 'stealth-cli';
|
|
250
301
|
|
|
251
302
|
const handle = await launchBrowser({
|
|
252
|
-
headless: true,
|
|
253
|
-
proxy: 'http://proxy:8080',
|
|
254
303
|
profile: 'us-desktop',
|
|
255
304
|
humanize: true,
|
|
256
305
|
});
|
|
257
306
|
|
|
258
307
|
await navigate(handle, 'https://example.com');
|
|
259
308
|
const text = await getTextContent(handle);
|
|
260
|
-
|
|
309
|
+
console.log(text);
|
|
261
310
|
|
|
262
311
|
await closeBrowser(handle);
|
|
263
312
|
```
|
|
264
313
|
|
|
314
|
+
## Configuration
|
|
315
|
+
|
|
316
|
+
Set global defaults so you don't repeat flags:
|
|
317
|
+
|
|
318
|
+
```bash
|
|
319
|
+
stealth config set locale zh-CN # Default Chinese locale
|
|
320
|
+
stealth config set humanize true # Always simulate human behavior
|
|
321
|
+
stealth config set retries 3 # Default 3 retries
|
|
322
|
+
stealth config set format json # Default JSON output
|
|
323
|
+
stealth config list # Show all settings
|
|
324
|
+
stealth config reset # Reset to defaults
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
Stored at `~/.stealth/config.json`.
|
|
328
|
+
|
|
265
329
|
## How Anti-Detection Works
|
|
266
330
|
|
|
267
|
-
|
|
331
|
+
```
|
|
332
|
+
stealth-cli
|
|
333
|
+
└── camoufox-js (npm)
|
|
334
|
+
└── Camoufox (C++ Firefox fork)
|
|
335
|
+
└── Fingerprint spoofing at the native level
|
|
336
|
+
```
|
|
268
337
|
|
|
269
338
|
| Fingerprint Vector | Approach |
|
|
270
339
|
|---|---|
|
|
271
340
|
| `navigator.hardwareConcurrency` | Spoofed in C++ |
|
|
341
|
+
| `navigator.webdriver` | Always `false` |
|
|
272
342
|
| WebGL renderer / vendor | Spoofed in C++ |
|
|
273
343
|
| AudioContext fingerprint | Spoofed in C++ |
|
|
274
344
|
| Canvas fingerprint | Spoofed in C++ |
|
|
@@ -276,19 +346,37 @@ stealth-cli uses [Camoufox](https://github.com/daijro/camoufox), a Firefox fork
|
|
|
276
346
|
| WebRTC leak | Built-in protection |
|
|
277
347
|
| TLS fingerprint | Firefox native (not Chromium) |
|
|
278
348
|
|
|
279
|
-
|
|
349
|
+
No JavaScript shims. No detectable wrappers. The browser reports spoofed values natively.
|
|
280
350
|
|
|
281
|
-
##
|
|
351
|
+
## Common Options
|
|
282
352
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
353
|
+
Available on all core commands:
|
|
354
|
+
|
|
355
|
+
| Option | Description |
|
|
356
|
+
|--------|-------------|
|
|
357
|
+
| `--proxy <url>` | Use proxy server |
|
|
358
|
+
| `--proxy-rotate` | Rotate through proxy pool |
|
|
359
|
+
| `--profile <name>` | Use saved browser identity |
|
|
360
|
+
| `--session <name>` | Persist/restore browsing session |
|
|
361
|
+
| `--cookies <file>` | Import Netscape-format cookie file |
|
|
362
|
+
| `--humanize` | Simulate human behavior |
|
|
363
|
+
| `--retries <n>` | Max retries on failure (default: 2) |
|
|
364
|
+
| `--no-headless` | Show browser window |
|
|
365
|
+
| `-f, --format` | Output format: text, json, jsonl, snapshot, markdown |
|
|
290
366
|
|
|
291
|
-
|
|
367
|
+
## Project Stats
|
|
368
|
+
|
|
369
|
+
```
|
|
370
|
+
Version: 0.5.0
|
|
371
|
+
Commands: 16
|
|
372
|
+
Tests: 59 passing
|
|
373
|
+
Source: 5,700+ lines
|
|
374
|
+
Files: 44
|
|
375
|
+
Extractors: 6 (Google, Bing, DuckDuckGo, YouTube, GitHub, generic)
|
|
376
|
+
Presets: 8 browser profiles
|
|
377
|
+
Engine: Camoufox (C++ Firefox fork)
|
|
378
|
+
License: MIT
|
|
379
|
+
```
|
|
292
380
|
|
|
293
381
|
## License
|
|
294
382
|
|
package/package.json
CHANGED