Skip to content

Commit

Permalink
Merge pull request #12 from blackravenx/Capsolver
Browse files Browse the repository at this point in the history
Update package
  • Loading branch information
blackravenx committed May 12, 2024
2 parents b239c4c + 86cc66f commit 198d689
Show file tree
Hide file tree
Showing 38 changed files with 101 additions and 47 deletions.
23 changes: 11 additions & 12 deletions capsolver/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Docs: https://docs.capsolver.com

## Installation
Via [npm](https://www.npmjs.com/package/@captcha-libs/capsolver)
```npm i @captcha-libs/capsolver```
```$ npm i @captcha-libs/capsolver```
pnpm
```$ pnpm i @captcha-libs/capsolver```
yarn
Expand Down Expand Up @@ -62,7 +62,7 @@ const reCaptchaV3Request = new ReCaptchaV3EnterpriseTask({
websiteKey: "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
websiteURL: "https://www.google.com/recaptcha/api2/demo",

//------> You can send the proxy information with one of these proxy format, please read carefully
//You can send the proxy information with one of these proxy format, please read carefully

//pass proxy connection string
proxy: "socks5:192.191.100.10:4780:user:pwd",
Expand All @@ -79,10 +79,11 @@ const reCaptchaV3Request = new ReCaptchaV3EnterpriseTask({

```
### Features
* Supports all captcha types, solutions and methods from CapSolver docs (updated at Feb. 2024)
* Supports all captcha types, solutions and methods from CapSolver docs (updated at May 2024)
* TypeScript-first design
* Automatically waits for solution
* Fully tested task payloads
* Only one dependency (ofetch)

### Currently supported task payloads
What 'custom' does mean? Custom means that the parameters and solutions have been narrowed down from the official documentation from more general cases. However, you can still use classes strictly according to the official documentation.
Expand All @@ -100,18 +101,16 @@ What 'custom' does mean? Custom means that the parameters and solutions have bee
* Custom - [GeeTestV3Task | GeeTestV3TaskProxyLess](https://docs.capsolver.com/guide/captcha/Geetest.html)
* Custom - [GeeTestV4Task | GeeTestV4TaskProxyLess](https://docs.capsolver.com/guide/captcha/Geetest.html)
* [ReCaptchaV2Task | ReCaptchaV2EnterpriseTask | ReCaptchaV2TaskProxyLess | ReCaptchaV2EnterpriseTaskProxyLess](https://docs.capsolver.com/guide/captcha/ReCaptchaV2.html)
* [ReCaptchaV3Task | ReCaptchaV3EnterpriseTask | ReCaptchaV3TaskProxyLess | ReCaptchaV3EnterpriseTaskProxyLess | ReCaptchaV3M1TaskProxyLess](https://docs.capsolver.com/guide/captcha/ReCaptchaV3.html)
* [ReCaptchaV3Task | ReCaptchaV3EnterpriseTask | ReCaptchaV3TaskProxyLess | ReCaptchaV3EnterpriseTaskProxyLess | ~~DEPRECATED (ReCaptchaV3M1TaskProxyLess)~~](https://docs.capsolver.com/guide/captcha/ReCaptchaV3.html)
* [DatadomeSliderTask](https://docs.capsolver.com/guide/antibots/datadome.html)
* [AntiAwsWafTask | AntiAwsWafTaskProxyLess](https://docs.capsolver.com/guide/captcha/awsWaf.html)
* [AntiCyberSiAraTask | AntiCyberSiAraTaskProxyLess](https://docs.capsolver.com/guide/captcha/CyberSiara.html)
* DEPRECATED ~~[AntiCyberSiAraTask | AntiCyberSiAraTaskProxyLess](https://docs.capsolver.com/guide/captcha/CyberSiara.html)~~
* [AntiImpervaTask | AntiImpervaTaskProxyLess](https://docs.capsolver.com/guide/antibots/imperva.html)
* [AntiCloudflareTurnstileTask](https://docs.capsolver.com/guide/antibots/cloudflare_turnstile.html)
* [AntiCloudflareChallengeTask](https://docs.capsolver.com/guide/antibots/cloudflare_challenge.html)
* [AntiAkamaiBMPTask](https://docs.capsolver.com/guide/antibots/akamaibmp.html)
* Custom - [AntiAkamaiPowTask](https://docs.capsolver.com/guide/antibots/akamaibmp.html)
* Custom - [AntiAkamaiSensorTask](https://docs.capsolver.com/guide/antibots/akamaibmp.html)
* [AntiAkamaiWebTask](https://docs.capsolver.com/guide/antibots/akamaiweb.html)
* DEPRECATED. ~~[AntiAkamaiBMPTask](https://docs.capsolver.com/guide/antibots/akamaibmp.html)~~
* DEPRECATED. ~~Custom - [AntiAkamaiPowTask](https://docs.capsolver.com/guide/antibots/akamaibmp.html)~~
* DEPRECATED. ~~Custom - [AntiAkamaiSensorTask](https://docs.capsolver.com/guide/antibots/akamaibmp.html)~~
* DEPRECATED ~~[AntiAkamaiWebTask](https://docs.capsolver.com/guide/antibots/akamaiweb.html)~~




~~DEPRECATED~~ = task type removed from service support, but you can still try to send task
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export class FunCaptchaClassification extends BaseTask implements FunCaptchaClas
* @param {Object} params - ImageToTextParams
* @param {string} [params.question] - Question name. this param value from API response game_variant field. Exmaple: maze,maze2,flockCompass,3d_rollball_animals
* @param {string} [params.images] - Base64 encoded image, can be a screenshot (pass only the hexagonal image, do not pass the rest of the content)
* @param {string} [params.module] - module name {@link https://docs.capsolver.com/guide/recognition/FunCaptchaClassification.html}
* @param {string} [params.module] - module name {@see https://docs.capsolver.com/guide/recognition/FunCaptchaClassification.html}
* @param {string} [params.websiteURL] - Page source url to improve accuracy
* @param {string} [params.websiteKey] - Website key to improve accuracy
*/
Expand Down
5 changes: 3 additions & 2 deletions capsolver/src/lib/Requests/Classification/ImageToTextTask.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ const _ImageToTextModules = [
"queue-it",
"webde-imap",
"webde-login",
"webde-register"
"webde-register",
"module001"
] as const;

type ImageToTextModules = typeof _ImageToTextModules[number];
Expand Down Expand Up @@ -75,7 +76,7 @@ export class ImageToTextTask extends BaseTask implements ImageToTextParams, _IsT

/**
* @type {ImageToTextModules=} module - Specifies the module. Currently, the supported modules are common and queueit
* {@link https://docs.capsolver.com/guide/recognition/ImageToTextTask.html}
* {@see https://docs.capsolver.com/guide/recognition/ImageToTextTask.html}
*/
module?: ImageToTextModules;

Expand Down
1 change: 1 addition & 0 deletions capsolver/src/lib/Requests/Token/AntiAkamaiBMPTask.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ export interface AntiAkamaiBMPTaskParams {
* @class
* @extends {AntiAkamaiBMPTaskBase}
* {@link https://docs.capsolver.com/guide/antibots/akamaibmp.html}
* @deprecated deleted from service support
*/
export class AntiAkamaiBMPTask extends BaseTask implements AntiAkamaiBMPTaskParams, _IsTaskType {

Expand Down
1 change: 1 addition & 0 deletions capsolver/src/lib/Requests/Token/AntiAkamaiPowTask.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ type AntiAkamaiPowTaskParams = Required<Pick<AntiAkamaiBMPTaskParams, "deviceId"
* @class
* @extends {BaseTask}
* {@link https://docs.capsolver.com/guide/antibots/akamaibmp.html}
* @deprecated deleted from service support
*/
export class AntiAkamaiPowTask extends BaseTask implements AntiAkamaiPowTaskParams, _IsTaskType {

Expand Down
1 change: 1 addition & 0 deletions capsolver/src/lib/Requests/Token/AntiAkamaiSensorTask.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ type AntiAkamaiSensorTaskParams = Omit<AntiAkamaiBMPTaskParams, "pow"> & Require
* @class
* @extends {BaseTask}
* {@link https://docs.capsolver.com/guide/antibots/akamaibmp.html}
* @deprecated deleted from service support
*/
export class AntiAkamaiSensorTask extends BaseTask implements AntiAkamaiSensorTaskParams, _IsTaskType {

Expand Down
1 change: 1 addition & 0 deletions capsolver/src/lib/Requests/Token/AntiAkamaiWebTask.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ type AntiAkamaiWebTaskParams ={
* @class
* @extends {AntiAkamaiWebTaskBase}
* {@link https://docs.capsolver.com/guide/antibots/akamaibmp.html}
* @deprecated deleted from service support
*/
export class AntiAkamaiWebTask extends BaseTask implements AntiAkamaiWebTaskParams, _IsTaskType {

Expand Down
10 changes: 1 addition & 9 deletions capsolver/src/lib/Requests/Token/AntiAwsWafTask.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,4 @@ export class AntiAwsWafTask extends AntiAwsWafTaskBase implements _IsTaskType {
constructor(params: AntiAwsWafTaskParams) {
super(params, "AntiAwsWafTask");
}
}
new AntiAwsWafTask({

// proxy: "",
proxyAddress: "",
proxyPort: 14,
proxyType: "http",
websiteURL: ""
});
}
1 change: 1 addition & 0 deletions capsolver/src/lib/Requests/Token/AntiCyberSiAraTask.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ type AntiCyberSiAraTaskParams = ProxyRequiredTaskParams<AntiCyberSiAraTaskBasePa
* @class
* @extends {AntiCyberSiAraTaskBase}
* {@link https://docs.capsolver.com/guide/captcha/CyberSiara.html}
* @deprecated deleted from service support
*/
export class AntiCyberSiAraTask extends AntiCyberSiAraTaskBase implements _IsTaskType {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ type AntiCyberSiAraTaskProxyLessParams = ProxylessTaskParams<AntiCyberSiAraTaskB
* @class
* @extends {AntiCyberSiAraTaskBase}
* {@link https://docs.capsolver.com/guide/captcha/CyberSiara.html}
* @deprecated deleted from service support
*/
export class AntiCyberSiAraTaskProxyLess extends AntiCyberSiAraTaskBase implements _IsTaskType {

Expand Down
10 changes: 1 addition & 9 deletions capsolver/src/lib/Requests/Token/Base/_FunCaptchaBase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { BaseTask } from "../../_BaseTaskRequest";

export type FunCaptchaTaskBaseParams = Partial<ProxyCredentials> & {
data?: string;
funcaptchaApiJSSubdomain?: string;
proxy?: string;
websitePublicKey: string;
websiteURL: string;
Expand All @@ -26,7 +25,6 @@ export abstract class FunCaptchaTaskBase extends BaseTask implements FunCaptchaT
* @param {object} params - FunCaptchaTaskParams
* @param {string} [params.websiteURL] - Web address of the website using funcaptcha, generally it's fixed value. (Ex: https://google.com)
* @param {string} [params.websitePublicKey] - The domain public key, rarely updated. (Ex: E8A75615-1CBA-5DFF-8031-D16BCF234E10)
* @param {string} [param.funcaptchaApiJSSubdomain] - A special subdomain of funcaptcha.com, from which the JS captcha widget should be loaded. Most FunCaptcha installations work from shared domains.
* @param {string} [params.data] - Additional parameter that may be required by FunCaptcha implementation. Use this property to send "blob" value as a stringified array. See example how it may look like. {"\blob":"HERE_COMES_THE_blob_VALUE"} Learn how to get FunCaptcha blob data
* @param {string} [params.proxy] - proxy
* @param {string} [params.proxyAddress] - proxyAddress
Expand All @@ -36,14 +34,13 @@ export abstract class FunCaptchaTaskBase extends BaseTask implements FunCaptchaT
* @param {string} [params.proxyType] - proxyType
*/
constructor({
websiteURL, proxy, websitePublicKey, data, funcaptchaApiJSSubdomain, proxyAddress, proxyPort, proxyType, proxyLogin, proxyPassword
websiteURL, proxy, websitePublicKey, data, proxyAddress, proxyPort, proxyType, proxyLogin, proxyPassword
}: FunCaptchaTaskBaseParams, type: TaskTypes) {
super({ type });
this.websiteURL = websiteURL;
this.proxy = proxy;
this.websitePublicKey = websitePublicKey;
this.data = data;
this.funcaptchaApiJSSubdomain = funcaptchaApiJSSubdomain;
this.proxyAddress = proxyAddress;
this.proxyLogin = proxyLogin;
this.proxyPort = proxyPort;
Expand All @@ -56,11 +53,6 @@ export abstract class FunCaptchaTaskBase extends BaseTask implements FunCaptchaT
*/
websitePublicKey: string;

/**
* @type {string} funcaptchaApiJSSubdomain - A special subdomain of funcaptcha.com, from which the JS captcha widget should be loaded. Most FunCaptcha installations work from shared domains.
*/
funcaptchaApiJSSubdomain?: string;

/**
* @type {string} data - Additional parameter that may be required by FunCaptcha implementation. Use this property to send "blob" value as a stringified array. See example how it may look like. {"\blob":"HERE_COMES_THE_blob_VALUE"} Learn how to get FunCaptcha blob data
*/
Expand Down
5 changes: 4 additions & 1 deletion capsolver/src/lib/Requests/Token/Base/_HCaptchaTaskBase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { BaseTask } from "../../_BaseTaskRequest";

export type HCaptchaTaskBaseParams = Partial<ProxyCredentials> & {
enterprisePayload?: Record<string, string>;
getCaptcha?: unknown;
isInvisible?: boolean;
proxy?: string;
userAgent?: string;
Expand Down Expand Up @@ -37,7 +38,7 @@ export abstract class HCaptchaTaskBase extends BaseTask implements HCaptchaTaskB
* @param {string} [params.proxyType] - proxyType
*/
constructor({
isInvisible = false, websiteKey, websiteURL, proxy, enterprisePayload, userAgent, proxyAddress, proxyPort, proxyType, proxyLogin, proxyPassword
isInvisible = false, websiteKey, websiteURL, proxy, enterprisePayload, userAgent, proxyAddress, proxyPort, proxyType, proxyLogin, proxyPassword, getCaptcha
}: HCaptchaTaskBaseParams, type: TaskTypes) {
super({ type });
this.websiteKey = websiteKey;
Expand All @@ -51,6 +52,7 @@ export abstract class HCaptchaTaskBase extends BaseTask implements HCaptchaTaskB
this.proxyPort = proxyPort;
this.proxyType = proxyType;
this.proxyPassword = proxyPassword;
this.getCaptcha = getCaptcha;
}

/**
Expand Down Expand Up @@ -87,4 +89,5 @@ export abstract class HCaptchaTaskBase extends BaseTask implements HCaptchaTaskB
proxyPassword?: string;
proxyPort?: number;
proxyType?: ProxyCredentials["proxyType"];
getCaptcha?: unknown;
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ export class FunCaptchaTaskProxyLess extends FunCaptchaTaskBase implements _IsTa
* @param {object} params - FunCaptchaTaskProxyLessParams
* @param {string} [params.websiteURL] - Web address of the website using funcaptcha, generally it's fixed value. (Ex: https://google.com)
* @param {string} [params.websitePublicKey] - The domain public key, rarely updated. (Ex: E8A75615-1CBA-5DFF-8031-D16BCF234E10)
* @param {string} [param.funcaptchaApiJSSubdomain] - A special subdomain of funcaptcha.com, from which the JS captcha widget should be loaded. Most FunCaptcha installations work from shared domains.
* @param {string} [params.data] - Additional parameter that may be required by FunCaptcha implementation. Use this property to send "blob" value as a stringified array. See example how it may look like. {"\blob":"HERE_COMES_THE_blob_VALUE"} Learn how to get FunCaptcha blob data
* @param {string} [params.proxy] - proxy
* @param {string} [params.proxyAddress] - proxyAddress
Expand Down
10 changes: 2 additions & 8 deletions capsolver/src/lib/Requests/Token/GeeTestV4TaskProxyLess.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { GeeTestV4TaskBase } from "./Base/_GeeTestV4TaskBase";
type GeeTestV4TaskProxyLessParams = ProxylessTaskParams<GeeTestV4TaskBaseParams>;

/**
* @classdesc GeeTestTask V4 this task type require your own proxies.
* @classdesc GeeTestTask V4 this using the server's built-in proxy.
* @class
* @extends {GeeTestTaskBase}
* @implements {GeeTestTaskBaseParams}
Expand All @@ -22,16 +22,10 @@ export class GeeTestV4TaskProxyLess extends GeeTestV4TaskBase implements _IsTask
readonly _isGeeTestTaskProxyLess: _IsTaskType["_isGeeTestTaskProxyLess"] = true;

/**
* @classdesc GeeTestTask V4 this task type require your own proxies.
* @classdesc GeeTestTask V4 this using the server's built-in proxy.
* {@link https://docs.capsolver.com/guide/captcha/Geetest.html}
* @param {object} params - GeeTestTaskBaseParams
* @param {string} [params.captchaId] - required. captchaId
* @param {string} [params.proxy] - proxy
* @param {string} [params.proxyAddress] - proxyAddress
* @param {string} [params.proxyLogin] - proxyLogin
* @param {string} [params.proxyPassword] - proxyPassword
* @param {number} [params.proxyPort] - proxyPort
* @param {string} [params.proxyType] - proxyType
* @param {string} [params.websiteURL] -required. Web address of the website using funcaptcha, generally it's fixed value. (Ex: https://google.com)
* @param {string} [param.geetestApiServerSubdomain] - optional. A special subdomain of funcaptcha.com, from which the JS captcha widget should be loaded. Most FunCaptcha installations work from shared domains.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ type ReCaptchaV3M1TaskProxyLessParams = ProxylessTaskParams<RecaptchaV3TaskBaseP
* @class
* @extends {RecaptchaV3TaskBase}
* {@link https://docs.capsolver.com/guide/captcha/ReCaptchaV3.html}
* @deprecated removed from service support
*/
export class ReCaptchaV3M1TaskProxyLess extends RecaptchaV3TaskBase implements _IsTaskType {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
/**
* {@link https://docs.capsolver.com/guide/recognition/AwsWafClassification.html#example-response}
*/
export interface AwsWafClassificationSolution {
box: number[];
distance: number;
objects: number[];
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
/**
* {@link https://docs.capsolver.com/guide/recognition/FunCaptchaClassification.html#example-response}
*/
export interface FunCaptchaClassificationSolution {
objects: Array<number>;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
/**
* {@link https://docs.capsolver.com/guide/recognition/HCaptchaClassification.html#example-response}
*/
export interface HCaptchaClassificationSolution {
box: Array<number>;
imageSize: Array<number>;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
/**
* {@link https://docs.capsolver.com/guide/recognition/ImageToTextTask.html#example-response}
*/
export interface ImageToTextSolution {
text: string;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@

/**
* {@link https://docs.capsolver.com/guide/recognition/ReCaptchaClassification.html#response-example}
*/
interface MultiSolution {
objects: number[];
size: number;
type: string;
}

/**
* {@link https://docs.capsolver.com/guide/recognition/ReCaptchaClassification.html#response-example}
*/
interface SingleSolution {
hasObject: boolean;
size: number;
Expand Down
3 changes: 3 additions & 0 deletions capsolver/src/lib/Solution/Token/AntiAkamaiPowTaskSolution.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
/**
* @deprecated removed from service support
*/
export interface AntiAkamaiPowTaskSolution {
pow: string;
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
/**
* @deprecated removed from service support
*/
export interface AntiAkamaiSensorTaskSolution {
deviceId: string;
deviceName: string;
Expand Down
3 changes: 3 additions & 0 deletions capsolver/src/lib/Solution/Token/AntiAkamaiWebTaskSolution.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
/**
* @deprecated removed from service support
*/
export interface AntiAkamaiWebTaskSolution {
sensorData: string;
}
Expand Down
3 changes: 3 additions & 0 deletions capsolver/src/lib/Solution/Token/AntiAwsWafTaskSolution.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
/**
* @deprecated removed from service support
*/
export interface AntiAwsWafTaskSolution {
cookie: string;
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
/**
* {@link https://docs.capsolver.com/guide/antibots/cloudflare_turnstile.html#example-response-1}
*/
export interface AntiCloudflareTaskSolution {
token: string;
type: string;
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
/**
* @deprecated removed from service support
*/
export interface AntiCyberSiAraTaskSolution { token: string }
3 changes: 3 additions & 0 deletions capsolver/src/lib/Solution/Token/AntiImpervaTaskSolution.ts
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
/**
* {@link https://docs.capsolver.com/guide/antibots/imperva.html#example-response-1}
*/
export interface AntiImpervaTaskSolution { token: string }
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
/**
* {@link https://docs.capsolver.com/guide/antibots/datadome.html#example-response-1}
*/
export interface DataDomeSliderTaskSolution {
cookie: string;
userAgent: string;
Expand Down
3 changes: 3 additions & 0 deletions capsolver/src/lib/Solution/Token/FunCaptchaTaskSolution.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
/**
* {@link https://docs.capsolver.com/guide/captcha/FunCaptcha.html#example-response-1}
*/
export interface FunCaptchaTaskSolution {
token: string;
userAgent: string;
Expand Down
3 changes: 3 additions & 0 deletions capsolver/src/lib/Solution/Token/GeeTestV3TaskSolution.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
/**
* {@link https://docs.capsolver.com/guide/captcha/Geetest.html#example-response-1}
*/
export interface GeeTestV3TaskSolution {
challenge: string;
validate: string;
Expand Down
3 changes: 3 additions & 0 deletions capsolver/src/lib/Solution/Token/GeeTestV4TaskSolution.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
/**
* {@link https://docs.capsolver.com/guide/captcha/Geetest.html#example-response-1}
*/
export interface GeeTestV4TaskSolution {
captcha_id: string;
captcha_output: string;
Expand Down
3 changes: 3 additions & 0 deletions capsolver/src/lib/Solution/Token/HCaptchaTaskSolution.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
/**
* {@link https://docs.capsolver.com/guide/captcha/HCaptcha.html#example-response-1}
*/
export interface HCaptchaTaskSolution {
captchaKey: string;
expireTime: number;
Expand Down
Loading

0 comments on commit 198d689

Please sign in to comment.