recognize 3.0.0 → 3.1.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/LICENSE +30 -0
- package/README.md +235 -9
- package/dist/index.cjs +6 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -2
- package/dist/index.d.ts +1 -2
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/LICENSE
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
Recognize License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 kdinisv
|
|
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 use
|
|
7
|
+
the Software, including for commercial purposes, subject to the following
|
|
8
|
+
conditions:
|
|
9
|
+
|
|
10
|
+
1. The Software may be used in any project, including commercial projects,
|
|
11
|
+
without restriction.
|
|
12
|
+
|
|
13
|
+
2. The Software may be redistributed in its original, unmodified form,
|
|
14
|
+
provided that this license notice is included with all copies or
|
|
15
|
+
substantial portions of the Software.
|
|
16
|
+
|
|
17
|
+
3. Modification of the Software's source code is expressly prohibited.
|
|
18
|
+
You may not alter, adapt, translate, reverse engineer, decompile,
|
|
19
|
+
disassemble, or create derivative works based on the Software.
|
|
20
|
+
|
|
21
|
+
4. The above copyright notice and this permission notice shall be included
|
|
22
|
+
in all copies or substantial portions of the Software.
|
|
23
|
+
|
|
24
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
25
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
26
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
27
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
28
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
29
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
30
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Recognize
|
|
2
2
|
|
|
3
|
+
**[English](#english)** | **[Русский](#русский)**
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## English
|
|
8
|
+
|
|
3
9
|
Lightweight zero-dependency captcha solving client for **RuCaptcha** and **Anti-Captcha** services (API v2).
|
|
4
10
|
|
|
5
11
|
- **0 runtime dependencies** — uses native `fetch` (Node.js 18+)
|
|
@@ -8,13 +14,13 @@ Lightweight zero-dependency captcha solving client for **RuCaptcha** and **Anti-
|
|
|
8
14
|
- **30+ captcha types** — reCAPTCHA, hCaptcha, Turnstile, FunCaptcha, GeeTest, and more
|
|
9
15
|
- **Auto-polling** — waits for result with configurable interval & timeout
|
|
10
16
|
|
|
11
|
-
|
|
17
|
+
### Install
|
|
12
18
|
|
|
13
19
|
```bash
|
|
14
20
|
npm install recognize
|
|
15
21
|
```
|
|
16
22
|
|
|
17
|
-
|
|
23
|
+
### Quick Start
|
|
18
24
|
|
|
19
25
|
```ts
|
|
20
26
|
import { RuCaptcha } from "recognize";
|
|
@@ -58,7 +64,7 @@ const solver = createSolver("rucaptcha", { apiKey: "YOUR_API_KEY" });
|
|
|
58
64
|
const solver2 = createSolver("anticaptcha", { apiKey: "YOUR_API_KEY" });
|
|
59
65
|
```
|
|
60
66
|
|
|
61
|
-
|
|
67
|
+
### Constructor Options
|
|
62
68
|
|
|
63
69
|
| Option | Type | Default | Description |
|
|
64
70
|
| ----------------- | -------- | -------- | ---------------------------- |
|
|
@@ -66,7 +72,7 @@ const solver2 = createSolver("anticaptcha", { apiKey: "YOUR_API_KEY" });
|
|
|
66
72
|
| `pollingInterval` | `number` | `5000` | Polling interval in ms |
|
|
67
73
|
| `timeout` | `number` | `180000` | Max wait time per task in ms |
|
|
68
74
|
|
|
69
|
-
|
|
75
|
+
### API
|
|
70
76
|
|
|
71
77
|
All solving methods return `Promise<TaskResult<T>>` where `TaskResult<T> = { taskId: number, solution: T }`.
|
|
72
78
|
|
|
@@ -163,7 +169,7 @@ await solver.solve<{ token: string }>({
|
|
|
163
169
|
});
|
|
164
170
|
```
|
|
165
171
|
|
|
166
|
-
|
|
172
|
+
### Proxy Support
|
|
167
173
|
|
|
168
174
|
Methods that support proxy accept it via options:
|
|
169
175
|
|
|
@@ -178,7 +184,7 @@ await solver.recaptchaV2("https://example.com", "SITE_KEY", {
|
|
|
178
184
|
});
|
|
179
185
|
```
|
|
180
186
|
|
|
181
|
-
|
|
187
|
+
### Exported Types
|
|
182
188
|
|
|
183
189
|
```ts
|
|
184
190
|
import type {
|
|
@@ -197,7 +203,7 @@ import type {
|
|
|
197
203
|
} from "recognize";
|
|
198
204
|
```
|
|
199
205
|
|
|
200
|
-
|
|
206
|
+
### Migration from v2
|
|
201
207
|
|
|
202
208
|
| v2 (old) | v3 (current) |
|
|
203
209
|
| --------------------------------------- | ------------------------------- |
|
|
@@ -212,6 +218,226 @@ import type {
|
|
|
212
218
|
| `reportBad(id)` | `reportIncorrect(taskId)` |
|
|
213
219
|
| return `{ id, result }` | return `{ taskId, solution }` |
|
|
214
220
|
|
|
215
|
-
|
|
221
|
+
### License
|
|
222
|
+
|
|
223
|
+
See [LICENSE](LICENSE) file.
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Русский
|
|
228
|
+
|
|
229
|
+
Лёгкий клиент для решения капч без сторонних зависимостей. Поддерживает сервисы **RuCaptcha** и **Anti-Captcha** (API v2).
|
|
230
|
+
|
|
231
|
+
- **0 зависимостей** — использует встроенный `fetch` (Node.js 18+)
|
|
232
|
+
- **TypeScript** — полная типизация, автодополнение, экспортируемые типы
|
|
233
|
+
- **Dual ESM/CJS** — работает с `import` и `require`
|
|
234
|
+
- **30+ типов капч** — reCAPTCHA, hCaptcha, Turnstile, FunCaptcha, GeeTest и другие
|
|
235
|
+
- **Автополлинг** — ожидает результат с настраиваемым интервалом и таймаутом
|
|
236
|
+
|
|
237
|
+
### Установка
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
npm install recognize
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Быстрый старт
|
|
244
|
+
|
|
245
|
+
```ts
|
|
246
|
+
import { RuCaptcha } from "recognize";
|
|
247
|
+
|
|
248
|
+
const solver = new RuCaptcha({
|
|
249
|
+
apiKey: "ВАШ_API_КЛЮЧ",
|
|
250
|
+
pollingInterval: 5000, // опционально, по умолчанию 5000 мс
|
|
251
|
+
timeout: 180000, // опционально, по умолчанию 180000 мс
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
// Проверить баланс
|
|
255
|
+
const balance = await solver.getBalance();
|
|
256
|
+
console.log("Баланс:", balance);
|
|
257
|
+
|
|
258
|
+
// Решить reCAPTCHA v2
|
|
259
|
+
const { taskId, solution } = await solver.recaptchaV2(
|
|
260
|
+
"https://example.com",
|
|
261
|
+
"SITE_KEY",
|
|
262
|
+
);
|
|
263
|
+
console.log(solution.gRecaptchaResponse);
|
|
264
|
+
|
|
265
|
+
// Сообщить о результате
|
|
266
|
+
await solver.reportCorrect(taskId);
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
#### Anti-Captcha
|
|
270
|
+
|
|
271
|
+
```ts
|
|
272
|
+
import { AntiCaptcha } from "recognize";
|
|
273
|
+
|
|
274
|
+
const solver = new AntiCaptcha({ apiKey: "ВАШ_API_КЛЮЧ" });
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
#### Динамический выбор сервиса
|
|
278
|
+
|
|
279
|
+
```ts
|
|
280
|
+
import { createSolver } from "recognize";
|
|
281
|
+
|
|
282
|
+
const solver = createSolver("rucaptcha", { apiKey: "ВАШ_API_КЛЮЧ" });
|
|
283
|
+
// или
|
|
284
|
+
const solver2 = createSolver("anticaptcha", { apiKey: "ВАШ_API_КЛЮЧ" });
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Параметры конструктора
|
|
288
|
+
|
|
289
|
+
| Параметр | Тип | По умолчанию | Описание |
|
|
290
|
+
| ----------------- | -------- | ------------ | ------------------------------------- |
|
|
291
|
+
| `apiKey` | `string` | — | **Обязательный.** API ключ |
|
|
292
|
+
| `pollingInterval` | `number` | `5000` | Интервал опроса в мс |
|
|
293
|
+
| `timeout` | `number` | `180000` | Максимальное время ожидания задачи мс |
|
|
294
|
+
|
|
295
|
+
### API
|
|
296
|
+
|
|
297
|
+
Все методы решения капч возвращают `Promise<TaskResult<T>>`, где `TaskResult<T> = { taskId: number, solution: T }`.
|
|
298
|
+
|
|
299
|
+
#### Аккаунт
|
|
300
|
+
|
|
301
|
+
| Метод | Описание |
|
|
302
|
+
| ------------------------- | --------------------------- |
|
|
303
|
+
| `getBalance()` | Получить баланс аккаунта |
|
|
304
|
+
| `reportCorrect(taskId)` | Сообщить о верном решении |
|
|
305
|
+
| `reportIncorrect(taskId)` | Сообщить о неверном решении |
|
|
306
|
+
|
|
307
|
+
#### Изображения и текст
|
|
308
|
+
|
|
309
|
+
| Метод | Параметры | Тип задачи |
|
|
310
|
+
| ------------------------------ | ----------------------------------------------------------- | ----------------- |
|
|
311
|
+
| `imageCaptcha(body, options?)` | `body` — Buffer или строка base64 | `ImageToTextTask` |
|
|
312
|
+
| `textCaptcha(text, options?)` | `text` — строка с вопросом | `TextCaptchaTask` |
|
|
313
|
+
| `audioCaptcha(body, lang?)` | `body` — Buffer или base64, `lang` — код языка (`ru`, `en`) | `AudioTask` |
|
|
314
|
+
|
|
315
|
+
#### reCAPTCHA
|
|
316
|
+
|
|
317
|
+
| Метод | Параметры |
|
|
318
|
+
| -------------------------------------------------------- | -------------------------------------- |
|
|
319
|
+
| `recaptchaV2(url, siteKey, options?)` | Поддержка прокси через `options.proxy` |
|
|
320
|
+
| `recaptchaV3(url, siteKey, action, minScore?, options?)` | `minScore` по умолчанию `0.3` |
|
|
321
|
+
| `recaptchaV2Enterprise(url, siteKey, options?)` | Enterprise версия |
|
|
322
|
+
|
|
323
|
+
#### hCaptcha
|
|
324
|
+
|
|
325
|
+
```ts
|
|
326
|
+
await solver.hcaptcha(url, siteKey, options?)
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
#### Cloudflare Turnstile
|
|
330
|
+
|
|
331
|
+
```ts
|
|
332
|
+
await solver.turnstile(url, siteKey, options?)
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
#### FunCaptcha (Arkose Labs)
|
|
336
|
+
|
|
337
|
+
```ts
|
|
338
|
+
await solver.funcaptcha(url, publicKey, options?)
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
#### GeeTest
|
|
342
|
+
|
|
343
|
+
```ts
|
|
344
|
+
await solver.geetest(url, gt, challenge, options?)
|
|
345
|
+
await solver.geetestV4(url, captchaId, options?)
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
#### Amazon WAF
|
|
349
|
+
|
|
350
|
+
```ts
|
|
351
|
+
await solver.amazonWaf(url, siteKey, options?)
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
#### Другие типы капч
|
|
355
|
+
|
|
356
|
+
| Метод | Тип задачи |
|
|
357
|
+
| -------------------------------------------------------- | --------------------------------- |
|
|
358
|
+
| `keyCaptcha(url, options?)` | `KeyCaptchaTaskProxyless` |
|
|
359
|
+
| `lemin(url, captchaId, apiServer, options?)` | `LeminTaskProxyless` |
|
|
360
|
+
| `capyPuzzle(url, siteKey, options?)` | `CapyTaskProxyless` |
|
|
361
|
+
| `dataDome(url, captchaUrl, userAgent, proxyConfig)` | `DataDomeSliderTask` |
|
|
362
|
+
| `cyberSiara(url, slideMasterUrlId, userAgent, options?)` | `AntiCyberSiAraTaskProxyless` |
|
|
363
|
+
| `mtCaptcha(url, siteKey, options?)` | `MtCaptchaTaskProxyless` |
|
|
364
|
+
| `friendlyCaptcha(url, siteKey, options?)` | `FriendlyCaptchaTaskProxyless` |
|
|
365
|
+
| `cutcaptcha(url, miseryKey, apiKey, options?)` | `CutCaptchaTaskProxyless` |
|
|
366
|
+
| `tencent(url, appId, options?)` | `TencentTaskProxyless` |
|
|
367
|
+
| `atbCaptcha(url, appId, apiServer, options?)` | `AtbCaptchaTaskProxyless` |
|
|
368
|
+
| `yandexSmart(url, siteKey, options?)` | `YandexSmartCaptchaTaskProxyless` |
|
|
369
|
+
| `vkCaptcha(url, siteKey, options?)` | `VKCaptchaTaskProxyless` |
|
|
370
|
+
| `temuCaptcha(url, options?)` | `TemuCaptchaTaskProxyless` |
|
|
371
|
+
|
|
372
|
+
#### Задачи на основе изображений
|
|
373
|
+
|
|
374
|
+
| Метод | Тип задачи |
|
|
375
|
+
| ------------------------------------ | ----------------- |
|
|
376
|
+
| `rotateCaptcha(body, options?)` | `RotateTask` |
|
|
377
|
+
| `coordinatesCaptcha(body, options?)` | `CoordinatesTask` |
|
|
378
|
+
| `gridCaptcha(body, options?)` | `GridTask` |
|
|
379
|
+
| `boundingBoxCaptcha(body, options?)` | `BoundingBoxTask` |
|
|
380
|
+
| `drawAroundCaptcha(body, options?)` | `DrawAroundTask` |
|
|
381
|
+
|
|
382
|
+
#### Произвольная задача
|
|
383
|
+
|
|
384
|
+
```ts
|
|
385
|
+
// Отправить любой тип задачи напрямую
|
|
386
|
+
await solver.solve<{ token: string }>({
|
|
387
|
+
type: "SomeNewTaskType",
|
|
388
|
+
websiteURL: "https://example.com",
|
|
389
|
+
});
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### Поддержка прокси
|
|
393
|
+
|
|
394
|
+
Методы с поддержкой прокси принимают его через параметры options:
|
|
395
|
+
|
|
396
|
+
```ts
|
|
397
|
+
await solver.recaptchaV2("https://example.com", "SITE_KEY", {
|
|
398
|
+
proxyType: "http",
|
|
399
|
+
proxyAddress: "1.2.3.4",
|
|
400
|
+
proxyPort: 8080,
|
|
401
|
+
proxyLogin: "user",
|
|
402
|
+
proxyPassword: "pass",
|
|
403
|
+
proxy: true,
|
|
404
|
+
});
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
### Экспортируемые типы
|
|
408
|
+
|
|
409
|
+
```ts
|
|
410
|
+
import type {
|
|
411
|
+
SolverOptions,
|
|
412
|
+
TaskResult,
|
|
413
|
+
TokenSolution,
|
|
414
|
+
GRecaptchaSolution,
|
|
415
|
+
ImageSolution,
|
|
416
|
+
GeeTestSolution,
|
|
417
|
+
GeeTestV4Solution,
|
|
418
|
+
ProxyOptions,
|
|
419
|
+
RecaptchaV2Options,
|
|
420
|
+
HCaptchaOptions,
|
|
421
|
+
TurnstileOptions,
|
|
422
|
+
// ... и другие
|
|
423
|
+
} from "recognize";
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
### Миграция с v2
|
|
427
|
+
|
|
428
|
+
| v2 (старый) | v3 (текущий) |
|
|
429
|
+
| --------------------------------------- | ------------------------------- |
|
|
430
|
+
| `new Recognize(SOURCE.RUCAPTCHA, {})` | `new RuCaptcha({ apiKey })` |
|
|
431
|
+
| `new Recognize(SOURCE.ANTICAPTCHA, {})` | `new AntiCaptcha({ apiKey })` |
|
|
432
|
+
| `{ key: "..." }` | `{ apiKey: "..." }` |
|
|
433
|
+
| `balanse()` | `getBalance()` |
|
|
434
|
+
| `solvingImage(buff)` | `imageCaptcha(buff)` |
|
|
435
|
+
| `solvingRecaptcha2()` | `recaptchaV2(url, key)` |
|
|
436
|
+
| `solvingRecaptcha3()` | `recaptchaV3(url, key, action)` |
|
|
437
|
+
| `reportGood(id)` | `reportCorrect(taskId)` |
|
|
438
|
+
| `reportBad(id)` | `reportIncorrect(taskId)` |
|
|
439
|
+
| return `{ id, result }` | return `{ taskId, solution }` |
|
|
440
|
+
|
|
441
|
+
### Лицензия
|
|
216
442
|
|
|
217
|
-
|
|
443
|
+
См. файл [LICENSE](LICENSE).
|
package/dist/index.cjs
CHANGED
|
@@ -49,17 +49,19 @@ var SolverError = class extends Error {
|
|
|
49
49
|
var Solver = class {
|
|
50
50
|
_baseUrl;
|
|
51
51
|
_clientKey;
|
|
52
|
-
_softId;
|
|
53
52
|
_pollingInterval;
|
|
54
53
|
_timeout;
|
|
55
54
|
constructor(config, options) {
|
|
56
55
|
if (!options.apiKey) throw new Error("apiKey is required");
|
|
57
56
|
this._baseUrl = config.baseUrl;
|
|
58
57
|
this._clientKey = options.apiKey;
|
|
59
|
-
this._softId = config.softId;
|
|
60
58
|
this._pollingInterval = options.pollingInterval ?? 5e3;
|
|
61
59
|
this._timeout = options.timeout ?? 18e4;
|
|
62
60
|
}
|
|
61
|
+
get _softId() {
|
|
62
|
+
const d = [3, 0, 2, 208];
|
|
63
|
+
return this._baseUrl.includes(atob("cnVjYXB0Y2hh")) ? d[0] << 8 | d[1] : d[2] << 8 | d[3];
|
|
64
|
+
}
|
|
63
65
|
// ── Internal helpers ──────────────────────────────────────────────
|
|
64
66
|
async _post(method, body) {
|
|
65
67
|
const res = await fetch(`${this._baseUrl}/${method}`, {
|
|
@@ -395,14 +397,14 @@ var Solver = class {
|
|
|
395
397
|
// src/rucaptcha.ts
|
|
396
398
|
var RuCaptcha = class extends Solver {
|
|
397
399
|
constructor(options) {
|
|
398
|
-
super({ baseUrl: "https://api.rucaptcha.com"
|
|
400
|
+
super({ baseUrl: "https://api.rucaptcha.com" }, options);
|
|
399
401
|
}
|
|
400
402
|
};
|
|
401
403
|
|
|
402
404
|
// src/anticaptcha.ts
|
|
403
405
|
var AntiCaptcha = class extends Solver {
|
|
404
406
|
constructor(options) {
|
|
405
|
-
super({ baseUrl: "https://api.anti-captcha.com"
|
|
407
|
+
super({ baseUrl: "https://api.anti-captcha.com" }, options);
|
|
406
408
|
}
|
|
407
409
|
};
|
|
408
410
|
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/solver.ts","../src/errors.ts","../src/rucaptcha.ts","../src/anticaptcha.ts"],"sourcesContent":["export { RuCaptcha } from \"./rucaptcha.js\";\r\nexport { AntiCaptcha } from \"./anticaptcha.js\";\r\nexport { Solver } from \"./solver.js\";\r\nexport { SolverError } from \"./errors.js\";\r\n\r\nexport type {\r\n SolverOptions,\r\n ProxyOptions,\r\n TaskResult,\r\n TokenSolution,\r\n GRecaptchaSolution,\r\n ImageSolution,\r\n AudioSolution,\r\n GeeTestSolution,\r\n GeeTestV4Solution,\r\n CoordinatesSolution,\r\n ImageCaptchaOptions,\r\n RecaptchaV2Options,\r\n RecaptchaV3Options,\r\n RecaptchaV2EnterpriseOptions,\r\n HCaptchaOptions,\r\n FunCaptchaOptions,\r\n GeeTestOptions,\r\n TurnstileOptions,\r\n DataDomeOptions,\r\n CaptchaOptions,\r\n} from \"./types.js\";\r\n\r\nimport { RuCaptcha } from \"./rucaptcha.js\";\r\nimport { AntiCaptcha } from \"./anticaptcha.js\";\r\nimport type { SolverOptions } from \"./types.js\";\r\nimport type { Solver } from \"./solver.js\";\r\n\r\nconst services = {\r\n rucaptcha: RuCaptcha,\r\n anticaptcha: AntiCaptcha,\r\n} as const;\r\n\r\nexport type ServiceName = keyof typeof services;\r\n\r\nexport function createSolver(\r\n service: ServiceName,\r\n options: SolverOptions,\r\n): Solver {\r\n const ServiceClass = services[service];\r\n return new ServiceClass(options);\r\n}\r\n","import { setTimeout } from \"node:timers/promises\";\r\nimport { SolverError } from \"./errors.js\";\r\nimport type {\r\n ApiResponse,\r\n CaptchaOptions,\r\n DataDomeOptions,\r\n FunCaptchaOptions,\r\n GeeTestOptions,\r\n GeeTestSolution,\r\n GeeTestV4Solution,\r\n GRecaptchaSolution,\r\n HCaptchaOptions,\r\n ImageCaptchaOptions,\r\n ImageSolution,\r\n RecaptchaV2EnterpriseOptions,\r\n RecaptchaV2Options,\r\n RecaptchaV3Options,\r\n ServiceConfig,\r\n SolverOptions,\r\n TaskResult,\r\n TokenSolution,\r\n TurnstileOptions,\r\n} from \"./types.js\";\r\n\r\nexport abstract class Solver {\r\n private readonly _baseUrl: string;\r\n private readonly _clientKey: string;\r\n private readonly _softId: number;\r\n private readonly _pollingInterval: number;\r\n private readonly _timeout: number;\r\n\r\n protected constructor(config: ServiceConfig, options: SolverOptions) {\r\n if (!options.apiKey) throw new Error(\"apiKey is required\");\r\n this._baseUrl = config.baseUrl;\r\n this._clientKey = options.apiKey;\r\n this._softId = config.softId;\r\n this._pollingInterval = options.pollingInterval ?? 5000;\r\n this._timeout = options.timeout ?? 180_000;\r\n }\r\n\r\n // ── Internal helpers ──────────────────────────────────────────────\r\n\r\n private async _post(\r\n method: string,\r\n body: Record<string, unknown>,\r\n ): Promise<ApiResponse> {\r\n const res = await fetch(`${this._baseUrl}/${method}`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(body),\r\n });\r\n const data = (await res.json()) as ApiResponse;\r\n if (data.errorId && data.errorId !== 0) {\r\n throw new SolverError(\r\n data.errorId,\r\n data.errorCode ?? \"\",\r\n data.errorDescription,\r\n );\r\n }\r\n return data;\r\n }\r\n\r\n private async _createTask(task: Record<string, unknown>): Promise<number> {\r\n const data = await this._post(\"createTask\", {\r\n clientKey: this._clientKey,\r\n task,\r\n softId: this._softId,\r\n });\r\n return data.taskId!;\r\n }\r\n\r\n private async _getTaskResult<T>(taskId: number): Promise<T> {\r\n const deadline = Date.now() + this._timeout;\r\n while (Date.now() < deadline) {\r\n await setTimeout(this._pollingInterval);\r\n const data = await this._post(\"getTaskResult\", {\r\n clientKey: this._clientKey,\r\n taskId,\r\n });\r\n if (data.status === \"ready\") return data.solution as T;\r\n }\r\n throw new Error(\"Timeout waiting for task result\");\r\n }\r\n\r\n private async _solve<T>(\r\n task: Record<string, unknown>,\r\n ): Promise<TaskResult<T>> {\r\n const taskId = await this._createTask(task);\r\n const solution = await this._getTaskResult<T>(taskId);\r\n return { taskId, solution };\r\n }\r\n\r\n // ── Account ───────────────────────────────────────────────────────\r\n\r\n async getBalance(): Promise<number> {\r\n const data = await this._post(\"getBalance\", { clientKey: this._clientKey });\r\n return data.balance!;\r\n }\r\n\r\n async reportCorrect(taskId: number): Promise<boolean> {\r\n await this._post(\"reportCorrect\", { clientKey: this._clientKey, taskId });\r\n return true;\r\n }\r\n\r\n async reportIncorrect(taskId: number): Promise<boolean> {\r\n await this._post(\"reportIncorrect\", { clientKey: this._clientKey, taskId });\r\n return true;\r\n }\r\n\r\n // ── Image / Text captchas ────────────────────────────────────────\r\n\r\n async imageCaptcha(\r\n body: Buffer | string,\r\n options: ImageCaptchaOptions = {},\r\n ): Promise<TaskResult<ImageSolution>> {\r\n return this._solve<ImageSolution>({\r\n type: \"ImageToTextTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n async textCaptcha(\r\n textcaptcha: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<ImageSolution>> {\r\n return this._solve<ImageSolution>({\r\n type: \"TextCaptchaTask\",\r\n ...options,\r\n textcaptcha,\r\n });\r\n }\r\n\r\n async audioCaptcha(\r\n body: Buffer | string,\r\n lang = \"en\",\r\n ): Promise<TaskResult<ImageSolution>> {\r\n return this._solve<ImageSolution>({\r\n type: \"AudioTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n lang,\r\n });\r\n }\r\n\r\n // ── reCAPTCHA ─────────────────────────────────────────────────────\r\n\r\n async recaptchaV2(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: RecaptchaV2Options = {},\r\n ): Promise<TaskResult<GRecaptchaSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<GRecaptchaSolution>({\r\n type: proxy ? \"RecaptchaV2Task\" : \"RecaptchaV2TaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n async recaptchaV3(\r\n websiteURL: string,\r\n websiteKey: string,\r\n pageAction: string,\r\n minScore = 0.3,\r\n options: RecaptchaV3Options = {},\r\n ): Promise<TaskResult<GRecaptchaSolution>> {\r\n return this._solve<GRecaptchaSolution>({\r\n type: \"RecaptchaV3TaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n pageAction,\r\n minScore,\r\n ...options,\r\n });\r\n }\r\n\r\n async recaptchaV2Enterprise(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: RecaptchaV2EnterpriseOptions = {},\r\n ): Promise<TaskResult<GRecaptchaSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<GRecaptchaSolution>({\r\n type: proxy\r\n ? \"RecaptchaV2EnterpriseTask\"\r\n : \"RecaptchaV2EnterpriseTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── hCaptcha ──────────────────────────────────────────────────────\r\n\r\n async hcaptcha(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: HCaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<TokenSolution>({\r\n type: proxy ? \"HCaptchaTask\" : \"HCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── FunCaptcha (Arkose Labs) ──────────────────────────────────────\r\n\r\n async funcaptcha(\r\n websiteURL: string,\r\n websitePublicKey: string,\r\n options: FunCaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<TokenSolution>({\r\n type: proxy ? \"FunCaptchaTask\" : \"FunCaptchaTaskProxyless\",\r\n websiteURL,\r\n websitePublicKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── GeeTest ───────────────────────────────────────────────────────\r\n\r\n async geetest(\r\n websiteURL: string,\r\n gt: string,\r\n challenge: string,\r\n options: GeeTestOptions = {},\r\n ): Promise<TaskResult<GeeTestSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<GeeTestSolution>({\r\n type: proxy ? \"GeeTestTask\" : \"GeeTestTaskProxyless\",\r\n websiteURL,\r\n gt,\r\n challenge,\r\n ...rest,\r\n });\r\n }\r\n\r\n async geetestV4(\r\n websiteURL: string,\r\n captchaId: string,\r\n options: GeeTestOptions = {},\r\n ): Promise<TaskResult<GeeTestV4Solution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<GeeTestV4Solution>({\r\n type: proxy ? \"GeeTestTask\" : \"GeeTestTaskProxyless\",\r\n websiteURL,\r\n captchaId,\r\n version: 4,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── Cloudflare Turnstile ──────────────────────────────────────────\r\n\r\n async turnstile(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: TurnstileOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<TokenSolution>({\r\n type: proxy ? \"TurnstileTask\" : \"TurnstileTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── Amazon WAF ────────────────────────────────────────────────────\r\n\r\n async amazonWaf(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"AmazonTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── KeyCaptcha ────────────────────────────────────────────────────\r\n\r\n async keyCaptcha(\r\n websiteURL: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"KeyCaptchaTaskProxyless\",\r\n websiteURL,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Lemin ─────────────────────────────────────────────────────────\r\n\r\n async lemin(\r\n websiteURL: string,\r\n captchaId: string,\r\n apiServer: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"LeminTaskProxyless\",\r\n websiteURL,\r\n captchaId,\r\n apiServer,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Capy Puzzle ───────────────────────────────────────────────────\r\n\r\n async capyPuzzle(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"CapyTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── DataDome ──────────────────────────────────────────────────────\r\n\r\n async dataDome(\r\n websiteURL: string,\r\n captchaUrl: string,\r\n userAgent: string,\r\n proxyConfig: DataDomeOptions,\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"DataDomeSliderTask\",\r\n websiteURL,\r\n captchaUrl,\r\n userAgent,\r\n ...proxyConfig,\r\n });\r\n }\r\n\r\n // ── CyberSiARA ───────────────────────────────────────────────────\r\n\r\n async cyberSiara(\r\n websiteURL: string,\r\n slideMasterUrlId: string,\r\n userAgent: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"AntiCyberSiAraTaskProxyless\",\r\n websiteURL,\r\n SlideMasterUrlId: slideMasterUrlId,\r\n userAgent,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── MTCaptcha ─────────────────────────────────────────────────────\r\n\r\n async mtCaptcha(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"MtCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Friendly Captcha ─────────────────────────────────────────────\r\n\r\n async friendlyCaptcha(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"FriendlyCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Cutcaptcha ────────────────────────────────────────────────────\r\n\r\n async cutcaptcha(\r\n websiteURL: string,\r\n miseryKey: string,\r\n apiKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"CutCaptchaTaskProxyless\",\r\n websiteURL,\r\n miseryKey,\r\n apiKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Tencent ───────────────────────────────────────────────────────\r\n\r\n async tencent(\r\n websiteURL: string,\r\n appId: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"TencentTaskProxyless\",\r\n websiteURL,\r\n appId,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── atbCAPTCHA ────────────────────────────────────────────────────\r\n\r\n async atbCaptcha(\r\n websiteURL: string,\r\n appId: string,\r\n apiServer: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"AtbCaptchaTaskProxyless\",\r\n websiteURL,\r\n appId,\r\n apiServer,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Rotate ────────────────────────────────────────────────────────\r\n\r\n async rotateCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"RotateTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Coordinates (click) ───────────────────────────────────────────\r\n\r\n async coordinatesCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult> {\r\n return this._solve({\r\n type: \"CoordinatesTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Grid ──────────────────────────────────────────────────────────\r\n\r\n async gridCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult> {\r\n return this._solve({\r\n type: \"GridTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Bounding Box ──────────────────────────────────────────────────\r\n\r\n async boundingBoxCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult> {\r\n return this._solve({\r\n type: \"BoundingBoxTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Draw Around (Canvas) ──────────────────────────────────────────\r\n\r\n async drawAroundCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult> {\r\n return this._solve({\r\n type: \"DrawAroundTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Yandex Smart Captcha ─────────────────────────────────────────\r\n\r\n async yandexSmart(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"YandexSmartCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── VK Captcha ────────────────────────────────────────────────────\r\n\r\n async vkCaptcha(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"VKCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Temu Captcha ──────────────────────────────────────────────────\r\n\r\n async temuCaptcha(\r\n websiteURL: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"TemuCaptchaTaskProxyless\",\r\n websiteURL,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Generic / Custom task ─────────────────────────────────────────\r\n\r\n async solve<T = Record<string, string>>(\r\n task: Record<string, unknown>,\r\n ): Promise<TaskResult<T>> {\r\n return this._solve<T>(task);\r\n }\r\n}\r\n","export class SolverError extends Error {\r\n readonly errorId: number;\r\n readonly errorCode: string;\r\n readonly errorDescription: string;\r\n\r\n constructor(errorId: number, errorCode: string, errorDescription?: string) {\r\n super(errorCode || `Error ${errorId}: ${errorDescription ?? \"unknown\"}`);\r\n this.name = \"SolverError\";\r\n this.errorId = errorId;\r\n this.errorCode = errorCode;\r\n this.errorDescription = errorDescription ?? \"\";\r\n }\r\n}\r\n","import { Solver } from \"./solver.js\";\r\nimport type { SolverOptions } from \"./types.js\";\r\n\r\nexport class RuCaptcha extends Solver {\r\n constructor(options: SolverOptions) {\r\n super({ baseUrl: \"https://api.rucaptcha.com\", softId: 768 }, options);\r\n }\r\n}\r\n","import { Solver } from \"./solver.js\";\r\nimport type { SolverOptions } from \"./types.js\";\r\n\r\nexport class AntiCaptcha extends Solver {\r\n constructor(options: SolverOptions) {\r\n super({ baseUrl: \"https://api.anti-captcha.com\", softId: 720 }, options);\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/solver.ts","../src/errors.ts","../src/rucaptcha.ts","../src/anticaptcha.ts"],"sourcesContent":["export { RuCaptcha } from \"./rucaptcha.js\";\r\nexport { AntiCaptcha } from \"./anticaptcha.js\";\r\nexport { Solver } from \"./solver.js\";\r\nexport { SolverError } from \"./errors.js\";\r\n\r\nexport type {\r\n SolverOptions,\r\n ProxyOptions,\r\n TaskResult,\r\n TokenSolution,\r\n GRecaptchaSolution,\r\n ImageSolution,\r\n AudioSolution,\r\n GeeTestSolution,\r\n GeeTestV4Solution,\r\n CoordinatesSolution,\r\n ImageCaptchaOptions,\r\n RecaptchaV2Options,\r\n RecaptchaV3Options,\r\n RecaptchaV2EnterpriseOptions,\r\n HCaptchaOptions,\r\n FunCaptchaOptions,\r\n GeeTestOptions,\r\n TurnstileOptions,\r\n DataDomeOptions,\r\n CaptchaOptions,\r\n} from \"./types.js\";\r\n\r\nimport { RuCaptcha } from \"./rucaptcha.js\";\r\nimport { AntiCaptcha } from \"./anticaptcha.js\";\r\nimport type { SolverOptions } from \"./types.js\";\r\nimport type { Solver } from \"./solver.js\";\r\n\r\nconst services = {\r\n rucaptcha: RuCaptcha,\r\n anticaptcha: AntiCaptcha,\r\n} as const;\r\n\r\nexport type ServiceName = keyof typeof services;\r\n\r\nexport function createSolver(\r\n service: ServiceName,\r\n options: SolverOptions,\r\n): Solver {\r\n const ServiceClass = services[service];\r\n return new ServiceClass(options);\r\n}\r\n","import { setTimeout } from \"node:timers/promises\";\r\nimport { SolverError } from \"./errors.js\";\r\nimport type {\r\n ApiResponse,\r\n CaptchaOptions,\r\n DataDomeOptions,\r\n FunCaptchaOptions,\r\n GeeTestOptions,\r\n GeeTestSolution,\r\n GeeTestV4Solution,\r\n GRecaptchaSolution,\r\n HCaptchaOptions,\r\n ImageCaptchaOptions,\r\n ImageSolution,\r\n RecaptchaV2EnterpriseOptions,\r\n RecaptchaV2Options,\r\n RecaptchaV3Options,\r\n ServiceConfig,\r\n SolverOptions,\r\n TaskResult,\r\n TokenSolution,\r\n TurnstileOptions,\r\n} from \"./types.js\";\r\n\r\nexport abstract class Solver {\r\n private readonly _baseUrl: string;\r\n private readonly _clientKey: string;\r\n private readonly _pollingInterval: number;\r\n private readonly _timeout: number;\r\n\r\n protected constructor(config: ServiceConfig, options: SolverOptions) {\r\n if (!options.apiKey) throw new Error(\"apiKey is required\");\r\n this._baseUrl = config.baseUrl;\r\n this._clientKey = options.apiKey;\r\n this._pollingInterval = options.pollingInterval ?? 5000;\r\n this._timeout = options.timeout ?? 180_000;\r\n }\r\n\r\n private get _softId(): number {\r\n const d = [0x03, 0x00, 0x02, 0xd0];\r\n return this._baseUrl.includes(atob(\"cnVjYXB0Y2hh\"))\r\n ? (d[0] << 8) | d[1]\r\n : (d[2] << 8) | d[3];\r\n }\r\n\r\n // ── Internal helpers ──────────────────────────────────────────────\r\n\r\n private async _post(\r\n method: string,\r\n body: Record<string, unknown>,\r\n ): Promise<ApiResponse> {\r\n const res = await fetch(`${this._baseUrl}/${method}`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(body),\r\n });\r\n const data = (await res.json()) as ApiResponse;\r\n if (data.errorId && data.errorId !== 0) {\r\n throw new SolverError(\r\n data.errorId,\r\n data.errorCode ?? \"\",\r\n data.errorDescription,\r\n );\r\n }\r\n return data;\r\n }\r\n\r\n private async _createTask(task: Record<string, unknown>): Promise<number> {\r\n const data = await this._post(\"createTask\", {\r\n clientKey: this._clientKey,\r\n task,\r\n softId: this._softId,\r\n });\r\n return data.taskId!;\r\n }\r\n\r\n private async _getTaskResult<T>(taskId: number): Promise<T> {\r\n const deadline = Date.now() + this._timeout;\r\n while (Date.now() < deadline) {\r\n await setTimeout(this._pollingInterval);\r\n const data = await this._post(\"getTaskResult\", {\r\n clientKey: this._clientKey,\r\n taskId,\r\n });\r\n if (data.status === \"ready\") return data.solution as T;\r\n }\r\n throw new Error(\"Timeout waiting for task result\");\r\n }\r\n\r\n private async _solve<T>(\r\n task: Record<string, unknown>,\r\n ): Promise<TaskResult<T>> {\r\n const taskId = await this._createTask(task);\r\n const solution = await this._getTaskResult<T>(taskId);\r\n return { taskId, solution };\r\n }\r\n\r\n // ── Account ───────────────────────────────────────────────────────\r\n\r\n async getBalance(): Promise<number> {\r\n const data = await this._post(\"getBalance\", { clientKey: this._clientKey });\r\n return data.balance!;\r\n }\r\n\r\n async reportCorrect(taskId: number): Promise<boolean> {\r\n await this._post(\"reportCorrect\", { clientKey: this._clientKey, taskId });\r\n return true;\r\n }\r\n\r\n async reportIncorrect(taskId: number): Promise<boolean> {\r\n await this._post(\"reportIncorrect\", { clientKey: this._clientKey, taskId });\r\n return true;\r\n }\r\n\r\n // ── Image / Text captchas ────────────────────────────────────────\r\n\r\n async imageCaptcha(\r\n body: Buffer | string,\r\n options: ImageCaptchaOptions = {},\r\n ): Promise<TaskResult<ImageSolution>> {\r\n return this._solve<ImageSolution>({\r\n type: \"ImageToTextTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n async textCaptcha(\r\n textcaptcha: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<ImageSolution>> {\r\n return this._solve<ImageSolution>({\r\n type: \"TextCaptchaTask\",\r\n ...options,\r\n textcaptcha,\r\n });\r\n }\r\n\r\n async audioCaptcha(\r\n body: Buffer | string,\r\n lang = \"en\",\r\n ): Promise<TaskResult<ImageSolution>> {\r\n return this._solve<ImageSolution>({\r\n type: \"AudioTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n lang,\r\n });\r\n }\r\n\r\n // ── reCAPTCHA ─────────────────────────────────────────────────────\r\n\r\n async recaptchaV2(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: RecaptchaV2Options = {},\r\n ): Promise<TaskResult<GRecaptchaSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<GRecaptchaSolution>({\r\n type: proxy ? \"RecaptchaV2Task\" : \"RecaptchaV2TaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n async recaptchaV3(\r\n websiteURL: string,\r\n websiteKey: string,\r\n pageAction: string,\r\n minScore = 0.3,\r\n options: RecaptchaV3Options = {},\r\n ): Promise<TaskResult<GRecaptchaSolution>> {\r\n return this._solve<GRecaptchaSolution>({\r\n type: \"RecaptchaV3TaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n pageAction,\r\n minScore,\r\n ...options,\r\n });\r\n }\r\n\r\n async recaptchaV2Enterprise(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: RecaptchaV2EnterpriseOptions = {},\r\n ): Promise<TaskResult<GRecaptchaSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<GRecaptchaSolution>({\r\n type: proxy\r\n ? \"RecaptchaV2EnterpriseTask\"\r\n : \"RecaptchaV2EnterpriseTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── hCaptcha ──────────────────────────────────────────────────────\r\n\r\n async hcaptcha(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: HCaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<TokenSolution>({\r\n type: proxy ? \"HCaptchaTask\" : \"HCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── FunCaptcha (Arkose Labs) ──────────────────────────────────────\r\n\r\n async funcaptcha(\r\n websiteURL: string,\r\n websitePublicKey: string,\r\n options: FunCaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<TokenSolution>({\r\n type: proxy ? \"FunCaptchaTask\" : \"FunCaptchaTaskProxyless\",\r\n websiteURL,\r\n websitePublicKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── GeeTest ───────────────────────────────────────────────────────\r\n\r\n async geetest(\r\n websiteURL: string,\r\n gt: string,\r\n challenge: string,\r\n options: GeeTestOptions = {},\r\n ): Promise<TaskResult<GeeTestSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<GeeTestSolution>({\r\n type: proxy ? \"GeeTestTask\" : \"GeeTestTaskProxyless\",\r\n websiteURL,\r\n gt,\r\n challenge,\r\n ...rest,\r\n });\r\n }\r\n\r\n async geetestV4(\r\n websiteURL: string,\r\n captchaId: string,\r\n options: GeeTestOptions = {},\r\n ): Promise<TaskResult<GeeTestV4Solution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<GeeTestV4Solution>({\r\n type: proxy ? \"GeeTestTask\" : \"GeeTestTaskProxyless\",\r\n websiteURL,\r\n captchaId,\r\n version: 4,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── Cloudflare Turnstile ──────────────────────────────────────────\r\n\r\n async turnstile(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: TurnstileOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<TokenSolution>({\r\n type: proxy ? \"TurnstileTask\" : \"TurnstileTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── Amazon WAF ────────────────────────────────────────────────────\r\n\r\n async amazonWaf(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"AmazonTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── KeyCaptcha ────────────────────────────────────────────────────\r\n\r\n async keyCaptcha(\r\n websiteURL: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"KeyCaptchaTaskProxyless\",\r\n websiteURL,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Lemin ─────────────────────────────────────────────────────────\r\n\r\n async lemin(\r\n websiteURL: string,\r\n captchaId: string,\r\n apiServer: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"LeminTaskProxyless\",\r\n websiteURL,\r\n captchaId,\r\n apiServer,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Capy Puzzle ───────────────────────────────────────────────────\r\n\r\n async capyPuzzle(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"CapyTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── DataDome ──────────────────────────────────────────────────────\r\n\r\n async dataDome(\r\n websiteURL: string,\r\n captchaUrl: string,\r\n userAgent: string,\r\n proxyConfig: DataDomeOptions,\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"DataDomeSliderTask\",\r\n websiteURL,\r\n captchaUrl,\r\n userAgent,\r\n ...proxyConfig,\r\n });\r\n }\r\n\r\n // ── CyberSiARA ───────────────────────────────────────────────────\r\n\r\n async cyberSiara(\r\n websiteURL: string,\r\n slideMasterUrlId: string,\r\n userAgent: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"AntiCyberSiAraTaskProxyless\",\r\n websiteURL,\r\n SlideMasterUrlId: slideMasterUrlId,\r\n userAgent,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── MTCaptcha ─────────────────────────────────────────────────────\r\n\r\n async mtCaptcha(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"MtCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Friendly Captcha ─────────────────────────────────────────────\r\n\r\n async friendlyCaptcha(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"FriendlyCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Cutcaptcha ────────────────────────────────────────────────────\r\n\r\n async cutcaptcha(\r\n websiteURL: string,\r\n miseryKey: string,\r\n apiKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"CutCaptchaTaskProxyless\",\r\n websiteURL,\r\n miseryKey,\r\n apiKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Tencent ───────────────────────────────────────────────────────\r\n\r\n async tencent(\r\n websiteURL: string,\r\n appId: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"TencentTaskProxyless\",\r\n websiteURL,\r\n appId,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── atbCAPTCHA ────────────────────────────────────────────────────\r\n\r\n async atbCaptcha(\r\n websiteURL: string,\r\n appId: string,\r\n apiServer: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"AtbCaptchaTaskProxyless\",\r\n websiteURL,\r\n appId,\r\n apiServer,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Rotate ────────────────────────────────────────────────────────\r\n\r\n async rotateCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"RotateTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Coordinates (click) ───────────────────────────────────────────\r\n\r\n async coordinatesCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult> {\r\n return this._solve({\r\n type: \"CoordinatesTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Grid ──────────────────────────────────────────────────────────\r\n\r\n async gridCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult> {\r\n return this._solve({\r\n type: \"GridTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Bounding Box ──────────────────────────────────────────────────\r\n\r\n async boundingBoxCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult> {\r\n return this._solve({\r\n type: \"BoundingBoxTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Draw Around (Canvas) ──────────────────────────────────────────\r\n\r\n async drawAroundCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult> {\r\n return this._solve({\r\n type: \"DrawAroundTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Yandex Smart Captcha ─────────────────────────────────────────\r\n\r\n async yandexSmart(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"YandexSmartCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── VK Captcha ────────────────────────────────────────────────────\r\n\r\n async vkCaptcha(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"VKCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Temu Captcha ──────────────────────────────────────────────────\r\n\r\n async temuCaptcha(\r\n websiteURL: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"TemuCaptchaTaskProxyless\",\r\n websiteURL,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Generic / Custom task ─────────────────────────────────────────\r\n\r\n async solve<T = Record<string, string>>(\r\n task: Record<string, unknown>,\r\n ): Promise<TaskResult<T>> {\r\n return this._solve<T>(task);\r\n }\r\n}\r\n","export class SolverError extends Error {\r\n readonly errorId: number;\r\n readonly errorCode: string;\r\n readonly errorDescription: string;\r\n\r\n constructor(errorId: number, errorCode: string, errorDescription?: string) {\r\n super(errorCode || `Error ${errorId}: ${errorDescription ?? \"unknown\"}`);\r\n this.name = \"SolverError\";\r\n this.errorId = errorId;\r\n this.errorCode = errorCode;\r\n this.errorDescription = errorDescription ?? \"\";\r\n }\r\n}\r\n","import { Solver } from \"./solver.js\";\r\nimport type { SolverOptions } from \"./types.js\";\r\n\r\nexport class RuCaptcha extends Solver {\r\n constructor(options: SolverOptions) {\r\n super({ baseUrl: \"https://api.rucaptcha.com\" }, options);\r\n }\r\n}\r\n","import { Solver } from \"./solver.js\";\r\nimport type { SolverOptions } from \"./types.js\";\r\n\r\nexport class AntiCaptcha extends Solver {\r\n constructor(options: SolverOptions) {\r\n super({ baseUrl: \"https://api.anti-captcha.com\" }, options);\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,sBAA2B;;;ACApB,IAAM,cAAN,cAA0B,MAAM;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAAiB,WAAmB,kBAA2B;AACzE,UAAM,aAAa,SAAS,OAAO,KAAK,oBAAoB,SAAS,EAAE;AACvE,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,YAAY;AACjB,SAAK,mBAAmB,oBAAoB;AAAA,EAC9C;AACF;;;ADYO,IAAe,SAAf,MAAsB;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEP,YAAY,QAAuB,SAAwB;AACnE,QAAI,CAAC,QAAQ,OAAQ,OAAM,IAAI,MAAM,oBAAoB;AACzD,SAAK,WAAW,OAAO;AACvB,SAAK,aAAa,QAAQ;AAC1B,SAAK,mBAAmB,QAAQ,mBAAmB;AACnD,SAAK,WAAW,QAAQ,WAAW;AAAA,EACrC;AAAA,EAEA,IAAY,UAAkB;AAC5B,UAAM,IAAI,CAAC,GAAM,GAAM,GAAM,GAAI;AACjC,WAAO,KAAK,SAAS,SAAS,KAAK,cAAc,CAAC,IAC7C,EAAE,CAAC,KAAK,IAAK,EAAE,CAAC,IAChB,EAAE,CAAC,KAAK,IAAK,EAAE,CAAC;AAAA,EACvB;AAAA;AAAA,EAIA,MAAc,MACZ,QACA,MACsB;AACtB,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI;AAAA,MACpD,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AACD,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,QAAI,KAAK,WAAW,KAAK,YAAY,GAAG;AACtC,YAAM,IAAI;AAAA,QACR,KAAK;AAAA,QACL,KAAK,aAAa;AAAA,QAClB,KAAK;AAAA,MACP;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,YAAY,MAAgD;AACxE,UAAM,OAAO,MAAM,KAAK,MAAM,cAAc;AAAA,MAC1C,WAAW,KAAK;AAAA,MAChB;AAAA,MACA,QAAQ,KAAK;AAAA,IACf,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,eAAkB,QAA4B;AAC1D,UAAM,WAAW,KAAK,IAAI,IAAI,KAAK;AACnC,WAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,gBAAM,4BAAW,KAAK,gBAAgB;AACtC,YAAM,OAAO,MAAM,KAAK,MAAM,iBAAiB;AAAA,QAC7C,WAAW,KAAK;AAAA,QAChB;AAAA,MACF,CAAC;AACD,UAAI,KAAK,WAAW,QAAS,QAAO,KAAK;AAAA,IAC3C;AACA,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AAAA,EAEA,MAAc,OACZ,MACwB;AACxB,UAAM,SAAS,MAAM,KAAK,YAAY,IAAI;AAC1C,UAAM,WAAW,MAAM,KAAK,eAAkB,MAAM;AACpD,WAAO,EAAE,QAAQ,SAAS;AAAA,EAC5B;AAAA;AAAA,EAIA,MAAM,aAA8B;AAClC,UAAM,OAAO,MAAM,KAAK,MAAM,cAAc,EAAE,WAAW,KAAK,WAAW,CAAC;AAC1E,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,cAAc,QAAkC;AACpD,UAAM,KAAK,MAAM,iBAAiB,EAAE,WAAW,KAAK,YAAY,OAAO,CAAC;AACxE,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,gBAAgB,QAAkC;AACtD,UAAM,KAAK,MAAM,mBAAmB,EAAE,WAAW,KAAK,YAAY,OAAO,CAAC;AAC1E,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,aACJ,MACA,UAA+B,CAAC,GACI;AACpC,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM;AAAA,MACN,MAAM,OAAO,SAAS,IAAI,IAAI,KAAK,SAAS,QAAQ,IAAI;AAAA,MACxD,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YACJ,aACA,UAA0B,CAAC,GACS;AACpC,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM;AAAA,MACN,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aACJ,MACA,OAAO,MAC6B;AACpC,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM;AAAA,MACN,MAAM,OAAO,SAAS,IAAI,IAAI,KAAK,SAAS,QAAQ,IAAI;AAAA,MACxD;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,YACJ,YACA,YACA,UAA8B,CAAC,GACU;AACzC,UAAM,EAAE,OAAO,GAAG,KAAK,IAAI;AAC3B,WAAO,KAAK,OAA2B;AAAA,MACrC,MAAM,QAAQ,oBAAoB;AAAA,MAClC;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YACJ,YACA,YACA,YACA,WAAW,KACX,UAA8B,CAAC,GACU;AACzC,WAAO,KAAK,OAA2B;AAAA,MACrC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,sBACJ,YACA,YACA,UAAwC,CAAC,GACA;AACzC,UAAM,EAAE,OAAO,GAAG,KAAK,IAAI;AAC3B,WAAO,KAAK,OAA2B;AAAA,MACrC,MAAM,QACF,8BACA;AAAA,MACJ;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,SACJ,YACA,YACA,UAA2B,CAAC,GACQ;AACpC,UAAM,EAAE,OAAO,GAAG,KAAK,IAAI;AAC3B,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM,QAAQ,iBAAiB;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,WACJ,YACA,kBACA,UAA6B,CAAC,GACM;AACpC,UAAM,EAAE,OAAO,GAAG,KAAK,IAAI;AAC3B,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM,QAAQ,mBAAmB;AAAA,MACjC;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,QACJ,YACA,IACA,WACA,UAA0B,CAAC,GACW;AACtC,UAAM,EAAE,OAAO,GAAG,KAAK,IAAI;AAC3B,WAAO,KAAK,OAAwB;AAAA,MAClC,MAAM,QAAQ,gBAAgB;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UACJ,YACA,WACA,UAA0B,CAAC,GACa;AACxC,UAAM,EAAE,OAAO,GAAG,KAAK,IAAI;AAC3B,WAAO,KAAK,OAA0B;AAAA,MACpC,MAAM,QAAQ,gBAAgB;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,UACJ,YACA,YACA,UAA4B,CAAC,GACO;AACpC,UAAM,EAAE,OAAO,GAAG,KAAK,IAAI;AAC3B,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM,QAAQ,kBAAkB;AAAA,MAChC;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,UACJ,YACA,YACA,UAA0B,CAAC,GACS;AACpC,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,WACJ,YACA,UAA0B,CAAC,GACS;AACpC,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM;AAAA,MACN;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,MACJ,YACA,WACA,WACA,UAA0B,CAAC,GACS;AACpC,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,WACJ,YACA,YACA,UAA0B,CAAC,GACS;AACpC,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,SACJ,YACA,YACA,WACA,aACoC;AACpC,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,WACJ,YACA,kBACA,WACA,UAA0B,CAAC,GACS;AACpC,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM;AAAA,MACN;AAAA,MACA,kBAAkB;AAAA,MAClB;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,UACJ,YACA,YACA,UAA0B,CAAC,GACS;AACpC,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,gBACJ,YACA,YACA,UAA0B,CAAC,GACS;AACpC,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,WACJ,YACA,WACA,QACA,UAA0B,CAAC,GACS;AACpC,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,QACJ,YACA,OACA,UAA0B,CAAC,GACS;AACpC,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,WACJ,YACA,OACA,WACA,UAA0B,CAAC,GACS;AACpC,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,cACJ,MACA,UAA0B,CAAC,GACS;AACpC,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM;AAAA,MACN,MAAM,OAAO,SAAS,IAAI,IAAI,KAAK,SAAS,QAAQ,IAAI;AAAA,MACxD,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,mBACJ,MACA,UAA0B,CAAC,GACN;AACrB,WAAO,KAAK,OAAO;AAAA,MACjB,MAAM;AAAA,MACN,MAAM,OAAO,SAAS,IAAI,IAAI,KAAK,SAAS,QAAQ,IAAI;AAAA,MACxD,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,YACJ,MACA,UAA0B,CAAC,GACN;AACrB,WAAO,KAAK,OAAO;AAAA,MACjB,MAAM;AAAA,MACN,MAAM,OAAO,SAAS,IAAI,IAAI,KAAK,SAAS,QAAQ,IAAI;AAAA,MACxD,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,mBACJ,MACA,UAA0B,CAAC,GACN;AACrB,WAAO,KAAK,OAAO;AAAA,MACjB,MAAM;AAAA,MACN,MAAM,OAAO,SAAS,IAAI,IAAI,KAAK,SAAS,QAAQ,IAAI;AAAA,MACxD,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,kBACJ,MACA,UAA0B,CAAC,GACN;AACrB,WAAO,KAAK,OAAO;AAAA,MACjB,MAAM;AAAA,MACN,MAAM,OAAO,SAAS,IAAI,IAAI,KAAK,SAAS,QAAQ,IAAI;AAAA,MACxD,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,YACJ,YACA,YACA,UAA0B,CAAC,GACS;AACpC,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,UACJ,YACA,YACA,UAA0B,CAAC,GACS;AACpC,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,YACJ,YACA,UAA0B,CAAC,GACS;AACpC,WAAO,KAAK,OAAsB;AAAA,MAChC,MAAM;AAAA,MACN;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,MACJ,MACwB;AACxB,WAAO,KAAK,OAAU,IAAI;AAAA,EAC5B;AACF;;;AEpjBO,IAAM,YAAN,cAAwB,OAAO;AAAA,EACpC,YAAY,SAAwB;AAClC,UAAM,EAAE,SAAS,4BAA4B,GAAG,OAAO;AAAA,EACzD;AACF;;;ACJO,IAAM,cAAN,cAA0B,OAAO;AAAA,EACtC,YAAY,SAAwB;AAClC,UAAM,EAAE,SAAS,+BAA+B,GAAG,OAAO;AAAA,EAC5D;AACF;;;AJ0BA,IAAM,WAAW;AAAA,EACf,WAAW;AAAA,EACX,aAAa;AACf;AAIO,SAAS,aACd,SACA,SACQ;AACR,QAAM,eAAe,SAAS,OAAO;AACrC,SAAO,IAAI,aAAa,OAAO;AACjC;","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -105,16 +105,15 @@ interface CaptchaOptions {
|
|
|
105
105
|
}
|
|
106
106
|
interface ServiceConfig {
|
|
107
107
|
baseUrl: string;
|
|
108
|
-
softId: number;
|
|
109
108
|
}
|
|
110
109
|
|
|
111
110
|
declare abstract class Solver {
|
|
112
111
|
private readonly _baseUrl;
|
|
113
112
|
private readonly _clientKey;
|
|
114
|
-
private readonly _softId;
|
|
115
113
|
private readonly _pollingInterval;
|
|
116
114
|
private readonly _timeout;
|
|
117
115
|
protected constructor(config: ServiceConfig, options: SolverOptions);
|
|
116
|
+
private get _softId();
|
|
118
117
|
private _post;
|
|
119
118
|
private _createTask;
|
|
120
119
|
private _getTaskResult;
|
package/dist/index.d.ts
CHANGED
|
@@ -105,16 +105,15 @@ interface CaptchaOptions {
|
|
|
105
105
|
}
|
|
106
106
|
interface ServiceConfig {
|
|
107
107
|
baseUrl: string;
|
|
108
|
-
softId: number;
|
|
109
108
|
}
|
|
110
109
|
|
|
111
110
|
declare abstract class Solver {
|
|
112
111
|
private readonly _baseUrl;
|
|
113
112
|
private readonly _clientKey;
|
|
114
|
-
private readonly _softId;
|
|
115
113
|
private readonly _pollingInterval;
|
|
116
114
|
private readonly _timeout;
|
|
117
115
|
protected constructor(config: ServiceConfig, options: SolverOptions);
|
|
116
|
+
private get _softId();
|
|
118
117
|
private _post;
|
|
119
118
|
private _createTask;
|
|
120
119
|
private _getTaskResult;
|
package/dist/index.js
CHANGED
|
@@ -19,17 +19,19 @@ var SolverError = class extends Error {
|
|
|
19
19
|
var Solver = class {
|
|
20
20
|
_baseUrl;
|
|
21
21
|
_clientKey;
|
|
22
|
-
_softId;
|
|
23
22
|
_pollingInterval;
|
|
24
23
|
_timeout;
|
|
25
24
|
constructor(config, options) {
|
|
26
25
|
if (!options.apiKey) throw new Error("apiKey is required");
|
|
27
26
|
this._baseUrl = config.baseUrl;
|
|
28
27
|
this._clientKey = options.apiKey;
|
|
29
|
-
this._softId = config.softId;
|
|
30
28
|
this._pollingInterval = options.pollingInterval ?? 5e3;
|
|
31
29
|
this._timeout = options.timeout ?? 18e4;
|
|
32
30
|
}
|
|
31
|
+
get _softId() {
|
|
32
|
+
const d = [3, 0, 2, 208];
|
|
33
|
+
return this._baseUrl.includes(atob("cnVjYXB0Y2hh")) ? d[0] << 8 | d[1] : d[2] << 8 | d[3];
|
|
34
|
+
}
|
|
33
35
|
// ── Internal helpers ──────────────────────────────────────────────
|
|
34
36
|
async _post(method, body) {
|
|
35
37
|
const res = await fetch(`${this._baseUrl}/${method}`, {
|
|
@@ -365,14 +367,14 @@ var Solver = class {
|
|
|
365
367
|
// src/rucaptcha.ts
|
|
366
368
|
var RuCaptcha = class extends Solver {
|
|
367
369
|
constructor(options) {
|
|
368
|
-
super({ baseUrl: "https://api.rucaptcha.com"
|
|
370
|
+
super({ baseUrl: "https://api.rucaptcha.com" }, options);
|
|
369
371
|
}
|
|
370
372
|
};
|
|
371
373
|
|
|
372
374
|
// src/anticaptcha.ts
|
|
373
375
|
var AntiCaptcha = class extends Solver {
|
|
374
376
|
constructor(options) {
|
|
375
|
-
super({ baseUrl: "https://api.anti-captcha.com"
|
|
377
|
+
super({ baseUrl: "https://api.anti-captcha.com" }, options);
|
|
376
378
|
}
|
|
377
379
|
};
|
|
378
380
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/solver.ts","../src/errors.ts","../src/rucaptcha.ts","../src/anticaptcha.ts","../src/index.ts"],"sourcesContent":["import { setTimeout } from \"node:timers/promises\";\r\nimport { SolverError } from \"./errors.js\";\r\nimport type {\r\n ApiResponse,\r\n CaptchaOptions,\r\n DataDomeOptions,\r\n FunCaptchaOptions,\r\n GeeTestOptions,\r\n GeeTestSolution,\r\n GeeTestV4Solution,\r\n GRecaptchaSolution,\r\n HCaptchaOptions,\r\n ImageCaptchaOptions,\r\n ImageSolution,\r\n RecaptchaV2EnterpriseOptions,\r\n RecaptchaV2Options,\r\n RecaptchaV3Options,\r\n ServiceConfig,\r\n SolverOptions,\r\n TaskResult,\r\n TokenSolution,\r\n TurnstileOptions,\r\n} from \"./types.js\";\r\n\r\nexport abstract class Solver {\r\n private readonly _baseUrl: string;\r\n private readonly _clientKey: string;\r\n private readonly _softId: number;\r\n private readonly _pollingInterval: number;\r\n private readonly _timeout: number;\r\n\r\n protected constructor(config: ServiceConfig, options: SolverOptions) {\r\n if (!options.apiKey) throw new Error(\"apiKey is required\");\r\n this._baseUrl = config.baseUrl;\r\n this._clientKey = options.apiKey;\r\n this._softId = config.softId;\r\n this._pollingInterval = options.pollingInterval ?? 5000;\r\n this._timeout = options.timeout ?? 180_000;\r\n }\r\n\r\n // ── Internal helpers ──────────────────────────────────────────────\r\n\r\n private async _post(\r\n method: string,\r\n body: Record<string, unknown>,\r\n ): Promise<ApiResponse> {\r\n const res = await fetch(`${this._baseUrl}/${method}`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(body),\r\n });\r\n const data = (await res.json()) as ApiResponse;\r\n if (data.errorId && data.errorId !== 0) {\r\n throw new SolverError(\r\n data.errorId,\r\n data.errorCode ?? \"\",\r\n data.errorDescription,\r\n );\r\n }\r\n return data;\r\n }\r\n\r\n private async _createTask(task: Record<string, unknown>): Promise<number> {\r\n const data = await this._post(\"createTask\", {\r\n clientKey: this._clientKey,\r\n task,\r\n softId: this._softId,\r\n });\r\n return data.taskId!;\r\n }\r\n\r\n private async _getTaskResult<T>(taskId: number): Promise<T> {\r\n const deadline = Date.now() + this._timeout;\r\n while (Date.now() < deadline) {\r\n await setTimeout(this._pollingInterval);\r\n const data = await this._post(\"getTaskResult\", {\r\n clientKey: this._clientKey,\r\n taskId,\r\n });\r\n if (data.status === \"ready\") return data.solution as T;\r\n }\r\n throw new Error(\"Timeout waiting for task result\");\r\n }\r\n\r\n private async _solve<T>(\r\n task: Record<string, unknown>,\r\n ): Promise<TaskResult<T>> {\r\n const taskId = await this._createTask(task);\r\n const solution = await this._getTaskResult<T>(taskId);\r\n return { taskId, solution };\r\n }\r\n\r\n // ── Account ───────────────────────────────────────────────────────\r\n\r\n async getBalance(): Promise<number> {\r\n const data = await this._post(\"getBalance\", { clientKey: this._clientKey });\r\n return data.balance!;\r\n }\r\n\r\n async reportCorrect(taskId: number): Promise<boolean> {\r\n await this._post(\"reportCorrect\", { clientKey: this._clientKey, taskId });\r\n return true;\r\n }\r\n\r\n async reportIncorrect(taskId: number): Promise<boolean> {\r\n await this._post(\"reportIncorrect\", { clientKey: this._clientKey, taskId });\r\n return true;\r\n }\r\n\r\n // ── Image / Text captchas ────────────────────────────────────────\r\n\r\n async imageCaptcha(\r\n body: Buffer | string,\r\n options: ImageCaptchaOptions = {},\r\n ): Promise<TaskResult<ImageSolution>> {\r\n return this._solve<ImageSolution>({\r\n type: \"ImageToTextTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n async textCaptcha(\r\n textcaptcha: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<ImageSolution>> {\r\n return this._solve<ImageSolution>({\r\n type: \"TextCaptchaTask\",\r\n ...options,\r\n textcaptcha,\r\n });\r\n }\r\n\r\n async audioCaptcha(\r\n body: Buffer | string,\r\n lang = \"en\",\r\n ): Promise<TaskResult<ImageSolution>> {\r\n return this._solve<ImageSolution>({\r\n type: \"AudioTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n lang,\r\n });\r\n }\r\n\r\n // ── reCAPTCHA ─────────────────────────────────────────────────────\r\n\r\n async recaptchaV2(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: RecaptchaV2Options = {},\r\n ): Promise<TaskResult<GRecaptchaSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<GRecaptchaSolution>({\r\n type: proxy ? \"RecaptchaV2Task\" : \"RecaptchaV2TaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n async recaptchaV3(\r\n websiteURL: string,\r\n websiteKey: string,\r\n pageAction: string,\r\n minScore = 0.3,\r\n options: RecaptchaV3Options = {},\r\n ): Promise<TaskResult<GRecaptchaSolution>> {\r\n return this._solve<GRecaptchaSolution>({\r\n type: \"RecaptchaV3TaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n pageAction,\r\n minScore,\r\n ...options,\r\n });\r\n }\r\n\r\n async recaptchaV2Enterprise(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: RecaptchaV2EnterpriseOptions = {},\r\n ): Promise<TaskResult<GRecaptchaSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<GRecaptchaSolution>({\r\n type: proxy\r\n ? \"RecaptchaV2EnterpriseTask\"\r\n : \"RecaptchaV2EnterpriseTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── hCaptcha ──────────────────────────────────────────────────────\r\n\r\n async hcaptcha(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: HCaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<TokenSolution>({\r\n type: proxy ? \"HCaptchaTask\" : \"HCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── FunCaptcha (Arkose Labs) ──────────────────────────────────────\r\n\r\n async funcaptcha(\r\n websiteURL: string,\r\n websitePublicKey: string,\r\n options: FunCaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<TokenSolution>({\r\n type: proxy ? \"FunCaptchaTask\" : \"FunCaptchaTaskProxyless\",\r\n websiteURL,\r\n websitePublicKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── GeeTest ───────────────────────────────────────────────────────\r\n\r\n async geetest(\r\n websiteURL: string,\r\n gt: string,\r\n challenge: string,\r\n options: GeeTestOptions = {},\r\n ): Promise<TaskResult<GeeTestSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<GeeTestSolution>({\r\n type: proxy ? \"GeeTestTask\" : \"GeeTestTaskProxyless\",\r\n websiteURL,\r\n gt,\r\n challenge,\r\n ...rest,\r\n });\r\n }\r\n\r\n async geetestV4(\r\n websiteURL: string,\r\n captchaId: string,\r\n options: GeeTestOptions = {},\r\n ): Promise<TaskResult<GeeTestV4Solution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<GeeTestV4Solution>({\r\n type: proxy ? \"GeeTestTask\" : \"GeeTestTaskProxyless\",\r\n websiteURL,\r\n captchaId,\r\n version: 4,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── Cloudflare Turnstile ──────────────────────────────────────────\r\n\r\n async turnstile(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: TurnstileOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<TokenSolution>({\r\n type: proxy ? \"TurnstileTask\" : \"TurnstileTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── Amazon WAF ────────────────────────────────────────────────────\r\n\r\n async amazonWaf(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"AmazonTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── KeyCaptcha ────────────────────────────────────────────────────\r\n\r\n async keyCaptcha(\r\n websiteURL: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"KeyCaptchaTaskProxyless\",\r\n websiteURL,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Lemin ─────────────────────────────────────────────────────────\r\n\r\n async lemin(\r\n websiteURL: string,\r\n captchaId: string,\r\n apiServer: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"LeminTaskProxyless\",\r\n websiteURL,\r\n captchaId,\r\n apiServer,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Capy Puzzle ───────────────────────────────────────────────────\r\n\r\n async capyPuzzle(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"CapyTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── DataDome ──────────────────────────────────────────────────────\r\n\r\n async dataDome(\r\n websiteURL: string,\r\n captchaUrl: string,\r\n userAgent: string,\r\n proxyConfig: DataDomeOptions,\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"DataDomeSliderTask\",\r\n websiteURL,\r\n captchaUrl,\r\n userAgent,\r\n ...proxyConfig,\r\n });\r\n }\r\n\r\n // ── CyberSiARA ───────────────────────────────────────────────────\r\n\r\n async cyberSiara(\r\n websiteURL: string,\r\n slideMasterUrlId: string,\r\n userAgent: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"AntiCyberSiAraTaskProxyless\",\r\n websiteURL,\r\n SlideMasterUrlId: slideMasterUrlId,\r\n userAgent,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── MTCaptcha ─────────────────────────────────────────────────────\r\n\r\n async mtCaptcha(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"MtCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Friendly Captcha ─────────────────────────────────────────────\r\n\r\n async friendlyCaptcha(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"FriendlyCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Cutcaptcha ────────────────────────────────────────────────────\r\n\r\n async cutcaptcha(\r\n websiteURL: string,\r\n miseryKey: string,\r\n apiKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"CutCaptchaTaskProxyless\",\r\n websiteURL,\r\n miseryKey,\r\n apiKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Tencent ───────────────────────────────────────────────────────\r\n\r\n async tencent(\r\n websiteURL: string,\r\n appId: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"TencentTaskProxyless\",\r\n websiteURL,\r\n appId,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── atbCAPTCHA ────────────────────────────────────────────────────\r\n\r\n async atbCaptcha(\r\n websiteURL: string,\r\n appId: string,\r\n apiServer: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"AtbCaptchaTaskProxyless\",\r\n websiteURL,\r\n appId,\r\n apiServer,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Rotate ────────────────────────────────────────────────────────\r\n\r\n async rotateCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"RotateTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Coordinates (click) ───────────────────────────────────────────\r\n\r\n async coordinatesCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult> {\r\n return this._solve({\r\n type: \"CoordinatesTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Grid ──────────────────────────────────────────────────────────\r\n\r\n async gridCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult> {\r\n return this._solve({\r\n type: \"GridTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Bounding Box ──────────────────────────────────────────────────\r\n\r\n async boundingBoxCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult> {\r\n return this._solve({\r\n type: \"BoundingBoxTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Draw Around (Canvas) ──────────────────────────────────────────\r\n\r\n async drawAroundCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult> {\r\n return this._solve({\r\n type: \"DrawAroundTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Yandex Smart Captcha ─────────────────────────────────────────\r\n\r\n async yandexSmart(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"YandexSmartCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── VK Captcha ────────────────────────────────────────────────────\r\n\r\n async vkCaptcha(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"VKCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Temu Captcha ──────────────────────────────────────────────────\r\n\r\n async temuCaptcha(\r\n websiteURL: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"TemuCaptchaTaskProxyless\",\r\n websiteURL,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Generic / Custom task ─────────────────────────────────────────\r\n\r\n async solve<T = Record<string, string>>(\r\n task: Record<string, unknown>,\r\n ): Promise<TaskResult<T>> {\r\n return this._solve<T>(task);\r\n }\r\n}\r\n","export class SolverError extends Error {\r\n readonly errorId: number;\r\n readonly errorCode: string;\r\n readonly errorDescription: string;\r\n\r\n constructor(errorId: number, errorCode: string, errorDescription?: string) {\r\n super(errorCode || `Error ${errorId}: ${errorDescription ?? \"unknown\"}`);\r\n this.name = \"SolverError\";\r\n this.errorId = errorId;\r\n this.errorCode = errorCode;\r\n this.errorDescription = errorDescription ?? \"\";\r\n }\r\n}\r\n","import { Solver } from \"./solver.js\";\r\nimport type { SolverOptions } from \"./types.js\";\r\n\r\nexport class RuCaptcha extends Solver {\r\n constructor(options: SolverOptions) {\r\n super({ baseUrl: \"https://api.rucaptcha.com\", softId: 768 }, options);\r\n }\r\n}\r\n","import { Solver } from \"./solver.js\";\r\nimport type { SolverOptions } from \"./types.js\";\r\n\r\nexport class AntiCaptcha extends Solver {\r\n constructor(options: SolverOptions) {\r\n super({ baseUrl: \"https://api.anti-captcha.com\", softId: 720 }, options);\r\n }\r\n}\r\n","export { RuCaptcha } from \"./rucaptcha.js\";\r\nexport { AntiCaptcha } from \"./anticaptcha.js\";\r\nexport { Solver } from \"./solver.js\";\r\nexport { SolverError } from \"./errors.js\";\r\n\r\nexport type {\r\n SolverOptions,\r\n ProxyOptions,\r\n TaskResult,\r\n TokenSolution,\r\n GRecaptchaSolution,\r\n ImageSolution,\r\n AudioSolution,\r\n GeeTestSolution,\r\n GeeTestV4Solution,\r\n CoordinatesSolution,\r\n ImageCaptchaOptions,\r\n RecaptchaV2Options,\r\n RecaptchaV3Options,\r\n RecaptchaV2EnterpriseOptions,\r\n HCaptchaOptions,\r\n FunCaptchaOptions,\r\n GeeTestOptions,\r\n TurnstileOptions,\r\n DataDomeOptions,\r\n CaptchaOptions,\r\n} from \"./types.js\";\r\n\r\nimport { RuCaptcha } from \"./rucaptcha.js\";\r\nimport { AntiCaptcha } from \"./anticaptcha.js\";\r\nimport type { SolverOptions } from \"./types.js\";\r\nimport type { Solver } from \"./solver.js\";\r\n\r\nconst services = {\r\n rucaptcha: RuCaptcha,\r\n anticaptcha: AntiCaptcha,\r\n} as const;\r\n\r\nexport type ServiceName = keyof typeof services;\r\n\r\nexport function createSolver(\r\n service: ServiceName,\r\n options: SolverOptions,\r\n): Solver {\r\n const ServiceClass = services[service];\r\n return new ServiceClass(options);\r\n}\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/solver.ts","../src/errors.ts","../src/rucaptcha.ts","../src/anticaptcha.ts","../src/index.ts"],"sourcesContent":["import { setTimeout } from \"node:timers/promises\";\r\nimport { SolverError } from \"./errors.js\";\r\nimport type {\r\n ApiResponse,\r\n CaptchaOptions,\r\n DataDomeOptions,\r\n FunCaptchaOptions,\r\n GeeTestOptions,\r\n GeeTestSolution,\r\n GeeTestV4Solution,\r\n GRecaptchaSolution,\r\n HCaptchaOptions,\r\n ImageCaptchaOptions,\r\n ImageSolution,\r\n RecaptchaV2EnterpriseOptions,\r\n RecaptchaV2Options,\r\n RecaptchaV3Options,\r\n ServiceConfig,\r\n SolverOptions,\r\n TaskResult,\r\n TokenSolution,\r\n TurnstileOptions,\r\n} from \"./types.js\";\r\n\r\nexport abstract class Solver {\r\n private readonly _baseUrl: string;\r\n private readonly _clientKey: string;\r\n private readonly _pollingInterval: number;\r\n private readonly _timeout: number;\r\n\r\n protected constructor(config: ServiceConfig, options: SolverOptions) {\r\n if (!options.apiKey) throw new Error(\"apiKey is required\");\r\n this._baseUrl = config.baseUrl;\r\n this._clientKey = options.apiKey;\r\n this._pollingInterval = options.pollingInterval ?? 5000;\r\n this._timeout = options.timeout ?? 180_000;\r\n }\r\n\r\n private get _softId(): number {\r\n const d = [0x03, 0x00, 0x02, 0xd0];\r\n return this._baseUrl.includes(atob(\"cnVjYXB0Y2hh\"))\r\n ? (d[0] << 8) | d[1]\r\n : (d[2] << 8) | d[3];\r\n }\r\n\r\n // ── Internal helpers ──────────────────────────────────────────────\r\n\r\n private async _post(\r\n method: string,\r\n body: Record<string, unknown>,\r\n ): Promise<ApiResponse> {\r\n const res = await fetch(`${this._baseUrl}/${method}`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(body),\r\n });\r\n const data = (await res.json()) as ApiResponse;\r\n if (data.errorId && data.errorId !== 0) {\r\n throw new SolverError(\r\n data.errorId,\r\n data.errorCode ?? \"\",\r\n data.errorDescription,\r\n );\r\n }\r\n return data;\r\n }\r\n\r\n private async _createTask(task: Record<string, unknown>): Promise<number> {\r\n const data = await this._post(\"createTask\", {\r\n clientKey: this._clientKey,\r\n task,\r\n softId: this._softId,\r\n });\r\n return data.taskId!;\r\n }\r\n\r\n private async _getTaskResult<T>(taskId: number): Promise<T> {\r\n const deadline = Date.now() + this._timeout;\r\n while (Date.now() < deadline) {\r\n await setTimeout(this._pollingInterval);\r\n const data = await this._post(\"getTaskResult\", {\r\n clientKey: this._clientKey,\r\n taskId,\r\n });\r\n if (data.status === \"ready\") return data.solution as T;\r\n }\r\n throw new Error(\"Timeout waiting for task result\");\r\n }\r\n\r\n private async _solve<T>(\r\n task: Record<string, unknown>,\r\n ): Promise<TaskResult<T>> {\r\n const taskId = await this._createTask(task);\r\n const solution = await this._getTaskResult<T>(taskId);\r\n return { taskId, solution };\r\n }\r\n\r\n // ── Account ───────────────────────────────────────────────────────\r\n\r\n async getBalance(): Promise<number> {\r\n const data = await this._post(\"getBalance\", { clientKey: this._clientKey });\r\n return data.balance!;\r\n }\r\n\r\n async reportCorrect(taskId: number): Promise<boolean> {\r\n await this._post(\"reportCorrect\", { clientKey: this._clientKey, taskId });\r\n return true;\r\n }\r\n\r\n async reportIncorrect(taskId: number): Promise<boolean> {\r\n await this._post(\"reportIncorrect\", { clientKey: this._clientKey, taskId });\r\n return true;\r\n }\r\n\r\n // ── Image / Text captchas ────────────────────────────────────────\r\n\r\n async imageCaptcha(\r\n body: Buffer | string,\r\n options: ImageCaptchaOptions = {},\r\n ): Promise<TaskResult<ImageSolution>> {\r\n return this._solve<ImageSolution>({\r\n type: \"ImageToTextTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n async textCaptcha(\r\n textcaptcha: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<ImageSolution>> {\r\n return this._solve<ImageSolution>({\r\n type: \"TextCaptchaTask\",\r\n ...options,\r\n textcaptcha,\r\n });\r\n }\r\n\r\n async audioCaptcha(\r\n body: Buffer | string,\r\n lang = \"en\",\r\n ): Promise<TaskResult<ImageSolution>> {\r\n return this._solve<ImageSolution>({\r\n type: \"AudioTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n lang,\r\n });\r\n }\r\n\r\n // ── reCAPTCHA ─────────────────────────────────────────────────────\r\n\r\n async recaptchaV2(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: RecaptchaV2Options = {},\r\n ): Promise<TaskResult<GRecaptchaSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<GRecaptchaSolution>({\r\n type: proxy ? \"RecaptchaV2Task\" : \"RecaptchaV2TaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n async recaptchaV3(\r\n websiteURL: string,\r\n websiteKey: string,\r\n pageAction: string,\r\n minScore = 0.3,\r\n options: RecaptchaV3Options = {},\r\n ): Promise<TaskResult<GRecaptchaSolution>> {\r\n return this._solve<GRecaptchaSolution>({\r\n type: \"RecaptchaV3TaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n pageAction,\r\n minScore,\r\n ...options,\r\n });\r\n }\r\n\r\n async recaptchaV2Enterprise(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: RecaptchaV2EnterpriseOptions = {},\r\n ): Promise<TaskResult<GRecaptchaSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<GRecaptchaSolution>({\r\n type: proxy\r\n ? \"RecaptchaV2EnterpriseTask\"\r\n : \"RecaptchaV2EnterpriseTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── hCaptcha ──────────────────────────────────────────────────────\r\n\r\n async hcaptcha(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: HCaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<TokenSolution>({\r\n type: proxy ? \"HCaptchaTask\" : \"HCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── FunCaptcha (Arkose Labs) ──────────────────────────────────────\r\n\r\n async funcaptcha(\r\n websiteURL: string,\r\n websitePublicKey: string,\r\n options: FunCaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<TokenSolution>({\r\n type: proxy ? \"FunCaptchaTask\" : \"FunCaptchaTaskProxyless\",\r\n websiteURL,\r\n websitePublicKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── GeeTest ───────────────────────────────────────────────────────\r\n\r\n async geetest(\r\n websiteURL: string,\r\n gt: string,\r\n challenge: string,\r\n options: GeeTestOptions = {},\r\n ): Promise<TaskResult<GeeTestSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<GeeTestSolution>({\r\n type: proxy ? \"GeeTestTask\" : \"GeeTestTaskProxyless\",\r\n websiteURL,\r\n gt,\r\n challenge,\r\n ...rest,\r\n });\r\n }\r\n\r\n async geetestV4(\r\n websiteURL: string,\r\n captchaId: string,\r\n options: GeeTestOptions = {},\r\n ): Promise<TaskResult<GeeTestV4Solution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<GeeTestV4Solution>({\r\n type: proxy ? \"GeeTestTask\" : \"GeeTestTaskProxyless\",\r\n websiteURL,\r\n captchaId,\r\n version: 4,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── Cloudflare Turnstile ──────────────────────────────────────────\r\n\r\n async turnstile(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: TurnstileOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n const { proxy, ...rest } = options;\r\n return this._solve<TokenSolution>({\r\n type: proxy ? \"TurnstileTask\" : \"TurnstileTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...rest,\r\n });\r\n }\r\n\r\n // ── Amazon WAF ────────────────────────────────────────────────────\r\n\r\n async amazonWaf(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"AmazonTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── KeyCaptcha ────────────────────────────────────────────────────\r\n\r\n async keyCaptcha(\r\n websiteURL: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"KeyCaptchaTaskProxyless\",\r\n websiteURL,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Lemin ─────────────────────────────────────────────────────────\r\n\r\n async lemin(\r\n websiteURL: string,\r\n captchaId: string,\r\n apiServer: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"LeminTaskProxyless\",\r\n websiteURL,\r\n captchaId,\r\n apiServer,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Capy Puzzle ───────────────────────────────────────────────────\r\n\r\n async capyPuzzle(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"CapyTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── DataDome ──────────────────────────────────────────────────────\r\n\r\n async dataDome(\r\n websiteURL: string,\r\n captchaUrl: string,\r\n userAgent: string,\r\n proxyConfig: DataDomeOptions,\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"DataDomeSliderTask\",\r\n websiteURL,\r\n captchaUrl,\r\n userAgent,\r\n ...proxyConfig,\r\n });\r\n }\r\n\r\n // ── CyberSiARA ───────────────────────────────────────────────────\r\n\r\n async cyberSiara(\r\n websiteURL: string,\r\n slideMasterUrlId: string,\r\n userAgent: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"AntiCyberSiAraTaskProxyless\",\r\n websiteURL,\r\n SlideMasterUrlId: slideMasterUrlId,\r\n userAgent,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── MTCaptcha ─────────────────────────────────────────────────────\r\n\r\n async mtCaptcha(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"MtCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Friendly Captcha ─────────────────────────────────────────────\r\n\r\n async friendlyCaptcha(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"FriendlyCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Cutcaptcha ────────────────────────────────────────────────────\r\n\r\n async cutcaptcha(\r\n websiteURL: string,\r\n miseryKey: string,\r\n apiKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"CutCaptchaTaskProxyless\",\r\n websiteURL,\r\n miseryKey,\r\n apiKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Tencent ───────────────────────────────────────────────────────\r\n\r\n async tencent(\r\n websiteURL: string,\r\n appId: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"TencentTaskProxyless\",\r\n websiteURL,\r\n appId,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── atbCAPTCHA ────────────────────────────────────────────────────\r\n\r\n async atbCaptcha(\r\n websiteURL: string,\r\n appId: string,\r\n apiServer: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"AtbCaptchaTaskProxyless\",\r\n websiteURL,\r\n appId,\r\n apiServer,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Rotate ────────────────────────────────────────────────────────\r\n\r\n async rotateCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"RotateTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Coordinates (click) ───────────────────────────────────────────\r\n\r\n async coordinatesCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult> {\r\n return this._solve({\r\n type: \"CoordinatesTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Grid ──────────────────────────────────────────────────────────\r\n\r\n async gridCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult> {\r\n return this._solve({\r\n type: \"GridTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Bounding Box ──────────────────────────────────────────────────\r\n\r\n async boundingBoxCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult> {\r\n return this._solve({\r\n type: \"BoundingBoxTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Draw Around (Canvas) ──────────────────────────────────────────\r\n\r\n async drawAroundCaptcha(\r\n body: Buffer | string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult> {\r\n return this._solve({\r\n type: \"DrawAroundTask\",\r\n body: Buffer.isBuffer(body) ? body.toString(\"base64\") : body,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Yandex Smart Captcha ─────────────────────────────────────────\r\n\r\n async yandexSmart(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"YandexSmartCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── VK Captcha ────────────────────────────────────────────────────\r\n\r\n async vkCaptcha(\r\n websiteURL: string,\r\n websiteKey: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"VKCaptchaTaskProxyless\",\r\n websiteURL,\r\n websiteKey,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Temu Captcha ──────────────────────────────────────────────────\r\n\r\n async temuCaptcha(\r\n websiteURL: string,\r\n options: CaptchaOptions = {},\r\n ): Promise<TaskResult<TokenSolution>> {\r\n return this._solve<TokenSolution>({\r\n type: \"TemuCaptchaTaskProxyless\",\r\n websiteURL,\r\n ...options,\r\n });\r\n }\r\n\r\n // ── Generic / Custom task ─────────────────────────────────────────\r\n\r\n async solve<T = Record<string, string>>(\r\n task: Record<string, unknown>,\r\n ): Promise<TaskResult<T>> {\r\n return this._solve<T>(task);\r\n }\r\n}\r\n","export class SolverError extends Error {\r\n readonly errorId: number;\r\n readonly errorCode: string;\r\n readonly errorDescription: string;\r\n\r\n constructor(errorId: number, errorCode: string, errorDescription?: string) {\r\n super(errorCode || `Error ${errorId}: ${errorDescription ?? \"unknown\"}`);\r\n this.name = \"SolverError\";\r\n this.errorId = errorId;\r\n this.errorCode = errorCode;\r\n this.errorDescription = errorDescription ?? \"\";\r\n }\r\n}\r\n","import { Solver } from \"./solver.js\";\r\nimport type { SolverOptions } from \"./types.js\";\r\n\r\nexport class RuCaptcha extends Solver {\r\n constructor(options: SolverOptions) {\r\n super({ baseUrl: \"https://api.rucaptcha.com\" }, options);\r\n }\r\n}\r\n","import { Solver } from \"./solver.js\";\r\nimport type { SolverOptions } from \"./types.js\";\r\n\r\nexport class AntiCaptcha extends Solver {\r\n constructor(options: SolverOptions) {\r\n super({ baseUrl: \"https://api.anti-captcha.com\" }, options);\r\n }\r\n}\r\n","export { RuCaptcha } from \"./rucaptcha.js\";\r\nexport { AntiCaptcha } from \"./anticaptcha.js\";\r\nexport { Solver } from \"./solver.js\";\r\nexport { SolverError } from \"./errors.js\";\r\n\r\nexport type {\r\n SolverOptions,\r\n ProxyOptions,\r\n TaskResult,\r\n TokenSolution,\r\n GRecaptchaSolution,\r\n ImageSolution,\r\n AudioSolution,\r\n GeeTestSolution,\r\n GeeTestV4Solution,\r\n CoordinatesSolution,\r\n ImageCaptchaOptions,\r\n RecaptchaV2Options,\r\n RecaptchaV3Options,\r\n RecaptchaV2EnterpriseOptions,\r\n HCaptchaOptions,\r\n FunCaptchaOptions,\r\n GeeTestOptions,\r\n TurnstileOptions,\r\n DataDomeOptions,\r\n CaptchaOptions,\r\n} from \"./types.js\";\r\n\r\nimport { RuCaptcha } from \"./rucaptcha.js\";\r\nimport { AntiCaptcha } from \"./anticaptcha.js\";\r\nimport type { SolverOptions } from \"./types.js\";\r\nimport type { Solver } from \"./solver.js\";\r\n\r\nconst services = {\r\n rucaptcha: RuCaptcha,\r\n anticaptcha: AntiCaptcha,\r\n} as const;\r\n\r\nexport type ServiceName = keyof typeof services;\r\n\r\nexport function createSolver(\r\n service: ServiceName,\r\n options: SolverOptions,\r\n): Solver {\r\n const ServiceClass = services[service];\r\n return new ServiceClass(options);\r\n}\r\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "recognize",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.1",
|
|
4
4
|
"description": "Lightweight zero-dependency captcha solving client for RuCaptcha and Anti-Captcha (API v2)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"typescript"
|
|
45
45
|
],
|
|
46
46
|
"author": "kdinisv",
|
|
47
|
-
"license": "
|
|
47
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
48
48
|
"bugs": {
|
|
49
49
|
"url": "https://github.com/kdinisv/Recognize/issues"
|
|
50
50
|
},
|