gatsbie 1.0.0 → 1.0.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.d.mts +117 -5
- package/dist/index.d.ts +117 -5
- package/dist/index.js +160 -8
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +160 -8
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -21,14 +21,18 @@ interface RecaptchaV3Solution {
|
|
|
21
21
|
token: string;
|
|
22
22
|
userAgent: string;
|
|
23
23
|
}
|
|
24
|
-
/**
|
|
25
|
-
interface
|
|
24
|
+
/** Cookies returned by Akamai. */
|
|
25
|
+
interface AkamaiCookies {
|
|
26
26
|
abck: string;
|
|
27
27
|
bmSz: string;
|
|
28
|
-
userAgent: string;
|
|
29
28
|
country?: string;
|
|
30
29
|
usrLocale?: string;
|
|
31
30
|
}
|
|
31
|
+
/** Solution for Akamai challenges. */
|
|
32
|
+
interface AkamaiSolution {
|
|
33
|
+
cookies: AkamaiCookies;
|
|
34
|
+
userAgent: string;
|
|
35
|
+
}
|
|
32
36
|
/** Solution for Vercel challenges. */
|
|
33
37
|
interface VercelSolution {
|
|
34
38
|
vcrcs: string;
|
|
@@ -59,9 +63,13 @@ interface PerimeterXSolution {
|
|
|
59
63
|
cookies: PerimeterXCookies;
|
|
60
64
|
userAgent: string;
|
|
61
65
|
}
|
|
66
|
+
/** Cookies returned by Cloudflare WAF. */
|
|
67
|
+
interface CloudflareWAFCookies {
|
|
68
|
+
cfClearance: string;
|
|
69
|
+
}
|
|
62
70
|
/** Solution for Cloudflare WAF challenges. */
|
|
63
71
|
interface CloudflareWAFSolution {
|
|
64
|
-
|
|
72
|
+
cookies: CloudflareWAFCookies;
|
|
65
73
|
userAgent: string;
|
|
66
74
|
}
|
|
67
75
|
/** Solution for Datadome Slider challenges. */
|
|
@@ -69,6 +77,42 @@ interface DatadomeSliderSolution {
|
|
|
69
77
|
datadome: string;
|
|
70
78
|
userAgent: string;
|
|
71
79
|
}
|
|
80
|
+
/** Cookies returned by CaptchaFox. */
|
|
81
|
+
interface CaptchaFoxCookies {
|
|
82
|
+
bmS: string;
|
|
83
|
+
bmSc: string;
|
|
84
|
+
}
|
|
85
|
+
/** Solution for CaptchaFox challenges. */
|
|
86
|
+
interface CaptchaFoxSolution {
|
|
87
|
+
cookie: CaptchaFoxCookies;
|
|
88
|
+
userAgent: string;
|
|
89
|
+
}
|
|
90
|
+
/** Solution for Castle challenges. */
|
|
91
|
+
interface CastleSolution {
|
|
92
|
+
token: string;
|
|
93
|
+
userAgent: string;
|
|
94
|
+
}
|
|
95
|
+
/** Solution for Incapsula Reese84 challenges. */
|
|
96
|
+
interface Reese84Solution {
|
|
97
|
+
reese84: string;
|
|
98
|
+
userAgent: string;
|
|
99
|
+
}
|
|
100
|
+
/** Solution for Forter challenges. */
|
|
101
|
+
interface ForterSolution {
|
|
102
|
+
token: string;
|
|
103
|
+
userAgent: string;
|
|
104
|
+
}
|
|
105
|
+
/** Solution for Funcaptcha challenges. */
|
|
106
|
+
interface FuncaptchaSolution {
|
|
107
|
+
token: string;
|
|
108
|
+
userAgent: string;
|
|
109
|
+
}
|
|
110
|
+
/** Solution for Akamai SBSD challenges. */
|
|
111
|
+
interface SBSDSolution {
|
|
112
|
+
bmS: string;
|
|
113
|
+
bmSc: string;
|
|
114
|
+
userAgent: string;
|
|
115
|
+
}
|
|
72
116
|
/** Request for solving Datadome device check challenges. */
|
|
73
117
|
interface DatadomeRequest {
|
|
74
118
|
proxy: string;
|
|
@@ -130,6 +174,50 @@ interface DatadomeSliderRequest {
|
|
|
130
174
|
targetUrl: string;
|
|
131
175
|
targetMethod?: string;
|
|
132
176
|
}
|
|
177
|
+
/** Request for solving CaptchaFox challenges. */
|
|
178
|
+
interface CaptchaFoxRequest {
|
|
179
|
+
proxy: string;
|
|
180
|
+
targetUrl: string;
|
|
181
|
+
siteKey: string;
|
|
182
|
+
}
|
|
183
|
+
/** Castle configuration parameters. */
|
|
184
|
+
interface CastleConfigJSON {
|
|
185
|
+
avoidCookies?: boolean;
|
|
186
|
+
pk: string;
|
|
187
|
+
wUrl: string;
|
|
188
|
+
swUrl: string;
|
|
189
|
+
}
|
|
190
|
+
/** Request for solving Castle challenges. */
|
|
191
|
+
interface CastleRequest {
|
|
192
|
+
proxy: string;
|
|
193
|
+
targetUrl: string;
|
|
194
|
+
configJson: CastleConfigJSON;
|
|
195
|
+
}
|
|
196
|
+
/** Request for solving Incapsula Reese84 challenges. */
|
|
197
|
+
interface Reese84Request {
|
|
198
|
+
proxy: string;
|
|
199
|
+
reese84JsUrl: string;
|
|
200
|
+
}
|
|
201
|
+
/** Request for solving Forter challenges. */
|
|
202
|
+
interface ForterRequest {
|
|
203
|
+
proxy: string;
|
|
204
|
+
targetUrl: string;
|
|
205
|
+
forterJsUrl: string;
|
|
206
|
+
siteId: string;
|
|
207
|
+
}
|
|
208
|
+
/** Request for solving Funcaptcha challenges. */
|
|
209
|
+
interface FuncaptchaRequest {
|
|
210
|
+
proxy: string;
|
|
211
|
+
targetUrl: string;
|
|
212
|
+
customApiHost: string;
|
|
213
|
+
publicKey: string;
|
|
214
|
+
}
|
|
215
|
+
/** Request for solving Akamai SBSD challenges. */
|
|
216
|
+
interface SBSDRequest {
|
|
217
|
+
proxy: string;
|
|
218
|
+
targetUrl: string;
|
|
219
|
+
targetMethod: string;
|
|
220
|
+
}
|
|
133
221
|
/** Options for configuring the Gatsbie client. */
|
|
134
222
|
interface ClientOptions {
|
|
135
223
|
/** Custom base URL for the API. */
|
|
@@ -206,6 +294,30 @@ declare class Client {
|
|
|
206
294
|
* Solve a Datadome Slider CAPTCHA challenge.
|
|
207
295
|
*/
|
|
208
296
|
solveDatadomeSlider(request: DatadomeSliderRequest): Promise<SolveResponse<DatadomeSliderSolution>>;
|
|
297
|
+
/**
|
|
298
|
+
* Solve a CaptchaFox challenge.
|
|
299
|
+
*/
|
|
300
|
+
solveCaptchaFox(request: CaptchaFoxRequest): Promise<SolveResponse<CaptchaFoxSolution>>;
|
|
301
|
+
/**
|
|
302
|
+
* Solve a Castle challenge.
|
|
303
|
+
*/
|
|
304
|
+
solveCastle(request: CastleRequest): Promise<SolveResponse<CastleSolution>>;
|
|
305
|
+
/**
|
|
306
|
+
* Solve an Incapsula Reese84 challenge.
|
|
307
|
+
*/
|
|
308
|
+
solveReese84(request: Reese84Request): Promise<SolveResponse<Reese84Solution>>;
|
|
309
|
+
/**
|
|
310
|
+
* Solve a Forter challenge.
|
|
311
|
+
*/
|
|
312
|
+
solveForter(request: ForterRequest): Promise<SolveResponse<ForterSolution>>;
|
|
313
|
+
/**
|
|
314
|
+
* Solve a Funcaptcha (Arkose Labs) challenge.
|
|
315
|
+
*/
|
|
316
|
+
solveFuncaptcha(request: FuncaptchaRequest): Promise<SolveResponse<FuncaptchaSolution>>;
|
|
317
|
+
/**
|
|
318
|
+
* Solve an Akamai SBSD challenge.
|
|
319
|
+
*/
|
|
320
|
+
solveSBSD(request: SBSDRequest): Promise<SolveResponse<SBSDSolution>>;
|
|
209
321
|
}
|
|
210
322
|
|
|
211
323
|
/**
|
|
@@ -262,4 +374,4 @@ declare class RequestError extends GatsbieError {
|
|
|
262
374
|
constructor(message: string, cause?: Error | undefined);
|
|
263
375
|
}
|
|
264
376
|
|
|
265
|
-
export { APIError, type AkamaiRequest, type AkamaiSolution, Client, type ClientOptions, type CloudflareWAFRequest, type CloudflareWAFSolution, type DatadomeRequest, type DatadomeSliderRequest, type DatadomeSliderSolution, type DatadomeSolution, ErrorCode, GatsbieError, type HealthResponse, type PerimeterXCookies, type PerimeterXRequest, type PerimeterXSolution, type RecaptchaV3Request, type RecaptchaV3Solution, RequestError, type ShapeRequest, type ShapeSolution, type SolveResponse, type TurnstileRequest, type TurnstileSolution, type VercelRequest, type VercelSolution };
|
|
377
|
+
export { APIError, type AkamaiRequest, type AkamaiSolution, type CaptchaFoxCookies, type CaptchaFoxRequest, type CaptchaFoxSolution, type CastleConfigJSON, type CastleRequest, type CastleSolution, Client, type ClientOptions, type CloudflareWAFRequest, type CloudflareWAFSolution, type DatadomeRequest, type DatadomeSliderRequest, type DatadomeSliderSolution, type DatadomeSolution, ErrorCode, type ForterRequest, type ForterSolution, type FuncaptchaRequest, type FuncaptchaSolution, GatsbieError, type HealthResponse, type PerimeterXCookies, type PerimeterXRequest, type PerimeterXSolution, type RecaptchaV3Request, type RecaptchaV3Solution, type Reese84Request, type Reese84Solution, RequestError, type SBSDRequest, type SBSDSolution, type ShapeRequest, type ShapeSolution, type SolveResponse, type TurnstileRequest, type TurnstileSolution, type VercelRequest, type VercelSolution };
|
package/dist/index.d.ts
CHANGED
|
@@ -21,14 +21,18 @@ interface RecaptchaV3Solution {
|
|
|
21
21
|
token: string;
|
|
22
22
|
userAgent: string;
|
|
23
23
|
}
|
|
24
|
-
/**
|
|
25
|
-
interface
|
|
24
|
+
/** Cookies returned by Akamai. */
|
|
25
|
+
interface AkamaiCookies {
|
|
26
26
|
abck: string;
|
|
27
27
|
bmSz: string;
|
|
28
|
-
userAgent: string;
|
|
29
28
|
country?: string;
|
|
30
29
|
usrLocale?: string;
|
|
31
30
|
}
|
|
31
|
+
/** Solution for Akamai challenges. */
|
|
32
|
+
interface AkamaiSolution {
|
|
33
|
+
cookies: AkamaiCookies;
|
|
34
|
+
userAgent: string;
|
|
35
|
+
}
|
|
32
36
|
/** Solution for Vercel challenges. */
|
|
33
37
|
interface VercelSolution {
|
|
34
38
|
vcrcs: string;
|
|
@@ -59,9 +63,13 @@ interface PerimeterXSolution {
|
|
|
59
63
|
cookies: PerimeterXCookies;
|
|
60
64
|
userAgent: string;
|
|
61
65
|
}
|
|
66
|
+
/** Cookies returned by Cloudflare WAF. */
|
|
67
|
+
interface CloudflareWAFCookies {
|
|
68
|
+
cfClearance: string;
|
|
69
|
+
}
|
|
62
70
|
/** Solution for Cloudflare WAF challenges. */
|
|
63
71
|
interface CloudflareWAFSolution {
|
|
64
|
-
|
|
72
|
+
cookies: CloudflareWAFCookies;
|
|
65
73
|
userAgent: string;
|
|
66
74
|
}
|
|
67
75
|
/** Solution for Datadome Slider challenges. */
|
|
@@ -69,6 +77,42 @@ interface DatadomeSliderSolution {
|
|
|
69
77
|
datadome: string;
|
|
70
78
|
userAgent: string;
|
|
71
79
|
}
|
|
80
|
+
/** Cookies returned by CaptchaFox. */
|
|
81
|
+
interface CaptchaFoxCookies {
|
|
82
|
+
bmS: string;
|
|
83
|
+
bmSc: string;
|
|
84
|
+
}
|
|
85
|
+
/** Solution for CaptchaFox challenges. */
|
|
86
|
+
interface CaptchaFoxSolution {
|
|
87
|
+
cookie: CaptchaFoxCookies;
|
|
88
|
+
userAgent: string;
|
|
89
|
+
}
|
|
90
|
+
/** Solution for Castle challenges. */
|
|
91
|
+
interface CastleSolution {
|
|
92
|
+
token: string;
|
|
93
|
+
userAgent: string;
|
|
94
|
+
}
|
|
95
|
+
/** Solution for Incapsula Reese84 challenges. */
|
|
96
|
+
interface Reese84Solution {
|
|
97
|
+
reese84: string;
|
|
98
|
+
userAgent: string;
|
|
99
|
+
}
|
|
100
|
+
/** Solution for Forter challenges. */
|
|
101
|
+
interface ForterSolution {
|
|
102
|
+
token: string;
|
|
103
|
+
userAgent: string;
|
|
104
|
+
}
|
|
105
|
+
/** Solution for Funcaptcha challenges. */
|
|
106
|
+
interface FuncaptchaSolution {
|
|
107
|
+
token: string;
|
|
108
|
+
userAgent: string;
|
|
109
|
+
}
|
|
110
|
+
/** Solution for Akamai SBSD challenges. */
|
|
111
|
+
interface SBSDSolution {
|
|
112
|
+
bmS: string;
|
|
113
|
+
bmSc: string;
|
|
114
|
+
userAgent: string;
|
|
115
|
+
}
|
|
72
116
|
/** Request for solving Datadome device check challenges. */
|
|
73
117
|
interface DatadomeRequest {
|
|
74
118
|
proxy: string;
|
|
@@ -130,6 +174,50 @@ interface DatadomeSliderRequest {
|
|
|
130
174
|
targetUrl: string;
|
|
131
175
|
targetMethod?: string;
|
|
132
176
|
}
|
|
177
|
+
/** Request for solving CaptchaFox challenges. */
|
|
178
|
+
interface CaptchaFoxRequest {
|
|
179
|
+
proxy: string;
|
|
180
|
+
targetUrl: string;
|
|
181
|
+
siteKey: string;
|
|
182
|
+
}
|
|
183
|
+
/** Castle configuration parameters. */
|
|
184
|
+
interface CastleConfigJSON {
|
|
185
|
+
avoidCookies?: boolean;
|
|
186
|
+
pk: string;
|
|
187
|
+
wUrl: string;
|
|
188
|
+
swUrl: string;
|
|
189
|
+
}
|
|
190
|
+
/** Request for solving Castle challenges. */
|
|
191
|
+
interface CastleRequest {
|
|
192
|
+
proxy: string;
|
|
193
|
+
targetUrl: string;
|
|
194
|
+
configJson: CastleConfigJSON;
|
|
195
|
+
}
|
|
196
|
+
/** Request for solving Incapsula Reese84 challenges. */
|
|
197
|
+
interface Reese84Request {
|
|
198
|
+
proxy: string;
|
|
199
|
+
reese84JsUrl: string;
|
|
200
|
+
}
|
|
201
|
+
/** Request for solving Forter challenges. */
|
|
202
|
+
interface ForterRequest {
|
|
203
|
+
proxy: string;
|
|
204
|
+
targetUrl: string;
|
|
205
|
+
forterJsUrl: string;
|
|
206
|
+
siteId: string;
|
|
207
|
+
}
|
|
208
|
+
/** Request for solving Funcaptcha challenges. */
|
|
209
|
+
interface FuncaptchaRequest {
|
|
210
|
+
proxy: string;
|
|
211
|
+
targetUrl: string;
|
|
212
|
+
customApiHost: string;
|
|
213
|
+
publicKey: string;
|
|
214
|
+
}
|
|
215
|
+
/** Request for solving Akamai SBSD challenges. */
|
|
216
|
+
interface SBSDRequest {
|
|
217
|
+
proxy: string;
|
|
218
|
+
targetUrl: string;
|
|
219
|
+
targetMethod: string;
|
|
220
|
+
}
|
|
133
221
|
/** Options for configuring the Gatsbie client. */
|
|
134
222
|
interface ClientOptions {
|
|
135
223
|
/** Custom base URL for the API. */
|
|
@@ -206,6 +294,30 @@ declare class Client {
|
|
|
206
294
|
* Solve a Datadome Slider CAPTCHA challenge.
|
|
207
295
|
*/
|
|
208
296
|
solveDatadomeSlider(request: DatadomeSliderRequest): Promise<SolveResponse<DatadomeSliderSolution>>;
|
|
297
|
+
/**
|
|
298
|
+
* Solve a CaptchaFox challenge.
|
|
299
|
+
*/
|
|
300
|
+
solveCaptchaFox(request: CaptchaFoxRequest): Promise<SolveResponse<CaptchaFoxSolution>>;
|
|
301
|
+
/**
|
|
302
|
+
* Solve a Castle challenge.
|
|
303
|
+
*/
|
|
304
|
+
solveCastle(request: CastleRequest): Promise<SolveResponse<CastleSolution>>;
|
|
305
|
+
/**
|
|
306
|
+
* Solve an Incapsula Reese84 challenge.
|
|
307
|
+
*/
|
|
308
|
+
solveReese84(request: Reese84Request): Promise<SolveResponse<Reese84Solution>>;
|
|
309
|
+
/**
|
|
310
|
+
* Solve a Forter challenge.
|
|
311
|
+
*/
|
|
312
|
+
solveForter(request: ForterRequest): Promise<SolveResponse<ForterSolution>>;
|
|
313
|
+
/**
|
|
314
|
+
* Solve a Funcaptcha (Arkose Labs) challenge.
|
|
315
|
+
*/
|
|
316
|
+
solveFuncaptcha(request: FuncaptchaRequest): Promise<SolveResponse<FuncaptchaSolution>>;
|
|
317
|
+
/**
|
|
318
|
+
* Solve an Akamai SBSD challenge.
|
|
319
|
+
*/
|
|
320
|
+
solveSBSD(request: SBSDRequest): Promise<SolveResponse<SBSDSolution>>;
|
|
209
321
|
}
|
|
210
322
|
|
|
211
323
|
/**
|
|
@@ -262,4 +374,4 @@ declare class RequestError extends GatsbieError {
|
|
|
262
374
|
constructor(message: string, cause?: Error | undefined);
|
|
263
375
|
}
|
|
264
376
|
|
|
265
|
-
export { APIError, type AkamaiRequest, type AkamaiSolution, Client, type ClientOptions, type CloudflareWAFRequest, type CloudflareWAFSolution, type DatadomeRequest, type DatadomeSliderRequest, type DatadomeSliderSolution, type DatadomeSolution, ErrorCode, GatsbieError, type HealthResponse, type PerimeterXCookies, type PerimeterXRequest, type PerimeterXSolution, type RecaptchaV3Request, type RecaptchaV3Solution, RequestError, type ShapeRequest, type ShapeSolution, type SolveResponse, type TurnstileRequest, type TurnstileSolution, type VercelRequest, type VercelSolution };
|
|
377
|
+
export { APIError, type AkamaiRequest, type AkamaiSolution, type CaptchaFoxCookies, type CaptchaFoxRequest, type CaptchaFoxSolution, type CastleConfigJSON, type CastleRequest, type CastleSolution, Client, type ClientOptions, type CloudflareWAFRequest, type CloudflareWAFSolution, type DatadomeRequest, type DatadomeSliderRequest, type DatadomeSliderSolution, type DatadomeSolution, ErrorCode, type ForterRequest, type ForterSolution, type FuncaptchaRequest, type FuncaptchaSolution, GatsbieError, type HealthResponse, type PerimeterXCookies, type PerimeterXRequest, type PerimeterXSolution, type RecaptchaV3Request, type RecaptchaV3Solution, type Reese84Request, type Reese84Solution, RequestError, type SBSDRequest, type SBSDSolution, type ShapeRequest, type ShapeSolution, type SolveResponse, type TurnstileRequest, type TurnstileSolution, type VercelRequest, type VercelSolution };
|
package/dist/index.js
CHANGED
|
@@ -226,11 +226,13 @@ var Client = class {
|
|
|
226
226
|
taskId: data.taskId,
|
|
227
227
|
service: data.service,
|
|
228
228
|
solution: {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
229
|
+
cookies: {
|
|
230
|
+
abck: data.solution.cookies_dict._abck,
|
|
231
|
+
bmSz: data.solution.cookies_dict.bm_sz,
|
|
232
|
+
country: data.solution.cookies_dict.Country,
|
|
233
|
+
usrLocale: data.solution.cookies_dict.UsrLocale
|
|
234
|
+
},
|
|
235
|
+
userAgent: data.solution.ua
|
|
234
236
|
},
|
|
235
237
|
cost: data.cost,
|
|
236
238
|
solveTime: data.solveTime
|
|
@@ -272,14 +274,14 @@ var Client = class {
|
|
|
272
274
|
method: request.method
|
|
273
275
|
};
|
|
274
276
|
const data = await this.request("POST", "/v1/solve/shape", body);
|
|
275
|
-
const {
|
|
277
|
+
const { "User-Agent": userAgent, ...headers } = data.solution;
|
|
276
278
|
return {
|
|
277
279
|
success: data.success,
|
|
278
280
|
taskId: data.taskId,
|
|
279
281
|
service: data.service,
|
|
280
282
|
solution: {
|
|
281
283
|
headers,
|
|
282
|
-
userAgent:
|
|
284
|
+
userAgent: userAgent || ""
|
|
283
285
|
},
|
|
284
286
|
cost: data.cost,
|
|
285
287
|
solveTime: data.solveTime
|
|
@@ -353,7 +355,9 @@ var Client = class {
|
|
|
353
355
|
taskId: data.taskId,
|
|
354
356
|
service: data.service,
|
|
355
357
|
solution: {
|
|
356
|
-
|
|
358
|
+
cookies: {
|
|
359
|
+
cfClearance: data.solution.cookies.cf_clearance
|
|
360
|
+
},
|
|
357
361
|
userAgent: data.solution.ua
|
|
358
362
|
},
|
|
359
363
|
cost: data.cost,
|
|
@@ -383,6 +387,154 @@ var Client = class {
|
|
|
383
387
|
solveTime: data.solveTime
|
|
384
388
|
};
|
|
385
389
|
}
|
|
390
|
+
/**
|
|
391
|
+
* Solve a CaptchaFox challenge.
|
|
392
|
+
*/
|
|
393
|
+
async solveCaptchaFox(request) {
|
|
394
|
+
const body = {
|
|
395
|
+
task_type: "captchafox",
|
|
396
|
+
proxy: request.proxy,
|
|
397
|
+
target_url: request.targetUrl,
|
|
398
|
+
site_key: request.siteKey
|
|
399
|
+
};
|
|
400
|
+
const data = await this.request("POST", "/v1/solve/captchafox", body);
|
|
401
|
+
return {
|
|
402
|
+
success: data.success,
|
|
403
|
+
taskId: data.taskId,
|
|
404
|
+
service: data.service,
|
|
405
|
+
solution: {
|
|
406
|
+
cookie: {
|
|
407
|
+
bmS: data.solution.cookie.bm_s,
|
|
408
|
+
bmSc: data.solution.cookie.bm_sc
|
|
409
|
+
},
|
|
410
|
+
userAgent: data.solution.ua
|
|
411
|
+
},
|
|
412
|
+
cost: data.cost,
|
|
413
|
+
solveTime: data.solveTime
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Solve a Castle challenge.
|
|
418
|
+
*/
|
|
419
|
+
async solveCastle(request) {
|
|
420
|
+
const body = {
|
|
421
|
+
task_type: "castle",
|
|
422
|
+
proxy: request.proxy,
|
|
423
|
+
target_url: request.targetUrl,
|
|
424
|
+
config_json: {
|
|
425
|
+
avoidCookies: request.configJson.avoidCookies,
|
|
426
|
+
pk: request.configJson.pk,
|
|
427
|
+
wUrl: request.configJson.wUrl,
|
|
428
|
+
swUrl: request.configJson.swUrl
|
|
429
|
+
}
|
|
430
|
+
};
|
|
431
|
+
const data = await this.request("POST", "/v1/solve/castle", body);
|
|
432
|
+
return {
|
|
433
|
+
success: data.success,
|
|
434
|
+
taskId: data.taskId,
|
|
435
|
+
service: data.service,
|
|
436
|
+
solution: {
|
|
437
|
+
token: data.solution.token,
|
|
438
|
+
userAgent: data.solution.ua
|
|
439
|
+
},
|
|
440
|
+
cost: data.cost,
|
|
441
|
+
solveTime: data.solveTime
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Solve an Incapsula Reese84 challenge.
|
|
446
|
+
*/
|
|
447
|
+
async solveReese84(request) {
|
|
448
|
+
const body = {
|
|
449
|
+
task_type: "reese84",
|
|
450
|
+
proxy: request.proxy,
|
|
451
|
+
reese84_js_url: request.reese84JsUrl
|
|
452
|
+
};
|
|
453
|
+
const data = await this.request("POST", "/v1/solve/reese84", body);
|
|
454
|
+
return {
|
|
455
|
+
success: data.success,
|
|
456
|
+
taskId: data.taskId,
|
|
457
|
+
service: data.service,
|
|
458
|
+
solution: {
|
|
459
|
+
reese84: data.solution.reese84,
|
|
460
|
+
userAgent: data.solution.user_agent
|
|
461
|
+
},
|
|
462
|
+
cost: data.cost,
|
|
463
|
+
solveTime: data.solveTime
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Solve a Forter challenge.
|
|
468
|
+
*/
|
|
469
|
+
async solveForter(request) {
|
|
470
|
+
const body = {
|
|
471
|
+
task_type: "forter",
|
|
472
|
+
proxy: request.proxy,
|
|
473
|
+
target_url: request.targetUrl,
|
|
474
|
+
forter_js_url: request.forterJsUrl,
|
|
475
|
+
site_id: request.siteId
|
|
476
|
+
};
|
|
477
|
+
const data = await this.request("POST", "/v1/solve/forter", body);
|
|
478
|
+
return {
|
|
479
|
+
success: data.success,
|
|
480
|
+
taskId: data.taskId,
|
|
481
|
+
service: data.service,
|
|
482
|
+
solution: {
|
|
483
|
+
token: data.solution.token,
|
|
484
|
+
userAgent: data.solution.ua
|
|
485
|
+
},
|
|
486
|
+
cost: data.cost,
|
|
487
|
+
solveTime: data.solveTime
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* Solve a Funcaptcha (Arkose Labs) challenge.
|
|
492
|
+
*/
|
|
493
|
+
async solveFuncaptcha(request) {
|
|
494
|
+
const body = {
|
|
495
|
+
task_type: "funcaptcha",
|
|
496
|
+
proxy: request.proxy,
|
|
497
|
+
target_url: request.targetUrl,
|
|
498
|
+
custom_api_host: request.customApiHost,
|
|
499
|
+
public_key: request.publicKey
|
|
500
|
+
};
|
|
501
|
+
const data = await this.request("POST", "/v1/solve/funcaptcha", body);
|
|
502
|
+
return {
|
|
503
|
+
success: data.success,
|
|
504
|
+
taskId: data.taskId,
|
|
505
|
+
service: data.service,
|
|
506
|
+
solution: {
|
|
507
|
+
token: data.solution.token,
|
|
508
|
+
userAgent: data.solution.ua
|
|
509
|
+
},
|
|
510
|
+
cost: data.cost,
|
|
511
|
+
solveTime: data.solveTime
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Solve an Akamai SBSD challenge.
|
|
516
|
+
*/
|
|
517
|
+
async solveSBSD(request) {
|
|
518
|
+
const body = {
|
|
519
|
+
task_type: "sbsd",
|
|
520
|
+
proxy: request.proxy,
|
|
521
|
+
target_url: request.targetUrl,
|
|
522
|
+
target_method: request.targetMethod
|
|
523
|
+
};
|
|
524
|
+
const data = await this.request("POST", "/v1/solve/sbsd", body);
|
|
525
|
+
return {
|
|
526
|
+
success: data.success,
|
|
527
|
+
taskId: data.taskId,
|
|
528
|
+
service: data.service,
|
|
529
|
+
solution: {
|
|
530
|
+
bmS: data.solution.bm_s,
|
|
531
|
+
bmSc: data.solution.bm_sc,
|
|
532
|
+
userAgent: data.solution.ua
|
|
533
|
+
},
|
|
534
|
+
cost: data.cost,
|
|
535
|
+
solveTime: data.solveTime
|
|
536
|
+
};
|
|
537
|
+
}
|
|
386
538
|
};
|
|
387
539
|
// Annotate the CommonJS export names for ESM import in node:
|
|
388
540
|
0 && (module.exports = {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts"],"sourcesContent":["/**\n * Gatsbie SDK - Official Node.js SDK for the Gatsbie Captcha API.\n *\n * @example\n * ```typescript\n * import { Client } from \"gatsbie\";\n *\n * const client = new Client(\"gats_your_api_key\");\n *\n * const response = await client.solveTurnstile({\n * proxy: \"http://user:pass@proxy:8080\",\n * targetUrl: \"https://example.com\",\n * siteKey: \"0x4AAAAAAABS7TtLxsNa7Z2e\",\n * });\n *\n * console.log(response.solution.token);\n * ```\n */\n\nexport { Client } from \"./client\";\nexport {\n APIError,\n ErrorCode,\n GatsbieError,\n RequestError,\n} from \"./errors\";\nexport type {\n // Response types\n HealthResponse,\n SolveResponse,\n // Solution types\n AkamaiSolution,\n CloudflareWAFSolution,\n DatadomeSliderSolution,\n DatadomeSolution,\n PerimeterXCookies,\n PerimeterXSolution,\n RecaptchaV3Solution,\n ShapeSolution,\n TurnstileSolution,\n VercelSolution,\n // Request types\n AkamaiRequest,\n CloudflareWAFRequest,\n DatadomeRequest,\n DatadomeSliderRequest,\n PerimeterXRequest,\n RecaptchaV3Request,\n ShapeRequest,\n TurnstileRequest,\n VercelRequest,\n // Options\n ClientOptions,\n} from \"./types\";\n","/**\n * Error codes returned by the Gatsbie API.\n */\nexport const ErrorCode = {\n AUTH_FAILED: \"AUTH_FAILED\",\n INSUFFICIENT_CREDITS: \"INSUFFICIENT_CREDITS\",\n INVALID_REQUEST: \"INVALID_REQUEST\",\n UPSTREAM_ERROR: \"UPSTREAM_ERROR\",\n SOLVE_FAILED: \"SOLVE_FAILED\",\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\n/**\n * Base error class for Gatsbie SDK errors.\n */\nexport class GatsbieError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GatsbieError\";\n Object.setPrototypeOf(this, GatsbieError.prototype);\n }\n}\n\n/**\n * Error thrown when the Gatsbie API returns an error response.\n */\nexport class APIError extends GatsbieError {\n readonly code: string;\n readonly details?: string;\n readonly timestamp?: number;\n readonly httpStatus?: number;\n\n constructor(options: {\n code: string;\n message: string;\n details?: string;\n timestamp?: number;\n httpStatus?: number;\n }) {\n const msg = options.details\n ? `gatsbie: ${options.code}: ${options.message} (${options.details})`\n : `gatsbie: ${options.code}: ${options.message}`;\n super(msg);\n this.name = \"APIError\";\n this.code = options.code;\n this.details = options.details;\n this.timestamp = options.timestamp;\n this.httpStatus = options.httpStatus;\n Object.setPrototypeOf(this, APIError.prototype);\n }\n\n /** Check if this is an authentication error. */\n isAuthError(): boolean {\n return this.code === ErrorCode.AUTH_FAILED;\n }\n\n /** Check if this error is due to insufficient credits. */\n isInsufficientCredits(): boolean {\n return this.code === ErrorCode.INSUFFICIENT_CREDITS;\n }\n\n /** Check if this error is due to an invalid request. */\n isInvalidRequest(): boolean {\n return this.code === ErrorCode.INVALID_REQUEST;\n }\n\n /** Check if this error is from an upstream service. */\n isUpstreamError(): boolean {\n return this.code === ErrorCode.UPSTREAM_ERROR;\n }\n\n /** Check if the captcha solving failed. */\n isSolveFailed(): boolean {\n return this.code === ErrorCode.SOLVE_FAILED;\n }\n\n /** Check if this is an internal server error. */\n isInternalError(): boolean {\n return this.code === ErrorCode.INTERNAL_ERROR;\n }\n}\n\n/**\n * Error thrown when a request fails (network error, timeout, etc.).\n */\nexport class RequestError extends GatsbieError {\n constructor(message: string, public readonly cause?: Error) {\n super(message);\n this.name = \"RequestError\";\n Object.setPrototypeOf(this, RequestError.prototype);\n }\n}\n","import { APIError, RequestError } from \"./errors\";\nimport type {\n AkamaiRequest,\n AkamaiSolution,\n ClientOptions,\n CloudflareWAFRequest,\n CloudflareWAFSolution,\n DatadomeRequest,\n DatadomeSliderRequest,\n DatadomeSliderSolution,\n DatadomeSolution,\n HealthResponse,\n PerimeterXRequest,\n PerimeterXSolution,\n RecaptchaV3Request,\n RecaptchaV3Solution,\n ShapeRequest,\n ShapeSolution,\n SolveResponse,\n TurnstileRequest,\n TurnstileSolution,\n VercelRequest,\n VercelSolution,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api2.gatsbie.io\";\nconst DEFAULT_TIMEOUT = 120000;\n\n/**\n * Gatsbie API client.\n *\n * @example\n * ```typescript\n * const client = new Client(\"gats_your_api_key\");\n *\n * const response = await client.solveTurnstile({\n * proxy: \"http://user:pass@proxy:8080\",\n * targetUrl: \"https://example.com\",\n * siteKey: \"0x4AAAAAAABS7TtLxsNa7Z2e\",\n * });\n *\n * console.log(response.solution.token);\n * ```\n */\nexport class Client {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n /**\n * Create a new Gatsbie API client.\n *\n * @param apiKey - Your Gatsbie API key (should start with 'gats_').\n * @param options - Optional client configuration.\n */\n constructor(apiKey: string, options: ClientOptions = {}) {\n this.apiKey = apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: Record<string, unknown>\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (!response.ok) {\n const error = (data.error as Record<string, unknown>) || {};\n throw new APIError({\n code: (error.code as string) || \"UNKNOWN\",\n message: (error.message as string) || \"Unknown error\",\n details: error.details as string | undefined,\n timestamp: error.timestamp as number | undefined,\n httpStatus: response.status,\n });\n }\n\n return data as T;\n } catch (err) {\n if (err instanceof APIError) {\n throw err;\n }\n if (err instanceof Error) {\n if (err.name === \"AbortError\") {\n throw new RequestError(\"Request timed out\", err);\n }\n throw new RequestError(`Request failed: ${err.message}`, err);\n }\n throw new RequestError(\"Request failed\");\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // ========================================================================\n // API Methods\n // ========================================================================\n\n /**\n * Check the API server health status.\n */\n async health(): Promise<HealthResponse> {\n return this.request<HealthResponse>(\"GET\", \"/health\");\n }\n\n /**\n * Solve a Datadome device check challenge.\n */\n async solveDatadome(\n request: DatadomeRequest\n ): Promise<SolveResponse<DatadomeSolution>> {\n const body = {\n task_type: \"datadome-device-check\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-device-check\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a reCAPTCHA v3 challenge.\n */\n async solveRecaptchaV3(\n request: RecaptchaV3Request\n ): Promise<SolveResponse<RecaptchaV3Solution>> {\n const body: Record<string, unknown> = {\n task_type: \"recaptchav3\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n if (request.action) body.action = request.action;\n if (request.title) body.title = request.title;\n if (request.enterprise) body.enterprise = request.enterprise;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/recaptchav3\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Akamai bot management challenge.\n */\n async solveAkamai(\n request: AkamaiRequest\n ): Promise<SolveResponse<AkamaiSolution>> {\n const body: Record<string, unknown> = {\n task_type: \"akamai\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n akamai_js_url: request.akamaiJsUrl,\n };\n if (request.pageFp) body.page_fp = request.pageFp;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n _abck: string;\n bm_sz: string;\n ua: string;\n Country?: string;\n UsrLocale?: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/akamai\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n abck: data.solution._abck,\n bmSz: data.solution.bm_sz,\n userAgent: data.solution.ua,\n country: data.solution.Country,\n usrLocale: data.solution.UsrLocale,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Vercel bot protection challenge.\n */\n async solveVercel(\n request: VercelRequest\n ): Promise<SolveResponse<VercelSolution>> {\n const body = {\n task_type: \"vercel\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { _vcrcs: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/vercel\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n vcrcs: data.solution._vcrcs,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Shape antibot challenge.\n */\n async solveShape(\n request: ShapeRequest\n ): Promise<SolveResponse<ShapeSolution>> {\n const body = {\n task_type: \"shape\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_api: request.targetApi,\n shape_js_url: request.shapeJsUrl,\n title: request.title,\n method: request.method,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: Record<string, string>;\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/shape\", body);\n\n // Shape returns dynamic headers, extract ua separately\n const { ua, ...headers } = data.solution;\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n headers,\n userAgent: ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare Turnstile challenge.\n */\n async solveTurnstile(\n request: TurnstileRequest\n ): Promise<SolveResponse<TurnstileSolution>> {\n const body = {\n task_type: \"turnstile\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/turnstile\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a PerimeterX Invisible challenge.\n */\n async solvePerimeterX(\n request: PerimeterXRequest\n ): Promise<SolveResponse<PerimeterXSolution>> {\n const body = {\n task_type: \"perimeterx_invisible\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n perimeterx_js_url: request.perimeterxJsUrl,\n pxAppId: request.pxAppId,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n perimeterx_cookies: {\n _px3: string;\n _pxde: string;\n _pxvid: string;\n pxcts: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/perimeterx-invisible\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n px3: data.solution.perimeterx_cookies._px3,\n pxde: data.solution.perimeterx_cookies._pxde,\n pxvid: data.solution.perimeterx_cookies._pxvid,\n pxcts: data.solution.perimeterx_cookies.pxcts,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare WAF challenge.\n */\n async solveCloudflareWAF(\n request: CloudflareWAFRequest\n ): Promise<SolveResponse<CloudflareWAFSolution>> {\n const body = {\n task_type: \"cloudflare_waf\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { cf_clearance: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/cloudflare-waf\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cfClearance: data.solution.cf_clearance,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Datadome Slider CAPTCHA challenge.\n */\n async solveDatadomeSlider(\n request: DatadomeSliderRequest\n ): Promise<SolveResponse<DatadomeSliderSolution>> {\n const body = {\n task_type: \"datadome-slider\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-slider\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts"],"sourcesContent":["/**\n * Gatsbie SDK - Official Node.js SDK for the Gatsbie Captcha API.\n *\n * @example\n * ```typescript\n * import { Client } from \"gatsbie\";\n *\n * const client = new Client(\"gats_your_api_key\");\n *\n * const response = await client.solveTurnstile({\n * proxy: \"http://user:pass@proxy:8080\",\n * targetUrl: \"https://example.com\",\n * siteKey: \"0x4AAAAAAABS7TtLxsNa7Z2e\",\n * });\n *\n * console.log(response.solution.token);\n * ```\n */\n\nexport { Client } from \"./client\";\nexport {\n APIError,\n ErrorCode,\n GatsbieError,\n RequestError,\n} from \"./errors\";\nexport type {\n // Response types\n HealthResponse,\n SolveResponse,\n // Solution types\n AkamaiSolution,\n CaptchaFoxCookies,\n CaptchaFoxSolution,\n CastleSolution,\n CloudflareWAFSolution,\n DatadomeSliderSolution,\n DatadomeSolution,\n ForterSolution,\n FuncaptchaSolution,\n PerimeterXCookies,\n PerimeterXSolution,\n RecaptchaV3Solution,\n Reese84Solution,\n SBSDSolution,\n ShapeSolution,\n TurnstileSolution,\n VercelSolution,\n // Request types\n AkamaiRequest,\n CaptchaFoxRequest,\n CastleConfigJSON,\n CastleRequest,\n CloudflareWAFRequest,\n DatadomeRequest,\n DatadomeSliderRequest,\n ForterRequest,\n FuncaptchaRequest,\n PerimeterXRequest,\n RecaptchaV3Request,\n Reese84Request,\n SBSDRequest,\n ShapeRequest,\n TurnstileRequest,\n VercelRequest,\n // Options\n ClientOptions,\n} from \"./types\";\n","/**\n * Error codes returned by the Gatsbie API.\n */\nexport const ErrorCode = {\n AUTH_FAILED: \"AUTH_FAILED\",\n INSUFFICIENT_CREDITS: \"INSUFFICIENT_CREDITS\",\n INVALID_REQUEST: \"INVALID_REQUEST\",\n UPSTREAM_ERROR: \"UPSTREAM_ERROR\",\n SOLVE_FAILED: \"SOLVE_FAILED\",\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\n/**\n * Base error class for Gatsbie SDK errors.\n */\nexport class GatsbieError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GatsbieError\";\n Object.setPrototypeOf(this, GatsbieError.prototype);\n }\n}\n\n/**\n * Error thrown when the Gatsbie API returns an error response.\n */\nexport class APIError extends GatsbieError {\n readonly code: string;\n readonly details?: string;\n readonly timestamp?: number;\n readonly httpStatus?: number;\n\n constructor(options: {\n code: string;\n message: string;\n details?: string;\n timestamp?: number;\n httpStatus?: number;\n }) {\n const msg = options.details\n ? `gatsbie: ${options.code}: ${options.message} (${options.details})`\n : `gatsbie: ${options.code}: ${options.message}`;\n super(msg);\n this.name = \"APIError\";\n this.code = options.code;\n this.details = options.details;\n this.timestamp = options.timestamp;\n this.httpStatus = options.httpStatus;\n Object.setPrototypeOf(this, APIError.prototype);\n }\n\n /** Check if this is an authentication error. */\n isAuthError(): boolean {\n return this.code === ErrorCode.AUTH_FAILED;\n }\n\n /** Check if this error is due to insufficient credits. */\n isInsufficientCredits(): boolean {\n return this.code === ErrorCode.INSUFFICIENT_CREDITS;\n }\n\n /** Check if this error is due to an invalid request. */\n isInvalidRequest(): boolean {\n return this.code === ErrorCode.INVALID_REQUEST;\n }\n\n /** Check if this error is from an upstream service. */\n isUpstreamError(): boolean {\n return this.code === ErrorCode.UPSTREAM_ERROR;\n }\n\n /** Check if the captcha solving failed. */\n isSolveFailed(): boolean {\n return this.code === ErrorCode.SOLVE_FAILED;\n }\n\n /** Check if this is an internal server error. */\n isInternalError(): boolean {\n return this.code === ErrorCode.INTERNAL_ERROR;\n }\n}\n\n/**\n * Error thrown when a request fails (network error, timeout, etc.).\n */\nexport class RequestError extends GatsbieError {\n constructor(message: string, public readonly cause?: Error) {\n super(message);\n this.name = \"RequestError\";\n Object.setPrototypeOf(this, RequestError.prototype);\n }\n}\n","import { APIError, RequestError } from \"./errors\";\nimport type {\n AkamaiRequest,\n AkamaiSolution,\n CaptchaFoxRequest,\n CaptchaFoxSolution,\n CastleRequest,\n CastleSolution,\n ClientOptions,\n CloudflareWAFRequest,\n CloudflareWAFSolution,\n DatadomeRequest,\n DatadomeSliderRequest,\n DatadomeSliderSolution,\n DatadomeSolution,\n ForterRequest,\n ForterSolution,\n FuncaptchaRequest,\n FuncaptchaSolution,\n HealthResponse,\n PerimeterXRequest,\n PerimeterXSolution,\n RecaptchaV3Request,\n RecaptchaV3Solution,\n Reese84Request,\n Reese84Solution,\n SBSDRequest,\n SBSDSolution,\n ShapeRequest,\n ShapeSolution,\n SolveResponse,\n TurnstileRequest,\n TurnstileSolution,\n VercelRequest,\n VercelSolution,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api2.gatsbie.io\";\nconst DEFAULT_TIMEOUT = 120000;\n\n/**\n * Gatsbie API client.\n *\n * @example\n * ```typescript\n * const client = new Client(\"gats_your_api_key\");\n *\n * const response = await client.solveTurnstile({\n * proxy: \"http://user:pass@proxy:8080\",\n * targetUrl: \"https://example.com\",\n * siteKey: \"0x4AAAAAAABS7TtLxsNa7Z2e\",\n * });\n *\n * console.log(response.solution.token);\n * ```\n */\nexport class Client {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n /**\n * Create a new Gatsbie API client.\n *\n * @param apiKey - Your Gatsbie API key (should start with 'gats_').\n * @param options - Optional client configuration.\n */\n constructor(apiKey: string, options: ClientOptions = {}) {\n this.apiKey = apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: Record<string, unknown>\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (!response.ok) {\n const error = (data.error as Record<string, unknown>) || {};\n throw new APIError({\n code: (error.code as string) || \"UNKNOWN\",\n message: (error.message as string) || \"Unknown error\",\n details: error.details as string | undefined,\n timestamp: error.timestamp as number | undefined,\n httpStatus: response.status,\n });\n }\n\n return data as T;\n } catch (err) {\n if (err instanceof APIError) {\n throw err;\n }\n if (err instanceof Error) {\n if (err.name === \"AbortError\") {\n throw new RequestError(\"Request timed out\", err);\n }\n throw new RequestError(`Request failed: ${err.message}`, err);\n }\n throw new RequestError(\"Request failed\");\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // ========================================================================\n // API Methods\n // ========================================================================\n\n /**\n * Check the API server health status.\n */\n async health(): Promise<HealthResponse> {\n return this.request<HealthResponse>(\"GET\", \"/health\");\n }\n\n /**\n * Solve a Datadome device check challenge.\n */\n async solveDatadome(\n request: DatadomeRequest\n ): Promise<SolveResponse<DatadomeSolution>> {\n const body = {\n task_type: \"datadome-device-check\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-device-check\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a reCAPTCHA v3 challenge.\n */\n async solveRecaptchaV3(\n request: RecaptchaV3Request\n ): Promise<SolveResponse<RecaptchaV3Solution>> {\n const body: Record<string, unknown> = {\n task_type: \"recaptchav3\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n if (request.action) body.action = request.action;\n if (request.title) body.title = request.title;\n if (request.enterprise) body.enterprise = request.enterprise;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/recaptchav3\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Akamai bot management challenge.\n */\n async solveAkamai(\n request: AkamaiRequest\n ): Promise<SolveResponse<AkamaiSolution>> {\n const body: Record<string, unknown> = {\n task_type: \"akamai\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n akamai_js_url: request.akamaiJsUrl,\n };\n if (request.pageFp) body.page_fp = request.pageFp;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n cookies_dict: {\n _abck: string;\n bm_sz: string;\n Country?: string;\n UsrLocale?: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/akamai\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n abck: data.solution.cookies_dict._abck,\n bmSz: data.solution.cookies_dict.bm_sz,\n country: data.solution.cookies_dict.Country,\n usrLocale: data.solution.cookies_dict.UsrLocale,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Vercel bot protection challenge.\n */\n async solveVercel(\n request: VercelRequest\n ): Promise<SolveResponse<VercelSolution>> {\n const body = {\n task_type: \"vercel\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { _vcrcs: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/vercel\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n vcrcs: data.solution._vcrcs,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Shape antibot challenge.\n */\n async solveShape(\n request: ShapeRequest\n ): Promise<SolveResponse<ShapeSolution>> {\n const body = {\n task_type: \"shape\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_api: request.targetApi,\n shape_js_url: request.shapeJsUrl,\n title: request.title,\n method: request.method,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: Record<string, string>;\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/shape\", body);\n\n // Shape returns dynamic headers, extract User-Agent separately\n const { \"User-Agent\": userAgent, ...headers } = data.solution;\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n headers,\n userAgent: userAgent || \"\",\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare Turnstile challenge.\n */\n async solveTurnstile(\n request: TurnstileRequest\n ): Promise<SolveResponse<TurnstileSolution>> {\n const body = {\n task_type: \"turnstile\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/turnstile\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a PerimeterX Invisible challenge.\n */\n async solvePerimeterX(\n request: PerimeterXRequest\n ): Promise<SolveResponse<PerimeterXSolution>> {\n const body = {\n task_type: \"perimeterx_invisible\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n perimeterx_js_url: request.perimeterxJsUrl,\n pxAppId: request.pxAppId,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n perimeterx_cookies: {\n _px3: string;\n _pxde: string;\n _pxvid: string;\n pxcts: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/perimeterx-invisible\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n px3: data.solution.perimeterx_cookies._px3,\n pxde: data.solution.perimeterx_cookies._pxde,\n pxvid: data.solution.perimeterx_cookies._pxvid,\n pxcts: data.solution.perimeterx_cookies.pxcts,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare WAF challenge.\n */\n async solveCloudflareWAF(\n request: CloudflareWAFRequest\n ): Promise<SolveResponse<CloudflareWAFSolution>> {\n const body = {\n task_type: \"cloudflare_waf\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n cookies: {\n cf_clearance: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/cloudflare-waf\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n cfClearance: data.solution.cookies.cf_clearance,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Datadome Slider CAPTCHA challenge.\n */\n async solveDatadomeSlider(\n request: DatadomeSliderRequest\n ): Promise<SolveResponse<DatadomeSliderSolution>> {\n const body = {\n task_type: \"datadome-slider\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-slider\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a CaptchaFox challenge.\n */\n async solveCaptchaFox(\n request: CaptchaFoxRequest\n ): Promise<SolveResponse<CaptchaFoxSolution>> {\n const body = {\n task_type: \"captchafox\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { cookie: { bm_s: string; bm_sc: string }; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/captchafox\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookie: {\n bmS: data.solution.cookie.bm_s,\n bmSc: data.solution.cookie.bm_sc,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Castle challenge.\n */\n async solveCastle(\n request: CastleRequest\n ): Promise<SolveResponse<CastleSolution>> {\n const body = {\n task_type: \"castle\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n config_json: {\n avoidCookies: request.configJson.avoidCookies,\n pk: request.configJson.pk,\n wUrl: request.configJson.wUrl,\n swUrl: request.configJson.swUrl,\n },\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/castle\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Incapsula Reese84 challenge.\n */\n async solveReese84(\n request: Reese84Request\n ): Promise<SolveResponse<Reese84Solution>> {\n const body = {\n task_type: \"reese84\",\n proxy: request.proxy,\n reese84_js_url: request.reese84JsUrl,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { reese84: string; user_agent: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/reese84\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n reese84: data.solution.reese84,\n userAgent: data.solution.user_agent,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Forter challenge.\n */\n async solveForter(\n request: ForterRequest\n ): Promise<SolveResponse<ForterSolution>> {\n const body = {\n task_type: \"forter\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n forter_js_url: request.forterJsUrl,\n site_id: request.siteId,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/forter\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Funcaptcha (Arkose Labs) challenge.\n */\n async solveFuncaptcha(\n request: FuncaptchaRequest\n ): Promise<SolveResponse<FuncaptchaSolution>> {\n const body = {\n task_type: \"funcaptcha\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n custom_api_host: request.customApiHost,\n public_key: request.publicKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/funcaptcha\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Akamai SBSD challenge.\n */\n async solveSBSD(request: SBSDRequest): Promise<SolveResponse<SBSDSolution>> {\n const body = {\n task_type: \"sbsd\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { bm_s: string; bm_sc: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/sbsd\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n bmS: data.solution.bm_s,\n bmSc: data.solution.bm_sc,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -196,11 +196,13 @@ var Client = class {
|
|
|
196
196
|
taskId: data.taskId,
|
|
197
197
|
service: data.service,
|
|
198
198
|
solution: {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
199
|
+
cookies: {
|
|
200
|
+
abck: data.solution.cookies_dict._abck,
|
|
201
|
+
bmSz: data.solution.cookies_dict.bm_sz,
|
|
202
|
+
country: data.solution.cookies_dict.Country,
|
|
203
|
+
usrLocale: data.solution.cookies_dict.UsrLocale
|
|
204
|
+
},
|
|
205
|
+
userAgent: data.solution.ua
|
|
204
206
|
},
|
|
205
207
|
cost: data.cost,
|
|
206
208
|
solveTime: data.solveTime
|
|
@@ -242,14 +244,14 @@ var Client = class {
|
|
|
242
244
|
method: request.method
|
|
243
245
|
};
|
|
244
246
|
const data = await this.request("POST", "/v1/solve/shape", body);
|
|
245
|
-
const {
|
|
247
|
+
const { "User-Agent": userAgent, ...headers } = data.solution;
|
|
246
248
|
return {
|
|
247
249
|
success: data.success,
|
|
248
250
|
taskId: data.taskId,
|
|
249
251
|
service: data.service,
|
|
250
252
|
solution: {
|
|
251
253
|
headers,
|
|
252
|
-
userAgent:
|
|
254
|
+
userAgent: userAgent || ""
|
|
253
255
|
},
|
|
254
256
|
cost: data.cost,
|
|
255
257
|
solveTime: data.solveTime
|
|
@@ -323,7 +325,9 @@ var Client = class {
|
|
|
323
325
|
taskId: data.taskId,
|
|
324
326
|
service: data.service,
|
|
325
327
|
solution: {
|
|
326
|
-
|
|
328
|
+
cookies: {
|
|
329
|
+
cfClearance: data.solution.cookies.cf_clearance
|
|
330
|
+
},
|
|
327
331
|
userAgent: data.solution.ua
|
|
328
332
|
},
|
|
329
333
|
cost: data.cost,
|
|
@@ -353,6 +357,154 @@ var Client = class {
|
|
|
353
357
|
solveTime: data.solveTime
|
|
354
358
|
};
|
|
355
359
|
}
|
|
360
|
+
/**
|
|
361
|
+
* Solve a CaptchaFox challenge.
|
|
362
|
+
*/
|
|
363
|
+
async solveCaptchaFox(request) {
|
|
364
|
+
const body = {
|
|
365
|
+
task_type: "captchafox",
|
|
366
|
+
proxy: request.proxy,
|
|
367
|
+
target_url: request.targetUrl,
|
|
368
|
+
site_key: request.siteKey
|
|
369
|
+
};
|
|
370
|
+
const data = await this.request("POST", "/v1/solve/captchafox", body);
|
|
371
|
+
return {
|
|
372
|
+
success: data.success,
|
|
373
|
+
taskId: data.taskId,
|
|
374
|
+
service: data.service,
|
|
375
|
+
solution: {
|
|
376
|
+
cookie: {
|
|
377
|
+
bmS: data.solution.cookie.bm_s,
|
|
378
|
+
bmSc: data.solution.cookie.bm_sc
|
|
379
|
+
},
|
|
380
|
+
userAgent: data.solution.ua
|
|
381
|
+
},
|
|
382
|
+
cost: data.cost,
|
|
383
|
+
solveTime: data.solveTime
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Solve a Castle challenge.
|
|
388
|
+
*/
|
|
389
|
+
async solveCastle(request) {
|
|
390
|
+
const body = {
|
|
391
|
+
task_type: "castle",
|
|
392
|
+
proxy: request.proxy,
|
|
393
|
+
target_url: request.targetUrl,
|
|
394
|
+
config_json: {
|
|
395
|
+
avoidCookies: request.configJson.avoidCookies,
|
|
396
|
+
pk: request.configJson.pk,
|
|
397
|
+
wUrl: request.configJson.wUrl,
|
|
398
|
+
swUrl: request.configJson.swUrl
|
|
399
|
+
}
|
|
400
|
+
};
|
|
401
|
+
const data = await this.request("POST", "/v1/solve/castle", body);
|
|
402
|
+
return {
|
|
403
|
+
success: data.success,
|
|
404
|
+
taskId: data.taskId,
|
|
405
|
+
service: data.service,
|
|
406
|
+
solution: {
|
|
407
|
+
token: data.solution.token,
|
|
408
|
+
userAgent: data.solution.ua
|
|
409
|
+
},
|
|
410
|
+
cost: data.cost,
|
|
411
|
+
solveTime: data.solveTime
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Solve an Incapsula Reese84 challenge.
|
|
416
|
+
*/
|
|
417
|
+
async solveReese84(request) {
|
|
418
|
+
const body = {
|
|
419
|
+
task_type: "reese84",
|
|
420
|
+
proxy: request.proxy,
|
|
421
|
+
reese84_js_url: request.reese84JsUrl
|
|
422
|
+
};
|
|
423
|
+
const data = await this.request("POST", "/v1/solve/reese84", body);
|
|
424
|
+
return {
|
|
425
|
+
success: data.success,
|
|
426
|
+
taskId: data.taskId,
|
|
427
|
+
service: data.service,
|
|
428
|
+
solution: {
|
|
429
|
+
reese84: data.solution.reese84,
|
|
430
|
+
userAgent: data.solution.user_agent
|
|
431
|
+
},
|
|
432
|
+
cost: data.cost,
|
|
433
|
+
solveTime: data.solveTime
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Solve a Forter challenge.
|
|
438
|
+
*/
|
|
439
|
+
async solveForter(request) {
|
|
440
|
+
const body = {
|
|
441
|
+
task_type: "forter",
|
|
442
|
+
proxy: request.proxy,
|
|
443
|
+
target_url: request.targetUrl,
|
|
444
|
+
forter_js_url: request.forterJsUrl,
|
|
445
|
+
site_id: request.siteId
|
|
446
|
+
};
|
|
447
|
+
const data = await this.request("POST", "/v1/solve/forter", body);
|
|
448
|
+
return {
|
|
449
|
+
success: data.success,
|
|
450
|
+
taskId: data.taskId,
|
|
451
|
+
service: data.service,
|
|
452
|
+
solution: {
|
|
453
|
+
token: data.solution.token,
|
|
454
|
+
userAgent: data.solution.ua
|
|
455
|
+
},
|
|
456
|
+
cost: data.cost,
|
|
457
|
+
solveTime: data.solveTime
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Solve a Funcaptcha (Arkose Labs) challenge.
|
|
462
|
+
*/
|
|
463
|
+
async solveFuncaptcha(request) {
|
|
464
|
+
const body = {
|
|
465
|
+
task_type: "funcaptcha",
|
|
466
|
+
proxy: request.proxy,
|
|
467
|
+
target_url: request.targetUrl,
|
|
468
|
+
custom_api_host: request.customApiHost,
|
|
469
|
+
public_key: request.publicKey
|
|
470
|
+
};
|
|
471
|
+
const data = await this.request("POST", "/v1/solve/funcaptcha", body);
|
|
472
|
+
return {
|
|
473
|
+
success: data.success,
|
|
474
|
+
taskId: data.taskId,
|
|
475
|
+
service: data.service,
|
|
476
|
+
solution: {
|
|
477
|
+
token: data.solution.token,
|
|
478
|
+
userAgent: data.solution.ua
|
|
479
|
+
},
|
|
480
|
+
cost: data.cost,
|
|
481
|
+
solveTime: data.solveTime
|
|
482
|
+
};
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Solve an Akamai SBSD challenge.
|
|
486
|
+
*/
|
|
487
|
+
async solveSBSD(request) {
|
|
488
|
+
const body = {
|
|
489
|
+
task_type: "sbsd",
|
|
490
|
+
proxy: request.proxy,
|
|
491
|
+
target_url: request.targetUrl,
|
|
492
|
+
target_method: request.targetMethod
|
|
493
|
+
};
|
|
494
|
+
const data = await this.request("POST", "/v1/solve/sbsd", body);
|
|
495
|
+
return {
|
|
496
|
+
success: data.success,
|
|
497
|
+
taskId: data.taskId,
|
|
498
|
+
service: data.service,
|
|
499
|
+
solution: {
|
|
500
|
+
bmS: data.solution.bm_s,
|
|
501
|
+
bmSc: data.solution.bm_sc,
|
|
502
|
+
userAgent: data.solution.ua
|
|
503
|
+
},
|
|
504
|
+
cost: data.cost,
|
|
505
|
+
solveTime: data.solveTime
|
|
506
|
+
};
|
|
507
|
+
}
|
|
356
508
|
};
|
|
357
509
|
export {
|
|
358
510
|
APIError,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/client.ts"],"sourcesContent":["/**\n * Error codes returned by the Gatsbie API.\n */\nexport const ErrorCode = {\n AUTH_FAILED: \"AUTH_FAILED\",\n INSUFFICIENT_CREDITS: \"INSUFFICIENT_CREDITS\",\n INVALID_REQUEST: \"INVALID_REQUEST\",\n UPSTREAM_ERROR: \"UPSTREAM_ERROR\",\n SOLVE_FAILED: \"SOLVE_FAILED\",\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\n/**\n * Base error class for Gatsbie SDK errors.\n */\nexport class GatsbieError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GatsbieError\";\n Object.setPrototypeOf(this, GatsbieError.prototype);\n }\n}\n\n/**\n * Error thrown when the Gatsbie API returns an error response.\n */\nexport class APIError extends GatsbieError {\n readonly code: string;\n readonly details?: string;\n readonly timestamp?: number;\n readonly httpStatus?: number;\n\n constructor(options: {\n code: string;\n message: string;\n details?: string;\n timestamp?: number;\n httpStatus?: number;\n }) {\n const msg = options.details\n ? `gatsbie: ${options.code}: ${options.message} (${options.details})`\n : `gatsbie: ${options.code}: ${options.message}`;\n super(msg);\n this.name = \"APIError\";\n this.code = options.code;\n this.details = options.details;\n this.timestamp = options.timestamp;\n this.httpStatus = options.httpStatus;\n Object.setPrototypeOf(this, APIError.prototype);\n }\n\n /** Check if this is an authentication error. */\n isAuthError(): boolean {\n return this.code === ErrorCode.AUTH_FAILED;\n }\n\n /** Check if this error is due to insufficient credits. */\n isInsufficientCredits(): boolean {\n return this.code === ErrorCode.INSUFFICIENT_CREDITS;\n }\n\n /** Check if this error is due to an invalid request. */\n isInvalidRequest(): boolean {\n return this.code === ErrorCode.INVALID_REQUEST;\n }\n\n /** Check if this error is from an upstream service. */\n isUpstreamError(): boolean {\n return this.code === ErrorCode.UPSTREAM_ERROR;\n }\n\n /** Check if the captcha solving failed. */\n isSolveFailed(): boolean {\n return this.code === ErrorCode.SOLVE_FAILED;\n }\n\n /** Check if this is an internal server error. */\n isInternalError(): boolean {\n return this.code === ErrorCode.INTERNAL_ERROR;\n }\n}\n\n/**\n * Error thrown when a request fails (network error, timeout, etc.).\n */\nexport class RequestError extends GatsbieError {\n constructor(message: string, public readonly cause?: Error) {\n super(message);\n this.name = \"RequestError\";\n Object.setPrototypeOf(this, RequestError.prototype);\n }\n}\n","import { APIError, RequestError } from \"./errors\";\nimport type {\n AkamaiRequest,\n AkamaiSolution,\n ClientOptions,\n CloudflareWAFRequest,\n CloudflareWAFSolution,\n DatadomeRequest,\n DatadomeSliderRequest,\n DatadomeSliderSolution,\n DatadomeSolution,\n HealthResponse,\n PerimeterXRequest,\n PerimeterXSolution,\n RecaptchaV3Request,\n RecaptchaV3Solution,\n ShapeRequest,\n ShapeSolution,\n SolveResponse,\n TurnstileRequest,\n TurnstileSolution,\n VercelRequest,\n VercelSolution,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api2.gatsbie.io\";\nconst DEFAULT_TIMEOUT = 120000;\n\n/**\n * Gatsbie API client.\n *\n * @example\n * ```typescript\n * const client = new Client(\"gats_your_api_key\");\n *\n * const response = await client.solveTurnstile({\n * proxy: \"http://user:pass@proxy:8080\",\n * targetUrl: \"https://example.com\",\n * siteKey: \"0x4AAAAAAABS7TtLxsNa7Z2e\",\n * });\n *\n * console.log(response.solution.token);\n * ```\n */\nexport class Client {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n /**\n * Create a new Gatsbie API client.\n *\n * @param apiKey - Your Gatsbie API key (should start with 'gats_').\n * @param options - Optional client configuration.\n */\n constructor(apiKey: string, options: ClientOptions = {}) {\n this.apiKey = apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: Record<string, unknown>\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (!response.ok) {\n const error = (data.error as Record<string, unknown>) || {};\n throw new APIError({\n code: (error.code as string) || \"UNKNOWN\",\n message: (error.message as string) || \"Unknown error\",\n details: error.details as string | undefined,\n timestamp: error.timestamp as number | undefined,\n httpStatus: response.status,\n });\n }\n\n return data as T;\n } catch (err) {\n if (err instanceof APIError) {\n throw err;\n }\n if (err instanceof Error) {\n if (err.name === \"AbortError\") {\n throw new RequestError(\"Request timed out\", err);\n }\n throw new RequestError(`Request failed: ${err.message}`, err);\n }\n throw new RequestError(\"Request failed\");\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // ========================================================================\n // API Methods\n // ========================================================================\n\n /**\n * Check the API server health status.\n */\n async health(): Promise<HealthResponse> {\n return this.request<HealthResponse>(\"GET\", \"/health\");\n }\n\n /**\n * Solve a Datadome device check challenge.\n */\n async solveDatadome(\n request: DatadomeRequest\n ): Promise<SolveResponse<DatadomeSolution>> {\n const body = {\n task_type: \"datadome-device-check\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-device-check\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a reCAPTCHA v3 challenge.\n */\n async solveRecaptchaV3(\n request: RecaptchaV3Request\n ): Promise<SolveResponse<RecaptchaV3Solution>> {\n const body: Record<string, unknown> = {\n task_type: \"recaptchav3\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n if (request.action) body.action = request.action;\n if (request.title) body.title = request.title;\n if (request.enterprise) body.enterprise = request.enterprise;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/recaptchav3\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Akamai bot management challenge.\n */\n async solveAkamai(\n request: AkamaiRequest\n ): Promise<SolveResponse<AkamaiSolution>> {\n const body: Record<string, unknown> = {\n task_type: \"akamai\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n akamai_js_url: request.akamaiJsUrl,\n };\n if (request.pageFp) body.page_fp = request.pageFp;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n _abck: string;\n bm_sz: string;\n ua: string;\n Country?: string;\n UsrLocale?: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/akamai\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n abck: data.solution._abck,\n bmSz: data.solution.bm_sz,\n userAgent: data.solution.ua,\n country: data.solution.Country,\n usrLocale: data.solution.UsrLocale,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Vercel bot protection challenge.\n */\n async solveVercel(\n request: VercelRequest\n ): Promise<SolveResponse<VercelSolution>> {\n const body = {\n task_type: \"vercel\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { _vcrcs: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/vercel\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n vcrcs: data.solution._vcrcs,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Shape antibot challenge.\n */\n async solveShape(\n request: ShapeRequest\n ): Promise<SolveResponse<ShapeSolution>> {\n const body = {\n task_type: \"shape\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_api: request.targetApi,\n shape_js_url: request.shapeJsUrl,\n title: request.title,\n method: request.method,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: Record<string, string>;\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/shape\", body);\n\n // Shape returns dynamic headers, extract ua separately\n const { ua, ...headers } = data.solution;\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n headers,\n userAgent: ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare Turnstile challenge.\n */\n async solveTurnstile(\n request: TurnstileRequest\n ): Promise<SolveResponse<TurnstileSolution>> {\n const body = {\n task_type: \"turnstile\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/turnstile\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a PerimeterX Invisible challenge.\n */\n async solvePerimeterX(\n request: PerimeterXRequest\n ): Promise<SolveResponse<PerimeterXSolution>> {\n const body = {\n task_type: \"perimeterx_invisible\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n perimeterx_js_url: request.perimeterxJsUrl,\n pxAppId: request.pxAppId,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n perimeterx_cookies: {\n _px3: string;\n _pxde: string;\n _pxvid: string;\n pxcts: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/perimeterx-invisible\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n px3: data.solution.perimeterx_cookies._px3,\n pxde: data.solution.perimeterx_cookies._pxde,\n pxvid: data.solution.perimeterx_cookies._pxvid,\n pxcts: data.solution.perimeterx_cookies.pxcts,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare WAF challenge.\n */\n async solveCloudflareWAF(\n request: CloudflareWAFRequest\n ): Promise<SolveResponse<CloudflareWAFSolution>> {\n const body = {\n task_type: \"cloudflare_waf\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { cf_clearance: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/cloudflare-waf\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cfClearance: data.solution.cf_clearance,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Datadome Slider CAPTCHA challenge.\n */\n async solveDatadomeSlider(\n request: DatadomeSliderRequest\n ): Promise<SolveResponse<DatadomeSliderSolution>> {\n const body = {\n task_type: \"datadome-slider\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-slider\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/client.ts"],"sourcesContent":["/**\n * Error codes returned by the Gatsbie API.\n */\nexport const ErrorCode = {\n AUTH_FAILED: \"AUTH_FAILED\",\n INSUFFICIENT_CREDITS: \"INSUFFICIENT_CREDITS\",\n INVALID_REQUEST: \"INVALID_REQUEST\",\n UPSTREAM_ERROR: \"UPSTREAM_ERROR\",\n SOLVE_FAILED: \"SOLVE_FAILED\",\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\n/**\n * Base error class for Gatsbie SDK errors.\n */\nexport class GatsbieError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GatsbieError\";\n Object.setPrototypeOf(this, GatsbieError.prototype);\n }\n}\n\n/**\n * Error thrown when the Gatsbie API returns an error response.\n */\nexport class APIError extends GatsbieError {\n readonly code: string;\n readonly details?: string;\n readonly timestamp?: number;\n readonly httpStatus?: number;\n\n constructor(options: {\n code: string;\n message: string;\n details?: string;\n timestamp?: number;\n httpStatus?: number;\n }) {\n const msg = options.details\n ? `gatsbie: ${options.code}: ${options.message} (${options.details})`\n : `gatsbie: ${options.code}: ${options.message}`;\n super(msg);\n this.name = \"APIError\";\n this.code = options.code;\n this.details = options.details;\n this.timestamp = options.timestamp;\n this.httpStatus = options.httpStatus;\n Object.setPrototypeOf(this, APIError.prototype);\n }\n\n /** Check if this is an authentication error. */\n isAuthError(): boolean {\n return this.code === ErrorCode.AUTH_FAILED;\n }\n\n /** Check if this error is due to insufficient credits. */\n isInsufficientCredits(): boolean {\n return this.code === ErrorCode.INSUFFICIENT_CREDITS;\n }\n\n /** Check if this error is due to an invalid request. */\n isInvalidRequest(): boolean {\n return this.code === ErrorCode.INVALID_REQUEST;\n }\n\n /** Check if this error is from an upstream service. */\n isUpstreamError(): boolean {\n return this.code === ErrorCode.UPSTREAM_ERROR;\n }\n\n /** Check if the captcha solving failed. */\n isSolveFailed(): boolean {\n return this.code === ErrorCode.SOLVE_FAILED;\n }\n\n /** Check if this is an internal server error. */\n isInternalError(): boolean {\n return this.code === ErrorCode.INTERNAL_ERROR;\n }\n}\n\n/**\n * Error thrown when a request fails (network error, timeout, etc.).\n */\nexport class RequestError extends GatsbieError {\n constructor(message: string, public readonly cause?: Error) {\n super(message);\n this.name = \"RequestError\";\n Object.setPrototypeOf(this, RequestError.prototype);\n }\n}\n","import { APIError, RequestError } from \"./errors\";\nimport type {\n AkamaiRequest,\n AkamaiSolution,\n CaptchaFoxRequest,\n CaptchaFoxSolution,\n CastleRequest,\n CastleSolution,\n ClientOptions,\n CloudflareWAFRequest,\n CloudflareWAFSolution,\n DatadomeRequest,\n DatadomeSliderRequest,\n DatadomeSliderSolution,\n DatadomeSolution,\n ForterRequest,\n ForterSolution,\n FuncaptchaRequest,\n FuncaptchaSolution,\n HealthResponse,\n PerimeterXRequest,\n PerimeterXSolution,\n RecaptchaV3Request,\n RecaptchaV3Solution,\n Reese84Request,\n Reese84Solution,\n SBSDRequest,\n SBSDSolution,\n ShapeRequest,\n ShapeSolution,\n SolveResponse,\n TurnstileRequest,\n TurnstileSolution,\n VercelRequest,\n VercelSolution,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api2.gatsbie.io\";\nconst DEFAULT_TIMEOUT = 120000;\n\n/**\n * Gatsbie API client.\n *\n * @example\n * ```typescript\n * const client = new Client(\"gats_your_api_key\");\n *\n * const response = await client.solveTurnstile({\n * proxy: \"http://user:pass@proxy:8080\",\n * targetUrl: \"https://example.com\",\n * siteKey: \"0x4AAAAAAABS7TtLxsNa7Z2e\",\n * });\n *\n * console.log(response.solution.token);\n * ```\n */\nexport class Client {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n /**\n * Create a new Gatsbie API client.\n *\n * @param apiKey - Your Gatsbie API key (should start with 'gats_').\n * @param options - Optional client configuration.\n */\n constructor(apiKey: string, options: ClientOptions = {}) {\n this.apiKey = apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: Record<string, unknown>\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (!response.ok) {\n const error = (data.error as Record<string, unknown>) || {};\n throw new APIError({\n code: (error.code as string) || \"UNKNOWN\",\n message: (error.message as string) || \"Unknown error\",\n details: error.details as string | undefined,\n timestamp: error.timestamp as number | undefined,\n httpStatus: response.status,\n });\n }\n\n return data as T;\n } catch (err) {\n if (err instanceof APIError) {\n throw err;\n }\n if (err instanceof Error) {\n if (err.name === \"AbortError\") {\n throw new RequestError(\"Request timed out\", err);\n }\n throw new RequestError(`Request failed: ${err.message}`, err);\n }\n throw new RequestError(\"Request failed\");\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // ========================================================================\n // API Methods\n // ========================================================================\n\n /**\n * Check the API server health status.\n */\n async health(): Promise<HealthResponse> {\n return this.request<HealthResponse>(\"GET\", \"/health\");\n }\n\n /**\n * Solve a Datadome device check challenge.\n */\n async solveDatadome(\n request: DatadomeRequest\n ): Promise<SolveResponse<DatadomeSolution>> {\n const body = {\n task_type: \"datadome-device-check\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-device-check\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a reCAPTCHA v3 challenge.\n */\n async solveRecaptchaV3(\n request: RecaptchaV3Request\n ): Promise<SolveResponse<RecaptchaV3Solution>> {\n const body: Record<string, unknown> = {\n task_type: \"recaptchav3\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n if (request.action) body.action = request.action;\n if (request.title) body.title = request.title;\n if (request.enterprise) body.enterprise = request.enterprise;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/recaptchav3\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Akamai bot management challenge.\n */\n async solveAkamai(\n request: AkamaiRequest\n ): Promise<SolveResponse<AkamaiSolution>> {\n const body: Record<string, unknown> = {\n task_type: \"akamai\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n akamai_js_url: request.akamaiJsUrl,\n };\n if (request.pageFp) body.page_fp = request.pageFp;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n cookies_dict: {\n _abck: string;\n bm_sz: string;\n Country?: string;\n UsrLocale?: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/akamai\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n abck: data.solution.cookies_dict._abck,\n bmSz: data.solution.cookies_dict.bm_sz,\n country: data.solution.cookies_dict.Country,\n usrLocale: data.solution.cookies_dict.UsrLocale,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Vercel bot protection challenge.\n */\n async solveVercel(\n request: VercelRequest\n ): Promise<SolveResponse<VercelSolution>> {\n const body = {\n task_type: \"vercel\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { _vcrcs: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/vercel\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n vcrcs: data.solution._vcrcs,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Shape antibot challenge.\n */\n async solveShape(\n request: ShapeRequest\n ): Promise<SolveResponse<ShapeSolution>> {\n const body = {\n task_type: \"shape\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_api: request.targetApi,\n shape_js_url: request.shapeJsUrl,\n title: request.title,\n method: request.method,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: Record<string, string>;\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/shape\", body);\n\n // Shape returns dynamic headers, extract User-Agent separately\n const { \"User-Agent\": userAgent, ...headers } = data.solution;\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n headers,\n userAgent: userAgent || \"\",\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare Turnstile challenge.\n */\n async solveTurnstile(\n request: TurnstileRequest\n ): Promise<SolveResponse<TurnstileSolution>> {\n const body = {\n task_type: \"turnstile\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/turnstile\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a PerimeterX Invisible challenge.\n */\n async solvePerimeterX(\n request: PerimeterXRequest\n ): Promise<SolveResponse<PerimeterXSolution>> {\n const body = {\n task_type: \"perimeterx_invisible\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n perimeterx_js_url: request.perimeterxJsUrl,\n pxAppId: request.pxAppId,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n perimeterx_cookies: {\n _px3: string;\n _pxde: string;\n _pxvid: string;\n pxcts: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/perimeterx-invisible\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n px3: data.solution.perimeterx_cookies._px3,\n pxde: data.solution.perimeterx_cookies._pxde,\n pxvid: data.solution.perimeterx_cookies._pxvid,\n pxcts: data.solution.perimeterx_cookies.pxcts,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare WAF challenge.\n */\n async solveCloudflareWAF(\n request: CloudflareWAFRequest\n ): Promise<SolveResponse<CloudflareWAFSolution>> {\n const body = {\n task_type: \"cloudflare_waf\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n cookies: {\n cf_clearance: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/cloudflare-waf\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n cfClearance: data.solution.cookies.cf_clearance,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Datadome Slider CAPTCHA challenge.\n */\n async solveDatadomeSlider(\n request: DatadomeSliderRequest\n ): Promise<SolveResponse<DatadomeSliderSolution>> {\n const body = {\n task_type: \"datadome-slider\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-slider\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a CaptchaFox challenge.\n */\n async solveCaptchaFox(\n request: CaptchaFoxRequest\n ): Promise<SolveResponse<CaptchaFoxSolution>> {\n const body = {\n task_type: \"captchafox\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { cookie: { bm_s: string; bm_sc: string }; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/captchafox\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookie: {\n bmS: data.solution.cookie.bm_s,\n bmSc: data.solution.cookie.bm_sc,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Castle challenge.\n */\n async solveCastle(\n request: CastleRequest\n ): Promise<SolveResponse<CastleSolution>> {\n const body = {\n task_type: \"castle\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n config_json: {\n avoidCookies: request.configJson.avoidCookies,\n pk: request.configJson.pk,\n wUrl: request.configJson.wUrl,\n swUrl: request.configJson.swUrl,\n },\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/castle\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Incapsula Reese84 challenge.\n */\n async solveReese84(\n request: Reese84Request\n ): Promise<SolveResponse<Reese84Solution>> {\n const body = {\n task_type: \"reese84\",\n proxy: request.proxy,\n reese84_js_url: request.reese84JsUrl,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { reese84: string; user_agent: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/reese84\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n reese84: data.solution.reese84,\n userAgent: data.solution.user_agent,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Forter challenge.\n */\n async solveForter(\n request: ForterRequest\n ): Promise<SolveResponse<ForterSolution>> {\n const body = {\n task_type: \"forter\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n forter_js_url: request.forterJsUrl,\n site_id: request.siteId,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/forter\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Funcaptcha (Arkose Labs) challenge.\n */\n async solveFuncaptcha(\n request: FuncaptchaRequest\n ): Promise<SolveResponse<FuncaptchaSolution>> {\n const body = {\n task_type: \"funcaptcha\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n custom_api_host: request.customApiHost,\n public_key: request.publicKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/funcaptcha\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Akamai SBSD challenge.\n */\n async solveSBSD(request: SBSDRequest): Promise<SolveResponse<SBSDSolution>> {\n const body = {\n task_type: \"sbsd\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { bm_s: string; bm_sc: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/sbsd\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n bmS: data.solution.bm_s,\n bmSc: data.solution.bm_sc,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n}\n"],"mappings":"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","names":[]}
|