recognize 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,395 @@
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
+ _softId;
23
+ _pollingInterval;
24
+ _timeout;
25
+ constructor(config, options) {
26
+ if (!options.apiKey) throw new Error("apiKey is required");
27
+ this._baseUrl = config.baseUrl;
28
+ this._clientKey = options.apiKey;
29
+ this._softId = config.softId;
30
+ this._pollingInterval = options.pollingInterval ?? 5e3;
31
+ this._timeout = options.timeout ?? 18e4;
32
+ }
33
+ // ── Internal helpers ──────────────────────────────────────────────
34
+ async _post(method, body) {
35
+ const res = await fetch(`${this._baseUrl}/${method}`, {
36
+ method: "POST",
37
+ headers: { "Content-Type": "application/json" },
38
+ body: JSON.stringify(body)
39
+ });
40
+ const data = await res.json();
41
+ if (data.errorId && data.errorId !== 0) {
42
+ throw new SolverError(
43
+ data.errorId,
44
+ data.errorCode ?? "",
45
+ data.errorDescription
46
+ );
47
+ }
48
+ return data;
49
+ }
50
+ async _createTask(task) {
51
+ const data = await this._post("createTask", {
52
+ clientKey: this._clientKey,
53
+ task,
54
+ softId: this._softId
55
+ });
56
+ return data.taskId;
57
+ }
58
+ async _getTaskResult(taskId) {
59
+ const deadline = Date.now() + this._timeout;
60
+ while (Date.now() < deadline) {
61
+ await setTimeout(this._pollingInterval);
62
+ const data = await this._post("getTaskResult", {
63
+ clientKey: this._clientKey,
64
+ taskId
65
+ });
66
+ if (data.status === "ready") return data.solution;
67
+ }
68
+ throw new Error("Timeout waiting for task result");
69
+ }
70
+ async _solve(task) {
71
+ const taskId = await this._createTask(task);
72
+ const solution = await this._getTaskResult(taskId);
73
+ return { taskId, solution };
74
+ }
75
+ // ── Account ───────────────────────────────────────────────────────
76
+ async getBalance() {
77
+ const data = await this._post("getBalance", { clientKey: this._clientKey });
78
+ return data.balance;
79
+ }
80
+ async reportCorrect(taskId) {
81
+ await this._post("reportCorrect", { clientKey: this._clientKey, taskId });
82
+ return true;
83
+ }
84
+ async reportIncorrect(taskId) {
85
+ await this._post("reportIncorrect", { clientKey: this._clientKey, taskId });
86
+ return true;
87
+ }
88
+ // ── Image / Text captchas ────────────────────────────────────────
89
+ async imageCaptcha(body, options = {}) {
90
+ return this._solve({
91
+ type: "ImageToTextTask",
92
+ body: Buffer.isBuffer(body) ? body.toString("base64") : body,
93
+ ...options
94
+ });
95
+ }
96
+ async textCaptcha(textcaptcha, options = {}) {
97
+ return this._solve({
98
+ type: "TextCaptchaTask",
99
+ ...options,
100
+ textcaptcha
101
+ });
102
+ }
103
+ async audioCaptcha(body, lang = "en") {
104
+ return this._solve({
105
+ type: "AudioTask",
106
+ body: Buffer.isBuffer(body) ? body.toString("base64") : body,
107
+ lang
108
+ });
109
+ }
110
+ // ── reCAPTCHA ─────────────────────────────────────────────────────
111
+ async recaptchaV2(websiteURL, websiteKey, options = {}) {
112
+ const { proxy, ...rest } = options;
113
+ return this._solve({
114
+ type: proxy ? "RecaptchaV2Task" : "RecaptchaV2TaskProxyless",
115
+ websiteURL,
116
+ websiteKey,
117
+ ...rest
118
+ });
119
+ }
120
+ async recaptchaV3(websiteURL, websiteKey, pageAction, minScore = 0.3, options = {}) {
121
+ return this._solve({
122
+ type: "RecaptchaV3TaskProxyless",
123
+ websiteURL,
124
+ websiteKey,
125
+ pageAction,
126
+ minScore,
127
+ ...options
128
+ });
129
+ }
130
+ async recaptchaV2Enterprise(websiteURL, websiteKey, options = {}) {
131
+ const { proxy, ...rest } = options;
132
+ return this._solve({
133
+ type: proxy ? "RecaptchaV2EnterpriseTask" : "RecaptchaV2EnterpriseTaskProxyless",
134
+ websiteURL,
135
+ websiteKey,
136
+ ...rest
137
+ });
138
+ }
139
+ // ── hCaptcha ──────────────────────────────────────────────────────
140
+ async hcaptcha(websiteURL, websiteKey, options = {}) {
141
+ const { proxy, ...rest } = options;
142
+ return this._solve({
143
+ type: proxy ? "HCaptchaTask" : "HCaptchaTaskProxyless",
144
+ websiteURL,
145
+ websiteKey,
146
+ ...rest
147
+ });
148
+ }
149
+ // ── FunCaptcha (Arkose Labs) ──────────────────────────────────────
150
+ async funcaptcha(websiteURL, websitePublicKey, options = {}) {
151
+ const { proxy, ...rest } = options;
152
+ return this._solve({
153
+ type: proxy ? "FunCaptchaTask" : "FunCaptchaTaskProxyless",
154
+ websiteURL,
155
+ websitePublicKey,
156
+ ...rest
157
+ });
158
+ }
159
+ // ── GeeTest ───────────────────────────────────────────────────────
160
+ async geetest(websiteURL, gt, challenge, options = {}) {
161
+ const { proxy, ...rest } = options;
162
+ return this._solve({
163
+ type: proxy ? "GeeTestTask" : "GeeTestTaskProxyless",
164
+ websiteURL,
165
+ gt,
166
+ challenge,
167
+ ...rest
168
+ });
169
+ }
170
+ async geetestV4(websiteURL, captchaId, options = {}) {
171
+ const { proxy, ...rest } = options;
172
+ return this._solve({
173
+ type: proxy ? "GeeTestTask" : "GeeTestTaskProxyless",
174
+ websiteURL,
175
+ captchaId,
176
+ version: 4,
177
+ ...rest
178
+ });
179
+ }
180
+ // ── Cloudflare Turnstile ──────────────────────────────────────────
181
+ async turnstile(websiteURL, websiteKey, options = {}) {
182
+ const { proxy, ...rest } = options;
183
+ return this._solve({
184
+ type: proxy ? "TurnstileTask" : "TurnstileTaskProxyless",
185
+ websiteURL,
186
+ websiteKey,
187
+ ...rest
188
+ });
189
+ }
190
+ // ── Amazon WAF ────────────────────────────────────────────────────
191
+ async amazonWaf(websiteURL, websiteKey, options = {}) {
192
+ return this._solve({
193
+ type: "AmazonTaskProxyless",
194
+ websiteURL,
195
+ websiteKey,
196
+ ...options
197
+ });
198
+ }
199
+ // ── KeyCaptcha ────────────────────────────────────────────────────
200
+ async keyCaptcha(websiteURL, options = {}) {
201
+ return this._solve({
202
+ type: "KeyCaptchaTaskProxyless",
203
+ websiteURL,
204
+ ...options
205
+ });
206
+ }
207
+ // ── Lemin ─────────────────────────────────────────────────────────
208
+ async lemin(websiteURL, captchaId, apiServer, options = {}) {
209
+ return this._solve({
210
+ type: "LeminTaskProxyless",
211
+ websiteURL,
212
+ captchaId,
213
+ apiServer,
214
+ ...options
215
+ });
216
+ }
217
+ // ── Capy Puzzle ───────────────────────────────────────────────────
218
+ async capyPuzzle(websiteURL, websiteKey, options = {}) {
219
+ return this._solve({
220
+ type: "CapyTaskProxyless",
221
+ websiteURL,
222
+ websiteKey,
223
+ ...options
224
+ });
225
+ }
226
+ // ── DataDome ──────────────────────────────────────────────────────
227
+ async dataDome(websiteURL, captchaUrl, userAgent, proxyConfig) {
228
+ return this._solve({
229
+ type: "DataDomeSliderTask",
230
+ websiteURL,
231
+ captchaUrl,
232
+ userAgent,
233
+ ...proxyConfig
234
+ });
235
+ }
236
+ // ── CyberSiARA ───────────────────────────────────────────────────
237
+ async cyberSiara(websiteURL, slideMasterUrlId, userAgent, options = {}) {
238
+ return this._solve({
239
+ type: "AntiCyberSiAraTaskProxyless",
240
+ websiteURL,
241
+ SlideMasterUrlId: slideMasterUrlId,
242
+ userAgent,
243
+ ...options
244
+ });
245
+ }
246
+ // ── MTCaptcha ─────────────────────────────────────────────────────
247
+ async mtCaptcha(websiteURL, websiteKey, options = {}) {
248
+ return this._solve({
249
+ type: "MtCaptchaTaskProxyless",
250
+ websiteURL,
251
+ websiteKey,
252
+ ...options
253
+ });
254
+ }
255
+ // ── Friendly Captcha ─────────────────────────────────────────────
256
+ async friendlyCaptcha(websiteURL, websiteKey, options = {}) {
257
+ return this._solve({
258
+ type: "FriendlyCaptchaTaskProxyless",
259
+ websiteURL,
260
+ websiteKey,
261
+ ...options
262
+ });
263
+ }
264
+ // ── Cutcaptcha ────────────────────────────────────────────────────
265
+ async cutcaptcha(websiteURL, miseryKey, apiKey, options = {}) {
266
+ return this._solve({
267
+ type: "CutCaptchaTaskProxyless",
268
+ websiteURL,
269
+ miseryKey,
270
+ apiKey,
271
+ ...options
272
+ });
273
+ }
274
+ // ── Tencent ───────────────────────────────────────────────────────
275
+ async tencent(websiteURL, appId, options = {}) {
276
+ return this._solve({
277
+ type: "TencentTaskProxyless",
278
+ websiteURL,
279
+ appId,
280
+ ...options
281
+ });
282
+ }
283
+ // ── atbCAPTCHA ────────────────────────────────────────────────────
284
+ async atbCaptcha(websiteURL, appId, apiServer, options = {}) {
285
+ return this._solve({
286
+ type: "AtbCaptchaTaskProxyless",
287
+ websiteURL,
288
+ appId,
289
+ apiServer,
290
+ ...options
291
+ });
292
+ }
293
+ // ── Rotate ────────────────────────────────────────────────────────
294
+ async rotateCaptcha(body, options = {}) {
295
+ return this._solve({
296
+ type: "RotateTask",
297
+ body: Buffer.isBuffer(body) ? body.toString("base64") : body,
298
+ ...options
299
+ });
300
+ }
301
+ // ── Coordinates (click) ───────────────────────────────────────────
302
+ async coordinatesCaptcha(body, options = {}) {
303
+ return this._solve({
304
+ type: "CoordinatesTask",
305
+ body: Buffer.isBuffer(body) ? body.toString("base64") : body,
306
+ ...options
307
+ });
308
+ }
309
+ // ── Grid ──────────────────────────────────────────────────────────
310
+ async gridCaptcha(body, options = {}) {
311
+ return this._solve({
312
+ type: "GridTask",
313
+ body: Buffer.isBuffer(body) ? body.toString("base64") : body,
314
+ ...options
315
+ });
316
+ }
317
+ // ── Bounding Box ──────────────────────────────────────────────────
318
+ async boundingBoxCaptcha(body, options = {}) {
319
+ return this._solve({
320
+ type: "BoundingBoxTask",
321
+ body: Buffer.isBuffer(body) ? body.toString("base64") : body,
322
+ ...options
323
+ });
324
+ }
325
+ // ── Draw Around (Canvas) ──────────────────────────────────────────
326
+ async drawAroundCaptcha(body, options = {}) {
327
+ return this._solve({
328
+ type: "DrawAroundTask",
329
+ body: Buffer.isBuffer(body) ? body.toString("base64") : body,
330
+ ...options
331
+ });
332
+ }
333
+ // ── Yandex Smart Captcha ─────────────────────────────────────────
334
+ async yandexSmart(websiteURL, websiteKey, options = {}) {
335
+ return this._solve({
336
+ type: "YandexSmartCaptchaTaskProxyless",
337
+ websiteURL,
338
+ websiteKey,
339
+ ...options
340
+ });
341
+ }
342
+ // ── VK Captcha ────────────────────────────────────────────────────
343
+ async vkCaptcha(websiteURL, websiteKey, options = {}) {
344
+ return this._solve({
345
+ type: "VKCaptchaTaskProxyless",
346
+ websiteURL,
347
+ websiteKey,
348
+ ...options
349
+ });
350
+ }
351
+ // ── Temu Captcha ──────────────────────────────────────────────────
352
+ async temuCaptcha(websiteURL, options = {}) {
353
+ return this._solve({
354
+ type: "TemuCaptchaTaskProxyless",
355
+ websiteURL,
356
+ ...options
357
+ });
358
+ }
359
+ // ── Generic / Custom task ─────────────────────────────────────────
360
+ async solve(task) {
361
+ return this._solve(task);
362
+ }
363
+ };
364
+
365
+ // src/rucaptcha.ts
366
+ var RuCaptcha = class extends Solver {
367
+ constructor(options) {
368
+ super({ baseUrl: "https://api.rucaptcha.com", softId: 768 }, options);
369
+ }
370
+ };
371
+
372
+ // src/anticaptcha.ts
373
+ var AntiCaptcha = class extends Solver {
374
+ constructor(options) {
375
+ super({ baseUrl: "https://api.anti-captcha.com", softId: 720 }, options);
376
+ }
377
+ };
378
+
379
+ // src/index.ts
380
+ var services = {
381
+ rucaptcha: RuCaptcha,
382
+ anticaptcha: AntiCaptcha
383
+ };
384
+ function createSolver(service, options) {
385
+ const ServiceClass = services[service];
386
+ return new ServiceClass(options);
387
+ }
388
+ export {
389
+ AntiCaptcha,
390
+ RuCaptcha,
391
+ Solver,
392
+ SolverError,
393
+ createSolver
394
+ };
395
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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":";AAAA,SAAS,kBAAkB;;;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,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,UAAU,OAAO;AACtB,SAAK,mBAAmB,QAAQ,mBAAmB;AACnD,SAAK,WAAW,QAAQ,WAAW;AAAA,EACrC;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,YAAM,WAAW,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;;;AE/iBO,IAAM,YAAN,cAAwB,OAAO;AAAA,EACpC,YAAY,SAAwB;AAClC,UAAM,EAAE,SAAS,6BAA6B,QAAQ,IAAI,GAAG,OAAO;AAAA,EACtE;AACF;;;ACJO,IAAM,cAAN,cAA0B,OAAO;AAAA,EACtC,YAAY,SAAwB;AAClC,UAAM,EAAE,SAAS,gCAAgC,QAAQ,IAAI,GAAG,OAAO;AAAA,EACzE;AACF;;;AC0BA,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/package.json CHANGED
@@ -1,28 +1,58 @@
1
- {
2
- "name": "recognize",
3
- "version": "2.0.0",
4
- "description": "Client for solving services using node.js",
5
- "main": "index.js",
6
- "type": "module",
7
- "scripts": {
8
- "test": "echo \"Error: no test specified\" && exit 1"
9
- },
10
- "repository": {
11
- "type": "git",
12
- "url": "git+https://github.com/kdinisv/Recognize.git"
13
- },
14
- "keywords": [
15
- "captcha",
16
- "rucaptcha",
17
- "antigate"
18
- ],
19
- "author": "kdinisv",
20
- "license": "MIT",
21
- "bugs": {
22
- "url": "https://github.com/kdinisv/Recognize/issues"
23
- },
24
- "homepage": "https://github.com/kdinisv/Recognize#readme",
25
- "dependencies": {
26
- "got": "^12.0.0"
27
- }
28
- }
1
+ {
2
+ "name": "recognize",
3
+ "version": "3.0.0",
4
+ "description": "Lightweight zero-dependency captcha solving client for RuCaptcha and Anti-Captcha (API v2)",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.mjs",
10
+ "require": "./dist/index.cjs"
11
+ }
12
+ },
13
+ "main": "./dist/index.cjs",
14
+ "module": "./dist/index.mjs",
15
+ "types": "./dist/index.d.ts",
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "engines": {
20
+ "node": ">=18.0.0"
21
+ },
22
+ "scripts": {
23
+ "build": "tsup",
24
+ "test": "vitest run",
25
+ "test:watch": "vitest",
26
+ "prepublishOnly": "npm run build"
27
+ },
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/kdinisv/Recognize.git"
31
+ },
32
+ "keywords": [
33
+ "captcha",
34
+ "rucaptcha",
35
+ "2captcha",
36
+ "anti-captcha",
37
+ "anticaptcha",
38
+ "recaptcha",
39
+ "hcaptcha",
40
+ "turnstile",
41
+ "funcaptcha",
42
+ "geetest",
43
+ "solver",
44
+ "typescript"
45
+ ],
46
+ "author": "kdinisv",
47
+ "license": "MIT",
48
+ "bugs": {
49
+ "url": "https://github.com/kdinisv/Recognize/issues"
50
+ },
51
+ "homepage": "https://github.com/kdinisv/Recognize#readme",
52
+ "devDependencies": {
53
+ "@types/node": "^25.5.0",
54
+ "tsup": "^8.0.0",
55
+ "typescript": "^5.4.0",
56
+ "vitest": "^4.1.0"
57
+ }
58
+ }
Binary file
package/example/test.js DELETED
@@ -1,37 +0,0 @@
1
- import { readFile } from "node:fs/promises";
2
- import Recognize, { SOURCE } from "../index.js";
3
-
4
- const recognize = new Recognize(SOURCE.RUCAPTCHA, {
5
- key: "api-key",
6
- });
7
-
8
- const price = await recognize.balanse();
9
- console.log("My balance:", price);
10
-
11
- // const buff = await readFile("./example/captcha.png");
12
-
13
- // const { id, result } = await recognize
14
- // .solvingRecaptcha3(
15
- // "https://www.reestr-zalogov.ru/search/index",
16
- // "6LdKJhMaAAAAAIfeHC6FZc-UVfzDQpiOjaJUWoxr",
17
- // "search_notary",
18
- // "0.3"
19
- // )
20
- // .catch(console.error);
21
-
22
- // console.log(id, result);
23
-
24
- // console.log(await recognize.solvingImage(buff));
25
-
26
- // const r = await recognize.reportGood(1).catch((err) => err.message);
27
- // console.log(r);
28
- // recognize.solving(buff, function (err, id, code) {
29
- // if (err) throw err;
30
- // if (code) console.log("Captcha:", code);
31
- // else {
32
- // console.log("Captcha not valid");
33
- // recognize.report(id, function (err, answer) {
34
- // console.log(answer);
35
- // });
36
- // }
37
- // });