recognize 3.1.1 → 3.1.2

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/dist/index.cjs CHANGED
@@ -1,428 +1 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/index.ts
21
- var index_exports = {};
22
- __export(index_exports, {
23
- AntiCaptcha: () => AntiCaptcha,
24
- RuCaptcha: () => RuCaptcha,
25
- Solver: () => Solver,
26
- SolverError: () => SolverError,
27
- createSolver: () => createSolver
28
- });
29
- module.exports = __toCommonJS(index_exports);
30
-
31
- // src/solver.ts
32
- var import_promises = require("timers/promises");
33
-
34
- // src/errors.ts
35
- var SolverError = class extends Error {
36
- errorId;
37
- errorCode;
38
- errorDescription;
39
- constructor(errorId, errorCode, errorDescription) {
40
- super(errorCode || `Error ${errorId}: ${errorDescription ?? "unknown"}`);
41
- this.name = "SolverError";
42
- this.errorId = errorId;
43
- this.errorCode = errorCode;
44
- this.errorDescription = errorDescription ?? "";
45
- }
46
- };
47
-
48
- // src/solver.ts
49
- var Solver = class {
50
- _baseUrl;
51
- _clientKey;
52
- _pollingInterval;
53
- _timeout;
54
- constructor(config, options) {
55
- if (!options.apiKey) throw new Error("apiKey is required");
56
- this._baseUrl = config.baseUrl;
57
- this._clientKey = options.apiKey;
58
- this._pollingInterval = options.pollingInterval ?? 5e3;
59
- this._timeout = options.timeout ?? 18e4;
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
- }
65
- // ── Internal helpers ──────────────────────────────────────────────
66
- async _post(method, body) {
67
- const res = await fetch(`${this._baseUrl}/${method}`, {
68
- method: "POST",
69
- headers: { "Content-Type": "application/json" },
70
- body: JSON.stringify(body)
71
- });
72
- const data = await res.json();
73
- if (data.errorId && data.errorId !== 0) {
74
- throw new SolverError(
75
- data.errorId,
76
- data.errorCode ?? "",
77
- data.errorDescription
78
- );
79
- }
80
- return data;
81
- }
82
- async _createTask(task) {
83
- const data = await this._post("createTask", {
84
- clientKey: this._clientKey,
85
- task,
86
- softId: this._softId
87
- });
88
- return data.taskId;
89
- }
90
- async _getTaskResult(taskId) {
91
- const deadline = Date.now() + this._timeout;
92
- while (Date.now() < deadline) {
93
- await (0, import_promises.setTimeout)(this._pollingInterval);
94
- const data = await this._post("getTaskResult", {
95
- clientKey: this._clientKey,
96
- taskId
97
- });
98
- if (data.status === "ready") return data.solution;
99
- }
100
- throw new Error("Timeout waiting for task result");
101
- }
102
- async _solve(task) {
103
- const taskId = await this._createTask(task);
104
- const solution = await this._getTaskResult(taskId);
105
- return { taskId, solution };
106
- }
107
- // ── Account ───────────────────────────────────────────────────────
108
- async getBalance() {
109
- const data = await this._post("getBalance", { clientKey: this._clientKey });
110
- return data.balance;
111
- }
112
- async reportCorrect(taskId) {
113
- await this._post("reportCorrect", { clientKey: this._clientKey, taskId });
114
- return true;
115
- }
116
- async reportIncorrect(taskId) {
117
- await this._post("reportIncorrect", { clientKey: this._clientKey, taskId });
118
- return true;
119
- }
120
- // ── Image / Text captchas ────────────────────────────────────────
121
- async imageCaptcha(body, options = {}) {
122
- return this._solve({
123
- type: "ImageToTextTask",
124
- body: Buffer.isBuffer(body) ? body.toString("base64") : body,
125
- ...options
126
- });
127
- }
128
- async textCaptcha(textcaptcha, options = {}) {
129
- return this._solve({
130
- type: "TextCaptchaTask",
131
- ...options,
132
- textcaptcha
133
- });
134
- }
135
- async audioCaptcha(body, lang = "en") {
136
- return this._solve({
137
- type: "AudioTask",
138
- body: Buffer.isBuffer(body) ? body.toString("base64") : body,
139
- lang
140
- });
141
- }
142
- // ── reCAPTCHA ─────────────────────────────────────────────────────
143
- async recaptchaV2(websiteURL, websiteKey, options = {}) {
144
- const { proxy, ...rest } = options;
145
- return this._solve({
146
- type: proxy ? "RecaptchaV2Task" : "RecaptchaV2TaskProxyless",
147
- websiteURL,
148
- websiteKey,
149
- ...rest
150
- });
151
- }
152
- async recaptchaV3(websiteURL, websiteKey, pageAction, minScore = 0.3, options = {}) {
153
- return this._solve({
154
- type: "RecaptchaV3TaskProxyless",
155
- websiteURL,
156
- websiteKey,
157
- pageAction,
158
- minScore,
159
- ...options
160
- });
161
- }
162
- async recaptchaV2Enterprise(websiteURL, websiteKey, options = {}) {
163
- const { proxy, ...rest } = options;
164
- return this._solve({
165
- type: proxy ? "RecaptchaV2EnterpriseTask" : "RecaptchaV2EnterpriseTaskProxyless",
166
- websiteURL,
167
- websiteKey,
168
- ...rest
169
- });
170
- }
171
- // ── hCaptcha ──────────────────────────────────────────────────────
172
- async hcaptcha(websiteURL, websiteKey, options = {}) {
173
- const { proxy, ...rest } = options;
174
- return this._solve({
175
- type: proxy ? "HCaptchaTask" : "HCaptchaTaskProxyless",
176
- websiteURL,
177
- websiteKey,
178
- ...rest
179
- });
180
- }
181
- // ── FunCaptcha (Arkose Labs) ──────────────────────────────────────
182
- async funcaptcha(websiteURL, websitePublicKey, options = {}) {
183
- const { proxy, ...rest } = options;
184
- return this._solve({
185
- type: proxy ? "FunCaptchaTask" : "FunCaptchaTaskProxyless",
186
- websiteURL,
187
- websitePublicKey,
188
- ...rest
189
- });
190
- }
191
- // ── GeeTest ───────────────────────────────────────────────────────
192
- async geetest(websiteURL, gt, challenge, options = {}) {
193
- const { proxy, ...rest } = options;
194
- return this._solve({
195
- type: proxy ? "GeeTestTask" : "GeeTestTaskProxyless",
196
- websiteURL,
197
- gt,
198
- challenge,
199
- ...rest
200
- });
201
- }
202
- async geetestV4(websiteURL, captchaId, options = {}) {
203
- const { proxy, ...rest } = options;
204
- return this._solve({
205
- type: proxy ? "GeeTestTask" : "GeeTestTaskProxyless",
206
- websiteURL,
207
- captchaId,
208
- version: 4,
209
- ...rest
210
- });
211
- }
212
- // ── Cloudflare Turnstile ──────────────────────────────────────────
213
- async turnstile(websiteURL, websiteKey, options = {}) {
214
- const { proxy, ...rest } = options;
215
- return this._solve({
216
- type: proxy ? "TurnstileTask" : "TurnstileTaskProxyless",
217
- websiteURL,
218
- websiteKey,
219
- ...rest
220
- });
221
- }
222
- // ── Amazon WAF ────────────────────────────────────────────────────
223
- async amazonWaf(websiteURL, websiteKey, options = {}) {
224
- return this._solve({
225
- type: "AmazonTaskProxyless",
226
- websiteURL,
227
- websiteKey,
228
- ...options
229
- });
230
- }
231
- // ── KeyCaptcha ────────────────────────────────────────────────────
232
- async keyCaptcha(websiteURL, options = {}) {
233
- return this._solve({
234
- type: "KeyCaptchaTaskProxyless",
235
- websiteURL,
236
- ...options
237
- });
238
- }
239
- // ── Lemin ─────────────────────────────────────────────────────────
240
- async lemin(websiteURL, captchaId, apiServer, options = {}) {
241
- return this._solve({
242
- type: "LeminTaskProxyless",
243
- websiteURL,
244
- captchaId,
245
- apiServer,
246
- ...options
247
- });
248
- }
249
- // ── Capy Puzzle ───────────────────────────────────────────────────
250
- async capyPuzzle(websiteURL, websiteKey, options = {}) {
251
- return this._solve({
252
- type: "CapyTaskProxyless",
253
- websiteURL,
254
- websiteKey,
255
- ...options
256
- });
257
- }
258
- // ── DataDome ──────────────────────────────────────────────────────
259
- async dataDome(websiteURL, captchaUrl, userAgent, proxyConfig) {
260
- return this._solve({
261
- type: "DataDomeSliderTask",
262
- websiteURL,
263
- captchaUrl,
264
- userAgent,
265
- ...proxyConfig
266
- });
267
- }
268
- // ── CyberSiARA ───────────────────────────────────────────────────
269
- async cyberSiara(websiteURL, slideMasterUrlId, userAgent, options = {}) {
270
- return this._solve({
271
- type: "AntiCyberSiAraTaskProxyless",
272
- websiteURL,
273
- SlideMasterUrlId: slideMasterUrlId,
274
- userAgent,
275
- ...options
276
- });
277
- }
278
- // ── MTCaptcha ─────────────────────────────────────────────────────
279
- async mtCaptcha(websiteURL, websiteKey, options = {}) {
280
- return this._solve({
281
- type: "MtCaptchaTaskProxyless",
282
- websiteURL,
283
- websiteKey,
284
- ...options
285
- });
286
- }
287
- // ── Friendly Captcha ─────────────────────────────────────────────
288
- async friendlyCaptcha(websiteURL, websiteKey, options = {}) {
289
- return this._solve({
290
- type: "FriendlyCaptchaTaskProxyless",
291
- websiteURL,
292
- websiteKey,
293
- ...options
294
- });
295
- }
296
- // ── Cutcaptcha ────────────────────────────────────────────────────
297
- async cutcaptcha(websiteURL, miseryKey, apiKey, options = {}) {
298
- return this._solve({
299
- type: "CutCaptchaTaskProxyless",
300
- websiteURL,
301
- miseryKey,
302
- apiKey,
303
- ...options
304
- });
305
- }
306
- // ── Tencent ───────────────────────────────────────────────────────
307
- async tencent(websiteURL, appId, options = {}) {
308
- return this._solve({
309
- type: "TencentTaskProxyless",
310
- websiteURL,
311
- appId,
312
- ...options
313
- });
314
- }
315
- // ── atbCAPTCHA ────────────────────────────────────────────────────
316
- async atbCaptcha(websiteURL, appId, apiServer, options = {}) {
317
- return this._solve({
318
- type: "AtbCaptchaTaskProxyless",
319
- websiteURL,
320
- appId,
321
- apiServer,
322
- ...options
323
- });
324
- }
325
- // ── Rotate ────────────────────────────────────────────────────────
326
- async rotateCaptcha(body, options = {}) {
327
- return this._solve({
328
- type: "RotateTask",
329
- body: Buffer.isBuffer(body) ? body.toString("base64") : body,
330
- ...options
331
- });
332
- }
333
- // ── Coordinates (click) ───────────────────────────────────────────
334
- async coordinatesCaptcha(body, options = {}) {
335
- return this._solve({
336
- type: "CoordinatesTask",
337
- body: Buffer.isBuffer(body) ? body.toString("base64") : body,
338
- ...options
339
- });
340
- }
341
- // ── Grid ──────────────────────────────────────────────────────────
342
- async gridCaptcha(body, options = {}) {
343
- return this._solve({
344
- type: "GridTask",
345
- body: Buffer.isBuffer(body) ? body.toString("base64") : body,
346
- ...options
347
- });
348
- }
349
- // ── Bounding Box ──────────────────────────────────────────────────
350
- async boundingBoxCaptcha(body, options = {}) {
351
- return this._solve({
352
- type: "BoundingBoxTask",
353
- body: Buffer.isBuffer(body) ? body.toString("base64") : body,
354
- ...options
355
- });
356
- }
357
- // ── Draw Around (Canvas) ──────────────────────────────────────────
358
- async drawAroundCaptcha(body, options = {}) {
359
- return this._solve({
360
- type: "DrawAroundTask",
361
- body: Buffer.isBuffer(body) ? body.toString("base64") : body,
362
- ...options
363
- });
364
- }
365
- // ── Yandex Smart Captcha ─────────────────────────────────────────
366
- async yandexSmart(websiteURL, websiteKey, options = {}) {
367
- return this._solve({
368
- type: "YandexSmartCaptchaTaskProxyless",
369
- websiteURL,
370
- websiteKey,
371
- ...options
372
- });
373
- }
374
- // ── VK Captcha ────────────────────────────────────────────────────
375
- async vkCaptcha(websiteURL, websiteKey, options = {}) {
376
- return this._solve({
377
- type: "VKCaptchaTaskProxyless",
378
- websiteURL,
379
- websiteKey,
380
- ...options
381
- });
382
- }
383
- // ── Temu Captcha ──────────────────────────────────────────────────
384
- async temuCaptcha(websiteURL, options = {}) {
385
- return this._solve({
386
- type: "TemuCaptchaTaskProxyless",
387
- websiteURL,
388
- ...options
389
- });
390
- }
391
- // ── Generic / Custom task ─────────────────────────────────────────
392
- async solve(task) {
393
- return this._solve(task);
394
- }
395
- };
396
-
397
- // src/rucaptcha.ts
398
- var RuCaptcha = class extends Solver {
399
- constructor(options) {
400
- super({ baseUrl: "https://api.rucaptcha.com" }, options);
401
- }
402
- };
403
-
404
- // src/anticaptcha.ts
405
- var AntiCaptcha = class extends Solver {
406
- constructor(options) {
407
- super({ baseUrl: "https://api.anti-captcha.com" }, options);
408
- }
409
- };
410
-
411
- // src/index.ts
412
- var services = {
413
- rucaptcha: RuCaptcha,
414
- anticaptcha: AntiCaptcha
415
- };
416
- function createSolver(service, options) {
417
- const ServiceClass = services[service];
418
- return new ServiceClass(options);
419
- }
420
- // Annotate the CommonJS export names for ESM import in node:
421
- 0 && (module.exports = {
422
- AntiCaptcha,
423
- RuCaptcha,
424
- Solver,
425
- SolverError,
426
- createSolver
427
- });
428
- //# sourceMappingURL=index.cjs.map
1
+ "use strict";var l=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var m=(n,t)=>{for(var e in t)l(n,e,{get:t[e],enumerable:!0})},g=(n,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of y(t))!k.call(n,o)&&o!==e&&l(n,o,{get:()=>t[o],enumerable:!(s=T(t,o))||s.enumerable});return n};var S=n=>g(l({},"__esModule",{value:!0}),n);var C={};m(C,{AntiCaptcha:()=>c,RuCaptcha:()=>p,Solver:()=>a,SolverError:()=>i,createSolver:()=>v});module.exports=S(C);var u=require("timers/promises");var i=class extends Error{errorId;errorCode;errorDescription;constructor(t,e,s){super(e||`Error ${t}: ${s??"unknown"}`),this.name="SolverError",this.errorId=t,this.errorCode=e,this.errorDescription=s??""}};var a=class{_baseUrl;_clientKey;_pollingInterval;_timeout;constructor(t,e){if(!e.apiKey)throw new Error("apiKey is required");this._baseUrl=t.baseUrl,this._clientKey=e.apiKey,this._pollingInterval=e.pollingInterval??5e3,this._timeout=e.timeout??18e4}get _softId(){let t=[3,0,2,208];return this._baseUrl.includes(atob("cnVjYXB0Y2hh"))?t[0]<<8|t[1]:t[2]<<8|t[3]}async _post(t,e){let o=await(await fetch(`${this._baseUrl}/${t}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})).json();if(o.errorId&&o.errorId!==0)throw new i(o.errorId,o.errorCode??"",o.errorDescription);return o}async _createTask(t){return(await this._post("createTask",{clientKey:this._clientKey,task:t,softId:this._softId})).taskId}async _getTaskResult(t){let e=Date.now()+this._timeout;for(;Date.now()<e;){await(0,u.setTimeout)(this._pollingInterval);let s=await this._post("getTaskResult",{clientKey:this._clientKey,taskId:t});if(s.status==="ready")return s.solution}throw new Error("Timeout waiting for task result")}async _solve(t){let e=await this._createTask(t),s=await this._getTaskResult(e);return{taskId:e,solution:s}}async getBalance(){return(await this._post("getBalance",{clientKey:this._clientKey})).balance}async reportCorrect(t){return await this._post("reportCorrect",{clientKey:this._clientKey,taskId:t}),!0}async reportIncorrect(t){return await this._post("reportIncorrect",{clientKey:this._clientKey,taskId:t}),!0}async imageCaptcha(t,e={}){return this._solve({type:"ImageToTextTask",body:Buffer.isBuffer(t)?t.toString("base64"):t,...e})}async textCaptcha(t,e={}){return this._solve({type:"TextCaptchaTask",...e,textcaptcha:t})}async audioCaptcha(t,e="en"){return this._solve({type:"AudioTask",body:Buffer.isBuffer(t)?t.toString("base64"):t,lang:e})}async recaptchaV2(t,e,s={}){let{proxy:o,...r}=s;return this._solve({type:o?"RecaptchaV2Task":"RecaptchaV2TaskProxyless",websiteURL:t,websiteKey:e,...r})}async recaptchaV3(t,e,s,o=.3,r={}){return this._solve({type:"RecaptchaV3TaskProxyless",websiteURL:t,websiteKey:e,pageAction:s,minScore:o,...r})}async recaptchaV2Enterprise(t,e,s={}){let{proxy:o,...r}=s;return this._solve({type:o?"RecaptchaV2EnterpriseTask":"RecaptchaV2EnterpriseTaskProxyless",websiteURL:t,websiteKey:e,...r})}async hcaptcha(t,e,s={}){let{proxy:o,...r}=s;return this._solve({type:o?"HCaptchaTask":"HCaptchaTaskProxyless",websiteURL:t,websiteKey:e,...r})}async funcaptcha(t,e,s={}){let{proxy:o,...r}=s;return this._solve({type:o?"FunCaptchaTask":"FunCaptchaTaskProxyless",websiteURL:t,websitePublicKey:e,...r})}async geetest(t,e,s,o={}){let{proxy:r,...h}=o;return this._solve({type:r?"GeeTestTask":"GeeTestTaskProxyless",websiteURL:t,gt:e,challenge:s,...h})}async geetestV4(t,e,s={}){let{proxy:o,...r}=s;return this._solve({type:o?"GeeTestTask":"GeeTestTaskProxyless",websiteURL:t,captchaId:e,version:4,...r})}async turnstile(t,e,s={}){let{proxy:o,...r}=s;return this._solve({type:o?"TurnstileTask":"TurnstileTaskProxyless",websiteURL:t,websiteKey:e,...r})}async amazonWaf(t,e,s={}){return this._solve({type:"AmazonTaskProxyless",websiteURL:t,websiteKey:e,...s})}async keyCaptcha(t,e={}){return this._solve({type:"KeyCaptchaTaskProxyless",websiteURL:t,...e})}async lemin(t,e,s,o={}){return this._solve({type:"LeminTaskProxyless",websiteURL:t,captchaId:e,apiServer:s,...o})}async capyPuzzle(t,e,s={}){return this._solve({type:"CapyTaskProxyless",websiteURL:t,websiteKey:e,...s})}async dataDome(t,e,s,o){return this._solve({type:"DataDomeSliderTask",websiteURL:t,captchaUrl:e,userAgent:s,...o})}async cyberSiara(t,e,s,o={}){return this._solve({type:"AntiCyberSiAraTaskProxyless",websiteURL:t,SlideMasterUrlId:e,userAgent:s,...o})}async mtCaptcha(t,e,s={}){return this._solve({type:"MtCaptchaTaskProxyless",websiteURL:t,websiteKey:e,...s})}async friendlyCaptcha(t,e,s={}){return this._solve({type:"FriendlyCaptchaTaskProxyless",websiteURL:t,websiteKey:e,...s})}async cutcaptcha(t,e,s,o={}){return this._solve({type:"CutCaptchaTaskProxyless",websiteURL:t,miseryKey:e,apiKey:s,...o})}async tencent(t,e,s={}){return this._solve({type:"TencentTaskProxyless",websiteURL:t,appId:e,...s})}async atbCaptcha(t,e,s,o={}){return this._solve({type:"AtbCaptchaTaskProxyless",websiteURL:t,appId:e,apiServer:s,...o})}async rotateCaptcha(t,e={}){return this._solve({type:"RotateTask",body:Buffer.isBuffer(t)?t.toString("base64"):t,...e})}async coordinatesCaptcha(t,e={}){return this._solve({type:"CoordinatesTask",body:Buffer.isBuffer(t)?t.toString("base64"):t,...e})}async gridCaptcha(t,e={}){return this._solve({type:"GridTask",body:Buffer.isBuffer(t)?t.toString("base64"):t,...e})}async boundingBoxCaptcha(t,e={}){return this._solve({type:"BoundingBoxTask",body:Buffer.isBuffer(t)?t.toString("base64"):t,...e})}async drawAroundCaptcha(t,e={}){return this._solve({type:"DrawAroundTask",body:Buffer.isBuffer(t)?t.toString("base64"):t,...e})}async yandexSmart(t,e,s={}){return this._solve({type:"YandexSmartCaptchaTaskProxyless",websiteURL:t,websiteKey:e,...s})}async vkCaptcha(t,e,s={}){return this._solve({type:"VKCaptchaTaskProxyless",websiteURL:t,websiteKey:e,...s})}async temuCaptcha(t,e={}){return this._solve({type:"TemuCaptchaTaskProxyless",websiteURL:t,...e})}async solve(t){return this._solve(t)}};var p=class extends a{constructor(t){super({baseUrl:"https://api.rucaptcha.com"},t)}};var c=class extends a{constructor(t){super({baseUrl:"https://api.anti-captcha.com"},t)}};var f={rucaptcha:p,anticaptcha:c};function v(n,t){let e=f[n];return new e(t)}0&&(module.exports={AntiCaptcha,RuCaptcha,Solver,SolverError,createSolver});
package/dist/index.js CHANGED
@@ -1,397 +1 @@
1
- // src/solver.ts
2
- import { setTimeout } from "timers/promises";
3
-
4
- // src/errors.ts
5
- var SolverError = class extends Error {
6
- errorId;
7
- errorCode;
8
- errorDescription;
9
- constructor(errorId, errorCode, errorDescription) {
10
- super(errorCode || `Error ${errorId}: ${errorDescription ?? "unknown"}`);
11
- this.name = "SolverError";
12
- this.errorId = errorId;
13
- this.errorCode = errorCode;
14
- this.errorDescription = errorDescription ?? "";
15
- }
16
- };
17
-
18
- // src/solver.ts
19
- var Solver = class {
20
- _baseUrl;
21
- _clientKey;
22
- _pollingInterval;
23
- _timeout;
24
- constructor(config, options) {
25
- if (!options.apiKey) throw new Error("apiKey is required");
26
- this._baseUrl = config.baseUrl;
27
- this._clientKey = options.apiKey;
28
- this._pollingInterval = options.pollingInterval ?? 5e3;
29
- this._timeout = options.timeout ?? 18e4;
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
- }
35
- // ── Internal helpers ──────────────────────────────────────────────
36
- async _post(method, body) {
37
- const res = await fetch(`${this._baseUrl}/${method}`, {
38
- method: "POST",
39
- headers: { "Content-Type": "application/json" },
40
- body: JSON.stringify(body)
41
- });
42
- const data = await res.json();
43
- if (data.errorId && data.errorId !== 0) {
44
- throw new SolverError(
45
- data.errorId,
46
- data.errorCode ?? "",
47
- data.errorDescription
48
- );
49
- }
50
- return data;
51
- }
52
- async _createTask(task) {
53
- const data = await this._post("createTask", {
54
- clientKey: this._clientKey,
55
- task,
56
- softId: this._softId
57
- });
58
- return data.taskId;
59
- }
60
- async _getTaskResult(taskId) {
61
- const deadline = Date.now() + this._timeout;
62
- while (Date.now() < deadline) {
63
- await setTimeout(this._pollingInterval);
64
- const data = await this._post("getTaskResult", {
65
- clientKey: this._clientKey,
66
- taskId
67
- });
68
- if (data.status === "ready") return data.solution;
69
- }
70
- throw new Error("Timeout waiting for task result");
71
- }
72
- async _solve(task) {
73
- const taskId = await this._createTask(task);
74
- const solution = await this._getTaskResult(taskId);
75
- return { taskId, solution };
76
- }
77
- // ── Account ───────────────────────────────────────────────────────
78
- async getBalance() {
79
- const data = await this._post("getBalance", { clientKey: this._clientKey });
80
- return data.balance;
81
- }
82
- async reportCorrect(taskId) {
83
- await this._post("reportCorrect", { clientKey: this._clientKey, taskId });
84
- return true;
85
- }
86
- async reportIncorrect(taskId) {
87
- await this._post("reportIncorrect", { clientKey: this._clientKey, taskId });
88
- return true;
89
- }
90
- // ── Image / Text captchas ────────────────────────────────────────
91
- async imageCaptcha(body, options = {}) {
92
- return this._solve({
93
- type: "ImageToTextTask",
94
- body: Buffer.isBuffer(body) ? body.toString("base64") : body,
95
- ...options
96
- });
97
- }
98
- async textCaptcha(textcaptcha, options = {}) {
99
- return this._solve({
100
- type: "TextCaptchaTask",
101
- ...options,
102
- textcaptcha
103
- });
104
- }
105
- async audioCaptcha(body, lang = "en") {
106
- return this._solve({
107
- type: "AudioTask",
108
- body: Buffer.isBuffer(body) ? body.toString("base64") : body,
109
- lang
110
- });
111
- }
112
- // ── reCAPTCHA ─────────────────────────────────────────────────────
113
- async recaptchaV2(websiteURL, websiteKey, options = {}) {
114
- const { proxy, ...rest } = options;
115
- return this._solve({
116
- type: proxy ? "RecaptchaV2Task" : "RecaptchaV2TaskProxyless",
117
- websiteURL,
118
- websiteKey,
119
- ...rest
120
- });
121
- }
122
- async recaptchaV3(websiteURL, websiteKey, pageAction, minScore = 0.3, options = {}) {
123
- return this._solve({
124
- type: "RecaptchaV3TaskProxyless",
125
- websiteURL,
126
- websiteKey,
127
- pageAction,
128
- minScore,
129
- ...options
130
- });
131
- }
132
- async recaptchaV2Enterprise(websiteURL, websiteKey, options = {}) {
133
- const { proxy, ...rest } = options;
134
- return this._solve({
135
- type: proxy ? "RecaptchaV2EnterpriseTask" : "RecaptchaV2EnterpriseTaskProxyless",
136
- websiteURL,
137
- websiteKey,
138
- ...rest
139
- });
140
- }
141
- // ── hCaptcha ──────────────────────────────────────────────────────
142
- async hcaptcha(websiteURL, websiteKey, options = {}) {
143
- const { proxy, ...rest } = options;
144
- return this._solve({
145
- type: proxy ? "HCaptchaTask" : "HCaptchaTaskProxyless",
146
- websiteURL,
147
- websiteKey,
148
- ...rest
149
- });
150
- }
151
- // ── FunCaptcha (Arkose Labs) ──────────────────────────────────────
152
- async funcaptcha(websiteURL, websitePublicKey, options = {}) {
153
- const { proxy, ...rest } = options;
154
- return this._solve({
155
- type: proxy ? "FunCaptchaTask" : "FunCaptchaTaskProxyless",
156
- websiteURL,
157
- websitePublicKey,
158
- ...rest
159
- });
160
- }
161
- // ── GeeTest ───────────────────────────────────────────────────────
162
- async geetest(websiteURL, gt, challenge, options = {}) {
163
- const { proxy, ...rest } = options;
164
- return this._solve({
165
- type: proxy ? "GeeTestTask" : "GeeTestTaskProxyless",
166
- websiteURL,
167
- gt,
168
- challenge,
169
- ...rest
170
- });
171
- }
172
- async geetestV4(websiteURL, captchaId, options = {}) {
173
- const { proxy, ...rest } = options;
174
- return this._solve({
175
- type: proxy ? "GeeTestTask" : "GeeTestTaskProxyless",
176
- websiteURL,
177
- captchaId,
178
- version: 4,
179
- ...rest
180
- });
181
- }
182
- // ── Cloudflare Turnstile ──────────────────────────────────────────
183
- async turnstile(websiteURL, websiteKey, options = {}) {
184
- const { proxy, ...rest } = options;
185
- return this._solve({
186
- type: proxy ? "TurnstileTask" : "TurnstileTaskProxyless",
187
- websiteURL,
188
- websiteKey,
189
- ...rest
190
- });
191
- }
192
- // ── Amazon WAF ────────────────────────────────────────────────────
193
- async amazonWaf(websiteURL, websiteKey, options = {}) {
194
- return this._solve({
195
- type: "AmazonTaskProxyless",
196
- websiteURL,
197
- websiteKey,
198
- ...options
199
- });
200
- }
201
- // ── KeyCaptcha ────────────────────────────────────────────────────
202
- async keyCaptcha(websiteURL, options = {}) {
203
- return this._solve({
204
- type: "KeyCaptchaTaskProxyless",
205
- websiteURL,
206
- ...options
207
- });
208
- }
209
- // ── Lemin ─────────────────────────────────────────────────────────
210
- async lemin(websiteURL, captchaId, apiServer, options = {}) {
211
- return this._solve({
212
- type: "LeminTaskProxyless",
213
- websiteURL,
214
- captchaId,
215
- apiServer,
216
- ...options
217
- });
218
- }
219
- // ── Capy Puzzle ───────────────────────────────────────────────────
220
- async capyPuzzle(websiteURL, websiteKey, options = {}) {
221
- return this._solve({
222
- type: "CapyTaskProxyless",
223
- websiteURL,
224
- websiteKey,
225
- ...options
226
- });
227
- }
228
- // ── DataDome ──────────────────────────────────────────────────────
229
- async dataDome(websiteURL, captchaUrl, userAgent, proxyConfig) {
230
- return this._solve({
231
- type: "DataDomeSliderTask",
232
- websiteURL,
233
- captchaUrl,
234
- userAgent,
235
- ...proxyConfig
236
- });
237
- }
238
- // ── CyberSiARA ───────────────────────────────────────────────────
239
- async cyberSiara(websiteURL, slideMasterUrlId, userAgent, options = {}) {
240
- return this._solve({
241
- type: "AntiCyberSiAraTaskProxyless",
242
- websiteURL,
243
- SlideMasterUrlId: slideMasterUrlId,
244
- userAgent,
245
- ...options
246
- });
247
- }
248
- // ── MTCaptcha ─────────────────────────────────────────────────────
249
- async mtCaptcha(websiteURL, websiteKey, options = {}) {
250
- return this._solve({
251
- type: "MtCaptchaTaskProxyless",
252
- websiteURL,
253
- websiteKey,
254
- ...options
255
- });
256
- }
257
- // ── Friendly Captcha ─────────────────────────────────────────────
258
- async friendlyCaptcha(websiteURL, websiteKey, options = {}) {
259
- return this._solve({
260
- type: "FriendlyCaptchaTaskProxyless",
261
- websiteURL,
262
- websiteKey,
263
- ...options
264
- });
265
- }
266
- // ── Cutcaptcha ────────────────────────────────────────────────────
267
- async cutcaptcha(websiteURL, miseryKey, apiKey, options = {}) {
268
- return this._solve({
269
- type: "CutCaptchaTaskProxyless",
270
- websiteURL,
271
- miseryKey,
272
- apiKey,
273
- ...options
274
- });
275
- }
276
- // ── Tencent ───────────────────────────────────────────────────────
277
- async tencent(websiteURL, appId, options = {}) {
278
- return this._solve({
279
- type: "TencentTaskProxyless",
280
- websiteURL,
281
- appId,
282
- ...options
283
- });
284
- }
285
- // ── atbCAPTCHA ────────────────────────────────────────────────────
286
- async atbCaptcha(websiteURL, appId, apiServer, options = {}) {
287
- return this._solve({
288
- type: "AtbCaptchaTaskProxyless",
289
- websiteURL,
290
- appId,
291
- apiServer,
292
- ...options
293
- });
294
- }
295
- // ── Rotate ────────────────────────────────────────────────────────
296
- async rotateCaptcha(body, options = {}) {
297
- return this._solve({
298
- type: "RotateTask",
299
- body: Buffer.isBuffer(body) ? body.toString("base64") : body,
300
- ...options
301
- });
302
- }
303
- // ── Coordinates (click) ───────────────────────────────────────────
304
- async coordinatesCaptcha(body, options = {}) {
305
- return this._solve({
306
- type: "CoordinatesTask",
307
- body: Buffer.isBuffer(body) ? body.toString("base64") : body,
308
- ...options
309
- });
310
- }
311
- // ── Grid ──────────────────────────────────────────────────────────
312
- async gridCaptcha(body, options = {}) {
313
- return this._solve({
314
- type: "GridTask",
315
- body: Buffer.isBuffer(body) ? body.toString("base64") : body,
316
- ...options
317
- });
318
- }
319
- // ── Bounding Box ──────────────────────────────────────────────────
320
- async boundingBoxCaptcha(body, options = {}) {
321
- return this._solve({
322
- type: "BoundingBoxTask",
323
- body: Buffer.isBuffer(body) ? body.toString("base64") : body,
324
- ...options
325
- });
326
- }
327
- // ── Draw Around (Canvas) ──────────────────────────────────────────
328
- async drawAroundCaptcha(body, options = {}) {
329
- return this._solve({
330
- type: "DrawAroundTask",
331
- body: Buffer.isBuffer(body) ? body.toString("base64") : body,
332
- ...options
333
- });
334
- }
335
- // ── Yandex Smart Captcha ─────────────────────────────────────────
336
- async yandexSmart(websiteURL, websiteKey, options = {}) {
337
- return this._solve({
338
- type: "YandexSmartCaptchaTaskProxyless",
339
- websiteURL,
340
- websiteKey,
341
- ...options
342
- });
343
- }
344
- // ── VK Captcha ────────────────────────────────────────────────────
345
- async vkCaptcha(websiteURL, websiteKey, options = {}) {
346
- return this._solve({
347
- type: "VKCaptchaTaskProxyless",
348
- websiteURL,
349
- websiteKey,
350
- ...options
351
- });
352
- }
353
- // ── Temu Captcha ──────────────────────────────────────────────────
354
- async temuCaptcha(websiteURL, options = {}) {
355
- return this._solve({
356
- type: "TemuCaptchaTaskProxyless",
357
- websiteURL,
358
- ...options
359
- });
360
- }
361
- // ── Generic / Custom task ─────────────────────────────────────────
362
- async solve(task) {
363
- return this._solve(task);
364
- }
365
- };
366
-
367
- // src/rucaptcha.ts
368
- var RuCaptcha = class extends Solver {
369
- constructor(options) {
370
- super({ baseUrl: "https://api.rucaptcha.com" }, options);
371
- }
372
- };
373
-
374
- // src/anticaptcha.ts
375
- var AntiCaptcha = class extends Solver {
376
- constructor(options) {
377
- super({ baseUrl: "https://api.anti-captcha.com" }, options);
378
- }
379
- };
380
-
381
- // src/index.ts
382
- var services = {
383
- rucaptcha: RuCaptcha,
384
- anticaptcha: AntiCaptcha
385
- };
386
- function createSolver(service, options) {
387
- const ServiceClass = services[service];
388
- return new ServiceClass(options);
389
- }
390
- export {
391
- AntiCaptcha,
392
- RuCaptcha,
393
- Solver,
394
- SolverError,
395
- createSolver
396
- };
397
- //# sourceMappingURL=index.js.map
1
+ import{setTimeout as u}from"timers/promises";var i=class extends Error{errorId;errorCode;errorDescription;constructor(t,e,s){super(e||`Error ${t}: ${s??"unknown"}`),this.name="SolverError",this.errorId=t,this.errorCode=e,this.errorDescription=s??""}};var n=class{_baseUrl;_clientKey;_pollingInterval;_timeout;constructor(t,e){if(!e.apiKey)throw new Error("apiKey is required");this._baseUrl=t.baseUrl,this._clientKey=e.apiKey,this._pollingInterval=e.pollingInterval??5e3,this._timeout=e.timeout??18e4}get _softId(){let t=[3,0,2,208];return this._baseUrl.includes(atob("cnVjYXB0Y2hh"))?t[0]<<8|t[1]:t[2]<<8|t[3]}async _post(t,e){let o=await(await fetch(`${this._baseUrl}/${t}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})).json();if(o.errorId&&o.errorId!==0)throw new i(o.errorId,o.errorCode??"",o.errorDescription);return o}async _createTask(t){return(await this._post("createTask",{clientKey:this._clientKey,task:t,softId:this._softId})).taskId}async _getTaskResult(t){let e=Date.now()+this._timeout;for(;Date.now()<e;){await u(this._pollingInterval);let s=await this._post("getTaskResult",{clientKey:this._clientKey,taskId:t});if(s.status==="ready")return s.solution}throw new Error("Timeout waiting for task result")}async _solve(t){let e=await this._createTask(t),s=await this._getTaskResult(e);return{taskId:e,solution:s}}async getBalance(){return(await this._post("getBalance",{clientKey:this._clientKey})).balance}async reportCorrect(t){return await this._post("reportCorrect",{clientKey:this._clientKey,taskId:t}),!0}async reportIncorrect(t){return await this._post("reportIncorrect",{clientKey:this._clientKey,taskId:t}),!0}async imageCaptcha(t,e={}){return this._solve({type:"ImageToTextTask",body:Buffer.isBuffer(t)?t.toString("base64"):t,...e})}async textCaptcha(t,e={}){return this._solve({type:"TextCaptchaTask",...e,textcaptcha:t})}async audioCaptcha(t,e="en"){return this._solve({type:"AudioTask",body:Buffer.isBuffer(t)?t.toString("base64"):t,lang:e})}async recaptchaV2(t,e,s={}){let{proxy:o,...r}=s;return this._solve({type:o?"RecaptchaV2Task":"RecaptchaV2TaskProxyless",websiteURL:t,websiteKey:e,...r})}async recaptchaV3(t,e,s,o=.3,r={}){return this._solve({type:"RecaptchaV3TaskProxyless",websiteURL:t,websiteKey:e,pageAction:s,minScore:o,...r})}async recaptchaV2Enterprise(t,e,s={}){let{proxy:o,...r}=s;return this._solve({type:o?"RecaptchaV2EnterpriseTask":"RecaptchaV2EnterpriseTaskProxyless",websiteURL:t,websiteKey:e,...r})}async hcaptcha(t,e,s={}){let{proxy:o,...r}=s;return this._solve({type:o?"HCaptchaTask":"HCaptchaTaskProxyless",websiteURL:t,websiteKey:e,...r})}async funcaptcha(t,e,s={}){let{proxy:o,...r}=s;return this._solve({type:o?"FunCaptchaTask":"FunCaptchaTaskProxyless",websiteURL:t,websitePublicKey:e,...r})}async geetest(t,e,s,o={}){let{proxy:r,...l}=o;return this._solve({type:r?"GeeTestTask":"GeeTestTaskProxyless",websiteURL:t,gt:e,challenge:s,...l})}async geetestV4(t,e,s={}){let{proxy:o,...r}=s;return this._solve({type:o?"GeeTestTask":"GeeTestTaskProxyless",websiteURL:t,captchaId:e,version:4,...r})}async turnstile(t,e,s={}){let{proxy:o,...r}=s;return this._solve({type:o?"TurnstileTask":"TurnstileTaskProxyless",websiteURL:t,websiteKey:e,...r})}async amazonWaf(t,e,s={}){return this._solve({type:"AmazonTaskProxyless",websiteURL:t,websiteKey:e,...s})}async keyCaptcha(t,e={}){return this._solve({type:"KeyCaptchaTaskProxyless",websiteURL:t,...e})}async lemin(t,e,s,o={}){return this._solve({type:"LeminTaskProxyless",websiteURL:t,captchaId:e,apiServer:s,...o})}async capyPuzzle(t,e,s={}){return this._solve({type:"CapyTaskProxyless",websiteURL:t,websiteKey:e,...s})}async dataDome(t,e,s,o){return this._solve({type:"DataDomeSliderTask",websiteURL:t,captchaUrl:e,userAgent:s,...o})}async cyberSiara(t,e,s,o={}){return this._solve({type:"AntiCyberSiAraTaskProxyless",websiteURL:t,SlideMasterUrlId:e,userAgent:s,...o})}async mtCaptcha(t,e,s={}){return this._solve({type:"MtCaptchaTaskProxyless",websiteURL:t,websiteKey:e,...s})}async friendlyCaptcha(t,e,s={}){return this._solve({type:"FriendlyCaptchaTaskProxyless",websiteURL:t,websiteKey:e,...s})}async cutcaptcha(t,e,s,o={}){return this._solve({type:"CutCaptchaTaskProxyless",websiteURL:t,miseryKey:e,apiKey:s,...o})}async tencent(t,e,s={}){return this._solve({type:"TencentTaskProxyless",websiteURL:t,appId:e,...s})}async atbCaptcha(t,e,s,o={}){return this._solve({type:"AtbCaptchaTaskProxyless",websiteURL:t,appId:e,apiServer:s,...o})}async rotateCaptcha(t,e={}){return this._solve({type:"RotateTask",body:Buffer.isBuffer(t)?t.toString("base64"):t,...e})}async coordinatesCaptcha(t,e={}){return this._solve({type:"CoordinatesTask",body:Buffer.isBuffer(t)?t.toString("base64"):t,...e})}async gridCaptcha(t,e={}){return this._solve({type:"GridTask",body:Buffer.isBuffer(t)?t.toString("base64"):t,...e})}async boundingBoxCaptcha(t,e={}){return this._solve({type:"BoundingBoxTask",body:Buffer.isBuffer(t)?t.toString("base64"):t,...e})}async drawAroundCaptcha(t,e={}){return this._solve({type:"DrawAroundTask",body:Buffer.isBuffer(t)?t.toString("base64"):t,...e})}async yandexSmart(t,e,s={}){return this._solve({type:"YandexSmartCaptchaTaskProxyless",websiteURL:t,websiteKey:e,...s})}async vkCaptcha(t,e,s={}){return this._solve({type:"VKCaptchaTaskProxyless",websiteURL:t,websiteKey:e,...s})}async temuCaptcha(t,e={}){return this._solve({type:"TemuCaptchaTaskProxyless",websiteURL:t,...e})}async solve(t){return this._solve(t)}};var p=class extends n{constructor(t){super({baseUrl:"https://api.rucaptcha.com"},t)}};var c=class extends n{constructor(t){super({baseUrl:"https://api.anti-captcha.com"},t)}};var h={rucaptcha:p,anticaptcha:c};function P(a,t){let e=h[a];return new e(t)}export{c as AntiCaptcha,p as RuCaptcha,n as Solver,i as SolverError,P as createSolver};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "recognize",
3
- "version": "3.1.1",
3
+ "version": "3.1.2",
4
4
  "description": "Lightweight zero-dependency captcha solving client for RuCaptcha and Anti-Captcha (API v2)",
5
5
  "type": "module",
6
6
  "exports": {
@@ -14,7 +14,9 @@
14
14
  "module": "./dist/index.mjs",
15
15
  "types": "./dist/index.d.ts",
16
16
  "files": [
17
- "dist"
17
+ "dist",
18
+ "README.md",
19
+ "LICENSE"
18
20
  ],
19
21
  "engines": {
20
22
  "node": ">=18.0.0"
@@ -1 +0,0 @@
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":"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","names":[]}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
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":[]}