capskip 1.1.0 → 1.3.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/CHANGELOG.md +72 -0
- package/README.md +248 -24
- package/docs/API_REFERENCE.md +391 -1
- package/examples/altcha.js +103 -0
- package/examples/captchafox.js +102 -0
- package/examples/capy.js +101 -0
- package/examples/friendly_captcha.js +115 -0
- package/package.json +23 -2
- package/src/apiParams.js +201 -0
- package/src/solver.js +339 -1
- package/types/index.d.ts +175 -5
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,78 @@ All notable changes to this project are documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.3.0] - 2026-09-22
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Capy Puzzle support** via `capy(sitekey, url, options)`. The site key
|
|
13
|
+
(conventionally prefixed `PUZZLE_`) is sent as the `captchakey` the API
|
|
14
|
+
documents. Optional `api_server` selects the Capy API the key lives behind,
|
|
15
|
+
defaulting to `https://jp.api.capy.me`.
|
|
16
|
+
A Capy answer is **not a token**: the result expands into `captchakey`,
|
|
17
|
+
`challengekey` and `answer`, which go into the target form's `capy_captchakey`,
|
|
18
|
+
`capy_challengekey` and `capy_answer` fields. `code` keeps the raw answer.
|
|
19
|
+
- **CaptchaFox support** via `captchafox(sitekey, url, options)`. The result
|
|
20
|
+
exposes `token` (for the form's `cf-captcha-response` field) and, when the
|
|
21
|
+
solve reported one, `userAgent` — the UA the browser actually minted the token
|
|
22
|
+
under, which is not the one you sent. Optional `api_server` selects the widget
|
|
23
|
+
source; the MAM package returns a `MAM_` prefixed token.
|
|
24
|
+
- **Friendly Captcha support** via `friendlyCaptcha(sitekey, url, options)`.
|
|
25
|
+
Pass `version` (`v1`/`v2`, or a bare `1`/`2`), or `moduleScript` /
|
|
26
|
+
`nomoduleScript` with the widget script URLs and let CapSkip read the version
|
|
27
|
+
off the build the site actually loads. Optional `api_server` accepts `global`
|
|
28
|
+
(the default), `eu`, or a full URL for the data-residency tenant. The result
|
|
29
|
+
exposes `token`, for `frc-captcha-solution` on v1 or `frc-captcha-response` on
|
|
30
|
+
v2.
|
|
31
|
+
- Parameter aliases `userAgent`/`user_agent` for `useragent`, `captchaKey` for
|
|
32
|
+
`captchakey`, and `moduleScript`/`nomoduleScript` for `module_script` /
|
|
33
|
+
`nomodule_script`.
|
|
34
|
+
- TypeScript definitions for `CapyOptions`, `CaptchaFoxOptions` and
|
|
35
|
+
`FriendlyCaptchaOptions`, plus the new `SolveResult` fields.
|
|
36
|
+
|
|
37
|
+
### Notes
|
|
38
|
+
|
|
39
|
+
- `version: 'avatar'` is refused locally for Capy. CapSkip solves the puzzle
|
|
40
|
+
family only, and answering an avatar request with a puzzle answer would bill
|
|
41
|
+
for a solve the target site rejects, indistinguishably from a broken solver.
|
|
42
|
+
- An unknown Friendly Captcha `version` is refused locally too. The two versions
|
|
43
|
+
are different protocols sharing one sitekey namespace, so solving the wrong one
|
|
44
|
+
returns a well-formed token the site rejects with nothing to indicate why.
|
|
45
|
+
- CaptchaFox and Friendly Captcha use `recaptchaTimeout`: the first is a real
|
|
46
|
+
browser solve, and the second has its difficulty set per request by the service
|
|
47
|
+
(and always solves in a browser on v2). Capy uses `defaultTimeout` — it is one
|
|
48
|
+
HTTP fetch plus pixel math, held back to roughly two seconds because Capy
|
|
49
|
+
refuses answers that arrive faster than a human could have produced them.
|
|
50
|
+
|
|
51
|
+
## [1.2.0] - 2026-09-12
|
|
52
|
+
|
|
53
|
+
### Added
|
|
54
|
+
|
|
55
|
+
- **ALTCHA support** via `altcha(url, options)`. Pass `challengeUrl` for CapSkip
|
|
56
|
+
to fetch the challenge, or `challengeJson` with the document itself (a JSON
|
|
57
|
+
string, or an object which is serialized for you). Sending both is allowed —
|
|
58
|
+
the inline document wins. The result exposes `token` (the value the site's
|
|
59
|
+
`altcha` form field expects) and `number`, the counter that solved it; `code`
|
|
60
|
+
keeps the same raw string.
|
|
61
|
+
- Parameter aliases `challengeUrl`/`challengeURL` for `challenge_url` and
|
|
62
|
+
`challengeJson`/`challengeJSON` for `challenge_json`.
|
|
63
|
+
- `AltchaOptions` and the `token`/`number` result fields in the TypeScript
|
|
64
|
+
definitions.
|
|
65
|
+
- Both ALTCHA generations are handled: the legacy scheme (SHA-1/256/384/512) and
|
|
66
|
+
proof-of-work v2 (PBKDF2 or SHA). Their tokens are shaped differently — a v2
|
|
67
|
+
payload carries no top-level `number`, its counter sitting at
|
|
68
|
+
`solution.counter` — so the counter is taken from the server's own `solution`
|
|
69
|
+
object, the one field both report the same way, and dug out of the token only
|
|
70
|
+
when a poll did not carry it.
|
|
71
|
+
|
|
72
|
+
### Notes
|
|
73
|
+
|
|
74
|
+
- ALTCHA is CPU proof-of-work rather than a browser solve, so it uses
|
|
75
|
+
`defaultTimeout` instead of the longer `recaptchaTimeout` that reCAPTCHA,
|
|
76
|
+
Turnstile and GeeTest use.
|
|
77
|
+
- A proxy passed to `altcha()` applies only to the `challengeUrl` fetch; a task
|
|
78
|
+
carrying its challenge inline never touches the network.
|
|
79
|
+
|
|
8
80
|
## [1.1.0] - 2026-07-26
|
|
9
81
|
|
|
10
82
|
### Added
|
package/README.md
CHANGED
|
@@ -1,20 +1,55 @@
|
|
|
1
|
-
# CapSkip Node.js SDK
|
|
1
|
+
# CapSkip Node.js SDK — Captcha Solver for Node.js
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/capskip)
|
|
3
4
|
[](https://nodejs.org/)
|
|
4
5
|
[](LICENSE)
|
|
5
6
|
[](https://github.com/capskip/capskip-node/actions/workflows/ci.yml)
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
**Solve reCAPTCHA v2, reCAPTCHA v3, Cloudflare Turnstile, GeeTest, ALTCHA, Capy Puzzle, CaptchaFox, Friendly Captcha and image captchas from Node.js.**
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
Official Node.js client for [CapSkip](https://capskip.com), a **local captcha solver** that runs on your own machine. Licensed once, not billed per solve. TypeScript definitions included.
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install capskip
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## How it works
|
|
19
|
+
|
|
20
|
+
CapSkip is a desktop app. It does the solving on your machine and exposes the standard captcha-solver HTTP API — the same `in.php` / `res.php` endpoints every 2captcha-compatible client already speaks — on `127.0.0.1:8080`.
|
|
21
|
+
|
|
22
|
+
This SDK is a thin wrapper over that API, with the method names you would expect: `normal()`, `recaptcha()`, `turnstile()`, `geetest()`, `altcha()`, `capy()`, `captchafox()`, `friendlyCaptcha()`. Nothing leaves your network, and there is no credit balance to keep an eye on.
|
|
23
|
+
|
|
24
|
+
## Supported captcha types
|
|
25
|
+
|
|
26
|
+
| Captcha | Method |
|
|
27
|
+
|---|---|
|
|
28
|
+
| **Image captcha solver** (distorted text / OCR) | `solver.normal(file)` |
|
|
29
|
+
| **reCAPTCHA v2 solver** (checkbox) | `solver.recaptcha(sitekey, url)` |
|
|
30
|
+
| **reCAPTCHA v2 invisible solver** | `solver.recaptcha(sitekey, url, { invisible: 1 })` |
|
|
31
|
+
| **reCAPTCHA Enterprise solver** | `solver.recaptcha(sitekey, url, { enterprise: 1 })` |
|
|
32
|
+
| **reCAPTCHA v3 solver** | `solver.recaptcha(sitekey, url, { version: 'v3', action: 'submit' })` |
|
|
33
|
+
| reCAPTCHA v3 Enterprise | `solver.recaptcha(sitekey, url, { version: 'v3', enterprise: 1 })` |
|
|
34
|
+
| **Cloudflare Turnstile solver** (widget) | `solver.turnstile(sitekey, url)` |
|
|
35
|
+
| Cloudflare Turnstile (challenge page) | `solver.turnstile(sitekey, url, { data, pagedata })` |
|
|
36
|
+
| **GeeTest v3 solver** (slide puzzle) | `solver.geetest(gt, challenge, url)` |
|
|
37
|
+
| **ALTCHA solver** (proof-of-work) | `solver.altcha(url, { challengeUrl })` |
|
|
38
|
+
| **Capy Puzzle solver** (slide puzzle) | `solver.capy(sitekey, url)` |
|
|
39
|
+
| **CaptchaFox solver** (widget) | `solver.captchafox(sitekey, url)` |
|
|
40
|
+
| **Friendly Captcha solver** (proof-of-work) | `solver.friendlyCaptcha(sitekey, url, { version })` |
|
|
41
|
+
|
|
42
|
+
**hCaptcha and FunCaptcha/Arkose are not supported.** hCaptcha is the one people misidentify most often, since it also puts a `data-sitekey` on the widget — check for `class="h-captcha"` or a `js.hcaptcha.com` script before reaching for `recaptcha()`.
|
|
43
|
+
|
|
44
|
+
Point the SDK at the [live captcha demo pages](https://capskip.com/captcha-demo/) to sanity-check your setup against real widgets.
|
|
10
45
|
|
|
11
46
|
---
|
|
12
47
|
|
|
13
48
|
## Quick start (5 minutes)
|
|
14
49
|
|
|
15
|
-
### 1. Install CapSkip
|
|
50
|
+
### 1. Install the CapSkip captcha solver
|
|
16
51
|
|
|
17
|
-
Download and run the CapSkip desktop app
|
|
52
|
+
Download and run the CapSkip desktop app — [CapSkipInstaller.msi](https://capskip.com/download/CapSkipInstaller.msi). Leave it running in the background.
|
|
18
53
|
|
|
19
54
|
In CapSkip settings, note:
|
|
20
55
|
|
|
@@ -58,19 +93,20 @@ Every solve method returns a Promise — use `await` or `.then()`.
|
|
|
58
93
|
|
|
59
94
|
---
|
|
60
95
|
|
|
61
|
-
##
|
|
96
|
+
## Why solve captchas locally
|
|
62
97
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
98
|
+
Cloud captcha APIs charge per solve, which turns a retry loop into an expense and routes every page URL and sitekey you touch through someone else's queue.
|
|
99
|
+
|
|
100
|
+
CapSkip flips that around:
|
|
101
|
+
|
|
102
|
+
- **Unlimited solving** — one license, no per-captcha charge, no balance to top up
|
|
103
|
+
- **Runs on `127.0.0.1`** — the SDK never talks to a third-party server
|
|
104
|
+
- **No per-key rate limit** — throughput is whatever your machine can manage
|
|
105
|
+
- **Fast** — image captchas come back in well under a second; a typical reCAPTCHA v2 lands in 30–45 seconds
|
|
106
|
+
|
|
107
|
+
### Coming from 2captcha or Anti-Captcha
|
|
108
|
+
|
|
109
|
+
CapSkip answers on the same `in.php` / `res.php` endpoints, so it works as a **2captcha API alternative**: an existing integration usually needs nothing more than its host pointed at `127.0.0.1:8080`. The [migration notes](https://capskip.com/2captcha-api-alternative/) cover the details, if you would rather keep your current client library than switch to this one.
|
|
74
110
|
|
|
75
111
|
---
|
|
76
112
|
|
|
@@ -98,7 +134,9 @@ const solver = new CapSkip({
|
|
|
98
134
|
host: '127.0.0.1', // CapSkip host
|
|
99
135
|
port: 8080, // CapSkip port from app settings
|
|
100
136
|
defaultTimeout: 120, // seconds — image captcha polling timeout
|
|
101
|
-
recaptchaTimeout: 300, // seconds — reCAPTCHA / Turnstile / GeeTest
|
|
137
|
+
recaptchaTimeout: 300, // seconds — reCAPTCHA / Turnstile / GeeTest / CaptchaFox /
|
|
138
|
+
// Friendly Captcha polling timeout
|
|
139
|
+
// (ALTCHA and Capy use defaultTimeout — neither is a browser solve)
|
|
102
140
|
pollingInterval: 5, // max seconds between res.php polls (starts at 0.25s, backs off to this)
|
|
103
141
|
});
|
|
104
142
|
```
|
|
@@ -178,7 +216,104 @@ const result = await solver.geetest(
|
|
|
178
216
|
result.challenge, result.validate, result.seccode;
|
|
179
217
|
```
|
|
180
218
|
|
|
181
|
-
###
|
|
219
|
+
### ALTCHA
|
|
220
|
+
|
|
221
|
+
ALTCHA is proof-of-work, not recognition — there is nothing to read, so a solve
|
|
222
|
+
is deterministic and takes milliseconds. Give CapSkip the endpoint that serves
|
|
223
|
+
the challenge, or the challenge document itself.
|
|
224
|
+
|
|
225
|
+
```js
|
|
226
|
+
const result = await solver.altcha('https://example.com/signup', {
|
|
227
|
+
challengeUrl: 'https://example.com/captcha/api/altcha/challenge',
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
// Post this back in the form field the widget uses, named `altcha`
|
|
231
|
+
result.token;
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Challenges expire fast — some sites inside two minutes — so fetch one
|
|
235
|
+
immediately before solving and submit the token promptly.
|
|
236
|
+
|
|
237
|
+
### Capy Puzzle
|
|
238
|
+
|
|
239
|
+
A Capy solution is not a token. It is three values that together go into the
|
|
240
|
+
target form, so post all three back exactly as returned.
|
|
241
|
+
|
|
242
|
+
```js
|
|
243
|
+
const result = await solver.capy(
|
|
244
|
+
'PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v',
|
|
245
|
+
'https://example.com/login',
|
|
246
|
+
);
|
|
247
|
+
|
|
248
|
+
// capy_captchakey, capy_challengekey and capy_answer respectively
|
|
249
|
+
result.captchakey, result.challengekey, result.answer;
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
`answer` is the drag path the widget would have recorded — submit it verbatim,
|
|
253
|
+
without trimming or re-encoding it. The challenge key is single-use and
|
|
254
|
+
short-lived, so submit promptly rather than caching the three values.
|
|
255
|
+
|
|
256
|
+
Pass `api_server` when the widget script points somewhere other than
|
|
257
|
+
`https://jp.api.capy.me`. Only the `puzzle` family is solved; `version: 'avatar'`
|
|
258
|
+
is refused rather than answered with a puzzle answer the site would reject.
|
|
259
|
+
|
|
260
|
+
### CaptchaFox
|
|
261
|
+
|
|
262
|
+
```js
|
|
263
|
+
const result = await solver.captchafox(
|
|
264
|
+
'sk_xtNxpk6fCdFbxh1_xJeGflSdCE9tn99G',
|
|
265
|
+
'https://example.com/signup',
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
// Post this back in the form field the widget uses, named `cf-captcha-response`
|
|
269
|
+
result.token;
|
|
270
|
+
|
|
271
|
+
// The UA the token was minted under — submit under this one, not your own
|
|
272
|
+
result.userAgent;
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
`url` has to be the page the widget actually runs on: CaptchaFox checks it
|
|
276
|
+
against the domains the key is registered for and refuses a mismatch
|
|
277
|
+
permanently, not intermittently.
|
|
278
|
+
|
|
279
|
+
Pass `api_server` only when the page does not load the default widget. A page
|
|
280
|
+
loading the MAM package expects a `MAM_` prefixed token, and sending the wrong
|
|
281
|
+
source still succeeds — it just returns a token the site will not accept, which
|
|
282
|
+
reads as a silent verification failure rather than an error.
|
|
283
|
+
|
|
284
|
+
### Friendly Captcha
|
|
285
|
+
|
|
286
|
+
Two different protocols ship under this name and a sitekey does not tell you
|
|
287
|
+
which one a site uses, so say which — or send the widget script and let CapSkip
|
|
288
|
+
read it off the build the site actually loads.
|
|
289
|
+
|
|
290
|
+
```js
|
|
291
|
+
const result = await solver.friendlyCaptcha(
|
|
292
|
+
'FCMGEMUD2M567T8G',
|
|
293
|
+
'https://example.com/signup',
|
|
294
|
+
{ version: 'v2' },
|
|
295
|
+
);
|
|
296
|
+
|
|
297
|
+
// v1 → frc-captcha-solution, v2 → frc-captcha-response
|
|
298
|
+
result.token;
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
```js
|
|
302
|
+
// Or let the script URL decide the version
|
|
303
|
+
const result = await solver.friendlyCaptcha(
|
|
304
|
+
'FCMGEMUD2M567T8G',
|
|
305
|
+
'https://example.com/signup',
|
|
306
|
+
{ moduleScript: 'https://cdn.example.com/@friendlycaptcha/sdk@0.1.6/site.min.js' },
|
|
307
|
+
);
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
Solving the wrong version returns a well-formed token the target site rejects,
|
|
311
|
+
with nothing to indicate the version was the problem. With neither `version` nor
|
|
312
|
+
a script URL, v1 is assumed. Pass `api_server: 'eu'` for a sitekey on the EU
|
|
313
|
+
data-residency tenant. A v2 token is roughly six kilobytes, so size whatever
|
|
314
|
+
carries it accordingly.
|
|
315
|
+
|
|
316
|
+
### With a proxy (every method except image captcha)
|
|
182
317
|
|
|
183
318
|
```js
|
|
184
319
|
// Proxy is not supported for image captcha
|
|
@@ -213,6 +348,53 @@ More examples: [`examples/`](examples/)
|
|
|
213
348
|
|
|
214
349
|
---
|
|
215
350
|
|
|
351
|
+
## Puppeteer, Playwright and Selenium
|
|
352
|
+
|
|
353
|
+
The SDK hands back a token; your existing browser tooling does the driving. The shape is the same whichever you use:
|
|
354
|
+
|
|
355
|
+
1. Read the sitekey off the page (`data-sitekey`, or the widget's config object).
|
|
356
|
+
2. Call the matching solve method with that sitekey and the page URL.
|
|
357
|
+
3. Write the token into the response field and submit.
|
|
358
|
+
|
|
359
|
+
### Puppeteer
|
|
360
|
+
|
|
361
|
+
```js
|
|
362
|
+
const sitekey = await page.$eval('[data-sitekey]', el => el.dataset.sitekey);
|
|
363
|
+
const { code } = await solver.recaptcha(sitekey, page.url());
|
|
364
|
+
|
|
365
|
+
await page.evaluate(t => {
|
|
366
|
+
document.getElementById('g-recaptcha-response').value = t;
|
|
367
|
+
}, code);
|
|
368
|
+
await page.click('button[type=submit]');
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### Playwright
|
|
372
|
+
|
|
373
|
+
```js
|
|
374
|
+
const sitekey = await page.getAttribute('[data-sitekey]', 'data-sitekey');
|
|
375
|
+
const { code } = await solver.recaptcha(sitekey, page.url());
|
|
376
|
+
|
|
377
|
+
await page.evaluate(t => {
|
|
378
|
+
document.getElementById('g-recaptcha-response').value = t;
|
|
379
|
+
}, code);
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### Selenium WebDriver
|
|
383
|
+
|
|
384
|
+
```js
|
|
385
|
+
const el = await driver.findElement(By.css('[data-sitekey]'));
|
|
386
|
+
const sitekey = await el.getAttribute('data-sitekey');
|
|
387
|
+
const { code } = await solver.recaptcha(sitekey, await driver.getCurrentUrl());
|
|
388
|
+
|
|
389
|
+
await driver.executeScript(
|
|
390
|
+
'document.getElementById("g-recaptcha-response").value = arguments[0];', code,
|
|
391
|
+
);
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
Longer walkthroughs: [Puppeteer](https://capskip.com/puppeteer-captcha-solver/), [Playwright](https://capskip.com/playwright-captcha-solver/) and [Selenium](https://capskip.com/selenium-captcha-solver/).
|
|
395
|
+
|
|
396
|
+
---
|
|
397
|
+
|
|
216
398
|
## Return value
|
|
217
399
|
|
|
218
400
|
Every solve method resolves to:
|
|
@@ -226,7 +408,11 @@ Every solve method resolves to:
|
|
|
226
408
|
```
|
|
227
409
|
|
|
228
410
|
GeeTest additionally expands its answer into `challenge`, `validate`, and
|
|
229
|
-
`seccode`, while `code` keeps the raw JSON string.
|
|
411
|
+
`seccode`, while `code` keeps the raw JSON string. CaptchaFox and Friendly
|
|
412
|
+
Captcha add `token`, the same string as `code`. Capy expands its answer into
|
|
413
|
+
`captchakey`, `challengekey` and `answer` — it returns an object rather than a
|
|
414
|
+
token, and `code` keeps the raw answer. ALTCHA adds `token` (the same
|
|
415
|
+
string as `code`) and `number`, the counter that solved it.
|
|
230
416
|
|
|
231
417
|
---
|
|
232
418
|
|
|
@@ -267,6 +453,42 @@ const result: SolveResult = await solver.recaptcha('...', 'https://example.com')
|
|
|
267
453
|
|
|
268
454
|
---
|
|
269
455
|
|
|
456
|
+
## FAQ
|
|
457
|
+
|
|
458
|
+
### How do I solve a captcha in Node.js?
|
|
459
|
+
|
|
460
|
+
Install the CapSkip desktop app, `npm install capskip`, then call the method that matches the widget — `recaptcha()`, `turnstile()`, `geetest()`, `altcha()`, `capy()`, `captchafox()`, `friendlyCaptcha()` or `normal()`. Each returns a Promise that resolves once CapSkip has an answer, giving you a token, or the recognized text in the case of an image captcha.
|
|
461
|
+
|
|
462
|
+
### Is this a free captcha solver?
|
|
463
|
+
|
|
464
|
+
The SDK itself is MIT-licensed and free. Solving needs the CapSkip app, which is bought once rather than metered per captcha, so your cost stops scaling with volume.
|
|
465
|
+
|
|
466
|
+
### Which captchas can it solve?
|
|
467
|
+
|
|
468
|
+
reCAPTCHA v2 (checkbox and invisible), reCAPTCHA v3, reCAPTCHA Enterprise, Cloudflare Turnstile, GeeTest v3, ALTCHA, Capy Puzzle, CaptchaFox, Friendly Captcha, and image/text captchas. Not hCaptcha, and not FunCaptcha/Arkose.
|
|
469
|
+
|
|
470
|
+
### Does it work with Puppeteer and Playwright?
|
|
471
|
+
|
|
472
|
+
Yes — see [above](#puppeteer-playwright-and-selenium). The SDK never touches a browser itself, so it drops into whatever stack you already have, Selenium and plain `fetch` included.
|
|
473
|
+
|
|
474
|
+
### Why is my reCAPTCHA v3 score low?
|
|
475
|
+
|
|
476
|
+
Google derives v3 scores from IP reputation, cookies and browsing history. A solver returns a valid token, but it cannot change how Google grades that token — `score` is forwarded as the target you want, not a guarantee. If a site enforces a high threshold, solve through a cleaner IP using the `proxy` option.
|
|
477
|
+
|
|
478
|
+
### Can I use it as a 2captcha alternative?
|
|
479
|
+
|
|
480
|
+
Yes. CapSkip serves the same endpoints, so you can either move to this SDK or repoint an existing 2captcha client at `127.0.0.1:8080`.
|
|
481
|
+
|
|
482
|
+
### Does the captcha have to be on a public page?
|
|
483
|
+
|
|
484
|
+
For widget captchas, yes — CapSkip loads the URL you pass it. Image captchas only need the image, and that can be a local file.
|
|
485
|
+
|
|
486
|
+
### Does it work with TypeScript and ESM?
|
|
487
|
+
|
|
488
|
+
Types ship in the package. The runtime is CommonJS, so `import { CapSkip } from 'capskip'` works from ESM through Node's interop.
|
|
489
|
+
|
|
490
|
+
---
|
|
491
|
+
|
|
270
492
|
## Development
|
|
271
493
|
|
|
272
494
|
```bash
|
|
@@ -282,10 +504,12 @@ The test suite uses Node's built-in test runner — no extra dependencies. See [
|
|
|
282
504
|
|
|
283
505
|
## Links
|
|
284
506
|
|
|
285
|
-
- [CapSkip
|
|
286
|
-
- [
|
|
287
|
-
- [
|
|
288
|
-
- [
|
|
507
|
+
- [CapSkip — local captcha solver](https://capskip.com) · [download the app](https://capskip.com/download/CapSkipInstaller.msi)
|
|
508
|
+
- [Captcha demo pages](https://capskip.com/captcha-demo/) — live reCAPTCHA, Turnstile, GeeTest and image widgets
|
|
509
|
+
- [Node.js captcha solver guide](https://capskip.com/nodejs-captcha-solver/)
|
|
510
|
+
- [HTTP API docs](https://capskip.com/api-docs/)
|
|
511
|
+
- Other clients: [Python](https://github.com/capskip/capskip-python) · [PHP](https://github.com/capskip/capskip-php) · [.NET](https://github.com/capskip/capskip-dotnet) · [MCP server for AI agents](https://github.com/capskip/capskip-mcp)
|
|
512
|
+
- [npm package](https://www.npmjs.com/package/capskip) · [report an issue](https://github.com/capskip/capskip-node/issues)
|
|
289
513
|
|
|
290
514
|
---
|
|
291
515
|
|