diff --git a/capmonstercloud_client/CapMonsterCloudClient.py b/capmonstercloud_client/CapMonsterCloudClient.py index bb4f4c5..7e4323d 100644 --- a/capmonstercloud_client/CapMonsterCloudClient.py +++ b/capmonstercloud_client/CapMonsterCloudClient.py @@ -14,22 +14,22 @@ _instance_config = ( - ((RecaptchaV2ProxylessRequest, RecaptchaV2Request), getRecaptchaV2Timeouts), - ((RecaptchaV2EnterpriseProxylessRequest, RecaptchaV2EnterpriseRequest), getRecaptchaV2EnterpriseTimeouts), + ((RecaptchaV2Request,), getRecaptchaV2Timeouts), + ((RecaptchaV2EnterpriseRequest,), getRecaptchaV2EnterpriseTimeouts), ((RecaptchaV3ProxylessRequest), getRecaptchaV3Timeouts), ((ImageToTextRequest), getImage2TextTimeouts), - ((FuncaptchaProxylessRequest, FuncaptchaRequest), getFuncaptchaTimeouts), - ((HcaptchaProxylessRequest, HcaptchaRequest), getHcaptchaTimeouts), - ((GeetestProxylessRequest, GeetestRequest), getGeetestTimeouts), - ((TurnstileProxylessRequest, TurnstileRequest), getTurnstileTimeouts), + ((FuncaptchaRequest,), getFuncaptchaTimeouts), + ((HcaptchaRequest,), getHcaptchaTimeouts), + ((GeetestRequest,), getGeetestTimeouts), + ((TurnstileRequest,), getTurnstileTimeouts), ((RecaptchaComplexImageTaskRequest, HcaptchaComplexImageTaskRequest, FunCaptchaComplexImageTaskRequest), getImage2TextTimeouts), - ((DataDomeCustomTaskRequest, DataDomeCustomTaskProxylessRequest), getDatadomeTimeouts), - ((TenDiCustomTaskRequest, TenDiCustomTaskProxylessRequest), getTenDiTimeouts), - ((BasiliskCustomTaskRequest, BasiliskCustomTaskProxylessRequest), getBasiliskTimeouts), - ((AmazonWafRequest, AmazonWafProxylessRequest), getAmazonWafTimeouts), - ((BinanceTaskRequest, BinanceTaskProxylessRequest), getBinanceTimeouts), - ((ImpervaCustomTaskRequest, ImpervaCustomTaskProxylessRequest), getImpervaTimeouts), + ((DataDomeCustomTaskRequest,), getDatadomeTimeouts), + ((TenDiCustomTaskRequest,), getTenDiTimeouts), + ((BasiliskCustomTaskRequest,), getBasiliskTimeouts), + ((AmazonWafRequest,), getAmazonWafTimeouts), + ((BinanceTaskRequest,), getBinanceTimeouts), + ((ImpervaCustomTaskRequest,), getImpervaTimeouts), ((RecognitionComplexImageTaskRequest), getCITTimeouts) ) @@ -61,29 +61,24 @@ async def get_balance(self) -> Dict[str, Union[int, float, str]]: return result - async def solve_captcha(self, request: Union[RecaptchaV2EnterpriseProxylessRequest, + async def solve_captcha(self, request: Union[ RecaptchaV2EnterpriseRequest, RecaptchaV2Request, - RecaptchaV2ProxylessRequest, RecaptchaV3ProxylessRequest, - ImageToTextRequest, - FuncaptchaProxylessRequest, - FuncaptchaRequest, - HcaptchaRequest, - HcaptchaProxylessRequest, - GeetestProxylessRequest, - GeetestRequest, - TurnstileProxylessRequest, - TurnstileRequest, - HcaptchaComplexImageTaskRequest, RecaptchaComplexImageTaskRequest, + ImageToTextRequest, + FuncaptchaRequest, FunCaptchaComplexImageTaskRequest, - DataDomeCustomTaskProxylessRequest, + HcaptchaRequest, + HcaptchaComplexImageTaskRequest, + GeetestRequest, DataDomeCustomTaskRequest, + TenDiCustomTaskRequest, + BasiliskCustomTaskRequest, + AmazonWafRequest, BinanceTaskRequest, - BinanceTaskProxylessRequest, ImpervaCustomTaskRequest, - ImpervaCustomTaskProxylessRequest, + TurnstileRequest, RecognitionComplexImageTaskRequest], ) -> Dict[str, str]: ''' @@ -99,27 +94,25 @@ async def solve_captcha(self, request: Union[RecaptchaV2EnterpriseProxylessReque raise UnknownRequestInstanceError(f'Unknown request instance "{type(request)}", ' \ f'expected that request will belong next instances: {rs_all}') - async def _solve(self, request: Union[RecaptchaV2EnterpriseProxylessRequest, + async def _solve(self, request: Union[ RecaptchaV2EnterpriseRequest, RecaptchaV2Request, - RecaptchaV2ProxylessRequest, RecaptchaV3ProxylessRequest, - ImageToTextRequest, - FuncaptchaProxylessRequest, - FuncaptchaRequest, - HcaptchaRequest, - HcaptchaProxylessRequest, - GeetestProxylessRequest, - GeetestRequest, - TurnstileProxylessRequest, - TurnstileRequest, - HcaptchaComplexImageTaskRequest, RecaptchaComplexImageTaskRequest, + ImageToTextRequest, + FuncaptchaRequest, FunCaptchaComplexImageTaskRequest, + HcaptchaRequest, + HcaptchaComplexImageTaskRequest, + GeetestRequest, + DataDomeCustomTaskRequest, + TenDiCustomTaskRequest, + BasiliskCustomTaskRequest, + AmazonWafRequest, BinanceTaskRequest, - BinanceTaskProxylessRequest, ImpervaCustomTaskRequest, - ImpervaCustomTaskProxylessRequest], + TurnstileRequest, + RecognitionComplexImageTaskRequest], timeouts: GetResultTimeouts, ) -> Dict[str, str]: diff --git a/capmonstercloud_client/requests/AmazonWafProxylessRequest.py b/capmonstercloud_client/requests/AmazonWafProxylessRequest.py deleted file mode 100644 index a18a55c..0000000 --- a/capmonstercloud_client/requests/AmazonWafProxylessRequest.py +++ /dev/null @@ -1,22 +0,0 @@ -from typing import Dict, Union -from pydantic import Field, validator - -from .proxy_info import ProxyInfo -from .AmazonWafRequestBase import AmazonWafRequestBase - -class AmazonWafProxylessRequest(AmazonWafRequestBase): - type: str = 'AmazonTaskProxyless' - - def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: - task = {} - task['type'] = self.type - task['websiteURL'] = self.websiteUrl - task['challengeScript'] = self.challengeScript - task['captchaScript'] = self.captchaScript - task['websiteKey'] = self.websiteKey - task['context'] = self.context - task['iv'] = self.iv - - if self.cookieSolution is not None: - task['cookieSolution'] = self.cookieSolution - return task \ No newline at end of file diff --git a/capmonstercloud_client/requests/AmazonWafRequest.py b/capmonstercloud_client/requests/AmazonWafRequest.py index 62dd982..6104f1b 100644 --- a/capmonstercloud_client/requests/AmazonWafRequest.py +++ b/capmonstercloud_client/requests/AmazonWafRequest.py @@ -1,11 +1,17 @@ -from typing import Dict, Union -from pydantic import Field, validator +from typing import Dict, Union, Optional +from pydantic import Field -from .proxy_info import ProxyInfo -from .AmazonWafRequestBase import AmazonWafRequestBase +from .baseRequestWithProxy import BaseRequestWithProxy -class AmazonWafRequest(AmazonWafRequestBase, ProxyInfo): +class AmazonWafRequest(BaseRequestWithProxy): type: str = 'AmazonTask' + websiteUrl: str + challengeScript: str + captchaScript: str + websiteKey: str + context: str + iv: str + cookieSolution: Optional[bool] = Field(default=None) def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: task = {} @@ -16,12 +22,13 @@ def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: task['websiteKey'] = self.websiteKey task['context'] = self.context task['iv'] = self.iv - - task['proxyType'] = self.proxyType - task['proxyAddress'] = self.proxyAddress - task['proxyPort'] = self.proxyPort - task['proxyLogin'] = self.proxyLogin - task['proxyPassword'] = self.proxyPassword + + if self.proxy: + task['proxyType'] = self.proxy.proxyType + task['proxyAddress'] = self.proxy.proxyAddress + task['proxyPort'] = self.proxy.proxyPort + task['proxyLogin'] = self.proxy.proxyLogin + task['proxyPassword'] = self.proxy.proxyPassword if self.cookieSolution is not None: task['cookieSolution'] = self.cookieSolution diff --git a/capmonstercloud_client/requests/AmazonWafRequestBase.py b/capmonstercloud_client/requests/AmazonWafRequestBase.py deleted file mode 100644 index 7fab65e..0000000 --- a/capmonstercloud_client/requests/AmazonWafRequestBase.py +++ /dev/null @@ -1,13 +0,0 @@ -from pydantic import Field -from typing import Optional - -from .baseRequest import BaseRequest - -class AmazonWafRequestBase(BaseRequest): - websiteUrl: str - challengeScript: str - captchaScript: str - websiteKey: str - context: str - iv: str - cookieSolution: Optional[bool] = Field(default=None) \ No newline at end of file diff --git a/capmonstercloud_client/requests/BasiliskCustomTaskProxylessRequest.py b/capmonstercloud_client/requests/BasiliskCustomTaskProxylessRequest.py deleted file mode 100644 index 477525e..0000000 --- a/capmonstercloud_client/requests/BasiliskCustomTaskProxylessRequest.py +++ /dev/null @@ -1,16 +0,0 @@ -from typing import Dict, Union -from pydantic import Field, validator - -from .BasiliskCustomTaskRequestBase import BasiliskCustomTaskRequestBase - -class BasiliskCustomTaskProxylessRequest(BasiliskCustomTaskRequestBase): - - def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: - task = {} - task['type'] = self.type - task['class'] = self.captchaClass - task['websiteURL'] = self.websiteUrl - task['websiteKey'] = self.websiteKey - if self.userAgent is not None: - task['userAgent'] = self.userAgent - return task \ No newline at end of file diff --git a/capmonstercloud_client/requests/BasiliskCustomTaskRequest.py b/capmonstercloud_client/requests/BasiliskCustomTaskRequest.py index efd8bc9..1d3602a 100644 --- a/capmonstercloud_client/requests/BasiliskCustomTaskRequest.py +++ b/capmonstercloud_client/requests/BasiliskCustomTaskRequest.py @@ -1,10 +1,11 @@ from typing import Dict, Union -from pydantic import Field, validator +from pydantic import Field -from .proxy_info import ProxyInfo -from .BasiliskCustomTaskRequestBase import BasiliskCustomTaskRequestBase +from .CustomTaskRequestBase import CustomTaskRequestBase -class BasiliskCustomTaskRequest(BasiliskCustomTaskRequestBase, ProxyInfo): +class BasiliskCustomTaskRequest(CustomTaskRequestBase): + captchaClass: str = Field(default='Basilisk') + websiteKey: str = Field() def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: task = {} @@ -12,11 +13,12 @@ def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: task['class'] = self.captchaClass task['websiteURL'] = self.websiteUrl task['websiteKey'] = self.websiteKey - task['proxyType'] = self.proxyType - task['proxyAddress'] = self.proxyAddress - task['proxyPort'] = self.proxyPort - task['proxyLogin'] = self.proxyLogin - task['proxyPassword'] = self.proxyPassword + if self.proxy: + task['proxyType'] = self.proxy.proxyType + task['proxyAddress'] = self.proxy.proxyAddress + task['proxyPort'] = self.proxy.proxyPort + task['proxyLogin'] = self.proxy.proxyLogin + task['proxyPassword'] = self.proxy.proxyPassword if self.userAgent is not None: task['userAgent'] = self.userAgent return task \ No newline at end of file diff --git a/capmonstercloud_client/requests/BasiliskCustomTaskRequestBase.py b/capmonstercloud_client/requests/BasiliskCustomTaskRequestBase.py deleted file mode 100644 index e55ff94..0000000 --- a/capmonstercloud_client/requests/BasiliskCustomTaskRequestBase.py +++ /dev/null @@ -1,11 +0,0 @@ -from .baseRequest import BaseRequest, Field -from typing import Optional -from pydantic import validator, model_validator -from .CustomTaskRequestBase import CustomTaskRequestBase - - -class BasiliskCustomTaskRequestBase(CustomTaskRequestBase): - - type: str = Field(default='CustomTask') - captchaClass: str = Field(default='Basilisk') - websiteKey: str = Field() \ No newline at end of file diff --git a/capmonstercloud_client/requests/BinanceTaskProxylessRequest.py b/capmonstercloud_client/requests/BinanceTaskProxylessRequest.py deleted file mode 100644 index 9655619..0000000 --- a/capmonstercloud_client/requests/BinanceTaskProxylessRequest.py +++ /dev/null @@ -1,17 +0,0 @@ -from typing import Dict, Union - -from .BinanceTaskRequestBase import BinanceTaskRequestBase - - -class BinanceTaskProxylessRequest(BinanceTaskRequestBase): - type: str = 'BinanceTaskProxyless' - - def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: - task = {} - task['type'] = self.type - task['validateId'] = self.validateId - task['websiteURL'] = self.websiteUrl - task['websiteKey'] = self.websiteKey - if self.userAgent is not None: - task['userAgent'] = self.userAgent - return task \ No newline at end of file diff --git a/capmonstercloud_client/requests/BinanceTaskRequest.py b/capmonstercloud_client/requests/BinanceTaskRequest.py index 49672f1..0c99f9f 100644 --- a/capmonstercloud_client/requests/BinanceTaskRequest.py +++ b/capmonstercloud_client/requests/BinanceTaskRequest.py @@ -1,22 +1,29 @@ -from typing import Dict, Union -from pydantic import Field, validator +from typing import Dict, Union, Optional +from pydantic import Field -from .proxy_info import ProxyInfo -from .BinanceTaskRequestBase import BinanceTaskRequestBase +from .baseRequestWithProxy import BaseRequestWithProxy + +class BinanceTaskRequest(BaseRequestWithProxy): + type: str = Field(default='BinanceTask') + websiteKey: str = Field() + websiteUrl: str = Field() + validateId: str = Field() + userAgent: Optional[str] = None -class BinanceTaskRequest(BinanceTaskRequestBase, ProxyInfo): - def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: task = {} task['type'] = self.type task['validateId'] = self.validateId task['websiteURL'] = self.websiteUrl task['websiteKey'] = self.websiteKey - task['proxyType'] = self.proxyType - task['proxyAddress'] = self.proxyAddress - task['proxyPort'] = self.proxyPort - task['proxyLogin'] = self.proxyLogin - task['proxyPassword'] = self.proxyPassword + + if self.proxy: + task['proxyType'] = self.proxy.proxyType + task['proxyAddress'] = self.proxy.proxyAddress + task['proxyPort'] = self.proxy.proxyPort + task['proxyLogin'] = self.proxy.proxyLogin + task['proxyPassword'] = self.proxy.proxyPassword + if self.userAgent is not None: task['userAgent'] = self.userAgent return task \ No newline at end of file diff --git a/capmonstercloud_client/requests/BinanceTaskRequestBase.py b/capmonstercloud_client/requests/BinanceTaskRequestBase.py deleted file mode 100644 index d02a704..0000000 --- a/capmonstercloud_client/requests/BinanceTaskRequestBase.py +++ /dev/null @@ -1,11 +0,0 @@ -from .baseRequest import BaseRequest, Field -from typing import Optional - - -class BinanceTaskRequestBase(BaseRequest): - - type: str = Field(default='BinanceTask') - websiteKey: str = Field() - websiteUrl: str = Field() - validateId: str = Field() - userAgent: Optional[str] = None diff --git a/capmonstercloud_client/requests/CustomTaskRequestBase.py b/capmonstercloud_client/requests/CustomTaskRequestBase.py index e6e9c24..4508e20 100644 --- a/capmonstercloud_client/requests/CustomTaskRequestBase.py +++ b/capmonstercloud_client/requests/CustomTaskRequestBase.py @@ -1,8 +1,8 @@ -from typing import Optional, List, Dict +from typing import Optional, List -from .baseRequest import BaseRequest +from .baseRequestWithProxy import BaseRequestWithProxy -class CustomTaskRequestBase(BaseRequest): +class CustomTaskRequestBase(BaseRequestWithProxy): captchaClass: str # Class(subtype) of ComplexImageTask type: str = "CustomTask" # Recognition task type websiteUrl: str # Address of a webpage with captcha diff --git a/capmonstercloud_client/requests/DataDomeCustomTaskProxylessRequest.py b/capmonstercloud_client/requests/DataDomeCustomTaskProxylessRequest.py deleted file mode 100644 index 98bf520..0000000 --- a/capmonstercloud_client/requests/DataDomeCustomTaskProxylessRequest.py +++ /dev/null @@ -1,36 +0,0 @@ -from typing import Dict, Union -from pydantic import Field, validator - -from .DataDomeCustomTaskRequestBase import DataDomeCustomTaskRequestBase - -class DataDomeCustomTaskProxylessRequest(DataDomeCustomTaskRequestBase): - metadata : Dict[str, str] - - @validator('metadata') - def validate_metadata(cls, value): - if value.get('datadomeCookie') is None: - raise ValueError(f'Expect that datadomeCookie will be defined.') - if value.get('captchaUrl') and value.get('htmlPageBase64'): - raise ValueError(f'Expected only one of [captchaUrl, htmlPageBase64]') - elif value.get('captchaUrl'): - if not isinstance(value.get('captchaUrl'), str): - raise ValueError(f'Expect that type imagesUrls array will be , got {type(value.get("captchaUrl"))}') - return {i: value[i] for i in value if i != 'htmlPageBase64'} - elif value.get('htmlPageBase64'): - if not isinstance(value.get('htmlPageBase64'), str): - raise ValueError(f'Expect that type imagesUrls array will be , got {type(value.get("htmlPageBase64"))}') - return {i: value[i] for i in value if i != 'captchaUrl'} - else: - raise ValueError(f'Expected one of [captchaUrl, htmlPageBase64]') - - def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: - task = {} - task['type'] = self.type - task['class'] = self.captchaClass - task['websiteURL'] = self.websiteUrl - task['metadata'] = self.metadata - if self.userAgent is not None: - task['userAgent'] = self.userAgent - if self.domains is not None: - task['domains'] = self.domains - return task \ No newline at end of file diff --git a/capmonstercloud_client/requests/DataDomeCustomTaskRequest.py b/capmonstercloud_client/requests/DataDomeCustomTaskRequest.py index 926179a..fe08e9a 100644 --- a/capmonstercloud_client/requests/DataDomeCustomTaskRequest.py +++ b/capmonstercloud_client/requests/DataDomeCustomTaskRequest.py @@ -1,9 +1,9 @@ from typing import Dict, Union from pydantic import Field, validator -from .DataDomeCustomTaskRequestBase import DataDomeCustomTaskRequestBase -from .proxy_info import ProxyInfo +from .CustomTaskRequestBase import CustomTaskRequestBase -class DataDomeCustomTaskRequest(DataDomeCustomTaskRequestBase, ProxyInfo): +class DataDomeCustomTaskRequest(CustomTaskRequestBase): + captchaClass: str = Field(default='DataDome') metadata : Dict[str, str] @validator('metadata') @@ -28,11 +28,12 @@ def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: task['type'] = self.type task['class'] = self.captchaClass task['websiteURL'] = self.websiteUrl - task['proxyType'] = self.proxyType - task['proxyAddress'] = self.proxyAddress - task['proxyPort'] = self.proxyPort - task['proxyLogin'] = self.proxyLogin - task['proxyPassword'] = self.proxyPassword + if self.proxy: + task['proxyType'] = self.proxy.proxyType + task['proxyAddress'] = self.proxy.proxyAddress + task['proxyPort'] = self.proxy.proxyPort + task['proxyLogin'] = self.proxy.proxyLogin + task['proxyPassword'] = self.proxy.proxyPassword task['domains'] = self.domains task['metadata'] = self.metadata if self.userAgent is not None: diff --git a/capmonstercloud_client/requests/DataDomeCustomTaskRequestBase.py b/capmonstercloud_client/requests/DataDomeCustomTaskRequestBase.py deleted file mode 100644 index f0cca00..0000000 --- a/capmonstercloud_client/requests/DataDomeCustomTaskRequestBase.py +++ /dev/null @@ -1,8 +0,0 @@ -from typing import Dict, Union -from pydantic import Field - -from .CustomTaskRequestBase import CustomTaskRequestBase - -class DataDomeCustomTaskRequestBase(CustomTaskRequestBase): - type: str = Field(default='CustomTask') - captchaClass: str = Field(default='DataDome') \ No newline at end of file diff --git a/capmonstercloud_client/requests/FuncaptchaProxylessRequest.py b/capmonstercloud_client/requests/FuncaptchaProxylessRequest.py deleted file mode 100644 index 1610bb2..0000000 --- a/capmonstercloud_client/requests/FuncaptchaProxylessRequest.py +++ /dev/null @@ -1,18 +0,0 @@ -from pydantic import Field -from typing import Dict, Union - -from .FuncaptchaRequestBase import FuncaptchaRequestBase - -class FuncaptchaProxylessRequest(FuncaptchaRequestBase): - type: str = Field(default='FunCaptchaTaskProxyless') - - def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: - task = {} - task['type'] = self.type - task['websiteURL'] = self.websiteUrl - task['websitePublicKey'] = self.websitePublicKey - if self.funcaptchaApiJSSubdomain is not None: - task['funcaptchaApiJSSubdomain'] = self.funcaptchaApiJSSubdomain - if self.data is not None: - task['data'] = self.data - return task \ No newline at end of file diff --git a/capmonstercloud_client/requests/FuncaptchaRequest.py b/capmonstercloud_client/requests/FuncaptchaRequest.py index 701339e..9e44156 100644 --- a/capmonstercloud_client/requests/FuncaptchaRequest.py +++ b/capmonstercloud_client/requests/FuncaptchaRequest.py @@ -1,22 +1,27 @@ -from typing import Dict, Union +from typing import Dict, Union, Optional from pydantic import Field -from .FuncaptchaRequestBase import FuncaptchaRequestBase -from .proxy_info import ProxyInfo +from .baseRequestWithProxy import BaseRequestWithProxy -class FuncaptchaRequest(FuncaptchaRequestBase, ProxyInfo): +class FuncaptchaRequest(BaseRequestWithProxy): type: str = Field(default='FunCaptchaTask') - + websiteUrl: str + websitePublicKey: str + funcaptchaApiJSSubdomain: Optional[str] = Field(default=None) + data: Optional[str] = Field(default=None) + def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: task = {} task['type'] = self.type task['websiteURL'] = self.websiteUrl task['websitePublicKey'] = self.websitePublicKey - task['proxyType'] = self.proxyType - task['proxyAddress'] = self.proxyAddress - task['proxyPort'] = self.proxyPort - task['proxyLogin'] = self.proxyLogin - task['proxyPassword'] = self.proxyPassword + if self.proxy: + task['proxyType'] = self.proxy.proxyType + task['proxyAddress'] = self.proxy.proxyAddress + task['proxyPort'] = self.proxy.proxyPort + task['proxyLogin'] = self.proxy.proxyLogin + task['proxyPassword'] = self.proxy.proxyPassword + if self.funcaptchaApiJSSubdomain is not None: task['funcaptchaApiJSSubdomain'] = self.funcaptchaApiJSSubdomain if self.data is not None: diff --git a/capmonstercloud_client/requests/FuncaptchaRequestBase.py b/capmonstercloud_client/requests/FuncaptchaRequestBase.py deleted file mode 100644 index d88d906..0000000 --- a/capmonstercloud_client/requests/FuncaptchaRequestBase.py +++ /dev/null @@ -1,10 +0,0 @@ -from pydantic import Field -from typing import Optional - -from .baseRequest import BaseRequest - -class FuncaptchaRequestBase(BaseRequest): - websiteUrl: str - websitePublicKey: str - funcaptchaApiJSSubdomain: Optional[str] = Field(default=None) - data: Optional[str] = Field(default=None) \ No newline at end of file diff --git a/capmonstercloud_client/requests/GeetestProxylessRequest.py b/capmonstercloud_client/requests/GeetestProxylessRequest.py deleted file mode 100644 index aab2d13..0000000 --- a/capmonstercloud_client/requests/GeetestProxylessRequest.py +++ /dev/null @@ -1,31 +0,0 @@ -from pydantic import Field -from typing import Dict, Union - -from .GeetestRequestBase import GeetestRequestBase - -class GeetestProxylessRequest(GeetestRequestBase): - type: str = Field(default='GeeTestTaskProxyless') - - def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: - task = {} - task['type'] = self.type - task['websiteURL'] = self.websiteUrl - task['gt'] = self.gt - task['version'] = self.version - - if self.version == 3: - if self.challenge is None: - raise ValueError(f'Challenge value is required for 3 version Geetest.') - task['challenge'] = self.challenge - - if self.version == 4: - if self.initParameters is not None: - task['initParameters'] = self.initParameters - - if self.geetestApiServerSubdomain is not None: - task['geetestApiServerSubdomain'] = self.geetestApiServerSubdomain - if self.geetestGetLib is not None: - task['geetestGetLib'] = self.geetestGetLib - if self.user_agent is not None: - task['userAgent'] = self.user_agent - return task \ No newline at end of file diff --git a/capmonstercloud_client/requests/GeetestRequest.py b/capmonstercloud_client/requests/GeetestRequest.py index 7959e79..e3bcf1e 100644 --- a/capmonstercloud_client/requests/GeetestRequest.py +++ b/capmonstercloud_client/requests/GeetestRequest.py @@ -1,12 +1,26 @@ -from pydantic import Field -from typing import Dict, Union +from pydantic import Field, validator +from typing import Dict, Union, Optional -from .GeetestRequestBase import GeetestRequestBase -from .proxy_info import ProxyInfo +from .baseRequestWithProxy import BaseRequestWithProxy -class GeetestRequest(GeetestRequestBase, ProxyInfo): + +class GeetestRequest(BaseRequestWithProxy): type: str = Field(default='GeeTestTask') + websiteUrl: str + gt: str + challenge: Optional[str] = Field(default=None) + version: int = Field(default=3) + initParameters: Optional[Dict] = Field(default=None) + geetestApiServerSubdomain: Optional[str] = Field(default=None) + geetestGetLib: Optional[str] = Field(default=None) + user_agent: Optional[str] = Field(default=None) + @validator('version') + def validate_version(cls, value): + if value not in [3, 4]: + raise ValueError(f"Geetest version could be 3 or 4, not {value}") + return value + def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: task = {} task['type'] = self.type @@ -30,9 +44,10 @@ def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: if self.user_agent is not None: task['userAgent'] = self.user_agent - task['proxyType'] = self.proxyType - task['proxyAddress'] = self.proxyAddress - task['proxyPort'] = self.proxyPort - task['proxyLogin'] = self.proxyLogin - task['proxyPassword'] = self.proxyPassword + if self.proxy: + task['proxyType'] = self.proxy.proxyType + task['proxyAddress'] = self.proxy.proxyAddress + task['proxyPort'] = self.proxy.proxyPort + task['proxyLogin'] = self.proxy.proxyLogin + task['proxyPassword'] = self.proxy.proxyPassword return task \ No newline at end of file diff --git a/capmonstercloud_client/requests/GeetestRequestBase.py b/capmonstercloud_client/requests/GeetestRequestBase.py deleted file mode 100644 index 3cb3a0b..0000000 --- a/capmonstercloud_client/requests/GeetestRequestBase.py +++ /dev/null @@ -1,20 +0,0 @@ -from pydantic import Field, validator -from typing import Dict, Optional - -from .baseRequest import BaseRequest - -class GeetestRequestBase(BaseRequest): - websiteUrl: str - gt: str - challenge: Optional[str] = Field(default=None) - version: int = Field(default=3) - initParameters: Optional[Dict] = Field(default=None) - geetestApiServerSubdomain: Optional[str] = Field(default=None) - geetestGetLib: Optional[str] = Field(default=None) - user_agent: Optional[str] = Field(default=None) - - @validator('version') - def validate_version(cls, value): - if value not in [3, 4]: - raise ValueError(f"Geetest version could be 3 or 4, not {value}") - return value \ No newline at end of file diff --git a/capmonstercloud_client/requests/HcaptchaProxylessRequest.py b/capmonstercloud_client/requests/HcaptchaProxylessRequest.py deleted file mode 100644 index 223d6e9..0000000 --- a/capmonstercloud_client/requests/HcaptchaProxylessRequest.py +++ /dev/null @@ -1,25 +0,0 @@ -from typing import Dict, Union -from pydantic import Field - -from .HcaptchaRequestBase import HcaptchaRequestBase - - -class HcaptchaProxylessRequest(HcaptchaRequestBase): - type: str = Field(default='HCaptchaTaskProxyless') - - def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: - task = {} - task['type'] = self.type - task['websiteURL'] = self.websiteUrl - task['websiteKey'] = self.websiteKey - if self.is_invisible is not None: - task['isInvisible'] = self.is_invisible - if self.data is not None: - task['data'] = self.data - if self.user_agent is not None: - task['userAgent'] = self.user_agent - if self.cookies is not None: - task['cookies'] = self.cookies - if self.fallbackToActualUA is not None: - task['fallbackToActualUA'] = self.fallbackToActualUA - return task \ No newline at end of file diff --git a/capmonstercloud_client/requests/HcaptchaRequest.py b/capmonstercloud_client/requests/HcaptchaRequest.py index 7b7ab1b..e990cd7 100644 --- a/capmonstercloud_client/requests/HcaptchaRequest.py +++ b/capmonstercloud_client/requests/HcaptchaRequest.py @@ -1,11 +1,17 @@ from pydantic import Field -from typing import Dict, Union +from typing import Dict, Union, Optional -from .HcaptchaRequestBase import HcaptchaRequestBase -from .proxy_info import ProxyInfo +from .baseRequestWithProxy import BaseRequestWithProxy -class HcaptchaRequest(HcaptchaRequestBase, ProxyInfo): +class HcaptchaRequest(BaseRequestWithProxy): type: str = Field(default='HCaptchaTask') + websiteUrl: str + websiteKey: str + is_invisible: Optional[bool] = Field(default=None) + data: Optional[str] = Field(default=None) + user_agent: Optional[str] = Field(default=None) + cookies: Optional[str] = Field(default=None) + fallbackToActualUA: Optional[bool] = Field(default=None) def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: @@ -13,11 +19,12 @@ def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: task['type'] = self.type task['websiteURL'] = self.websiteUrl task['websiteKey'] = self.websiteKey - task['proxyType'] = self.proxyType - task['proxyAddress'] = self.proxyAddress - task['proxyPort'] = self.proxyPort - task['proxyLogin'] = self.proxyLogin - task['proxyPassword'] = self.proxyPassword + if self.proxy: + task['proxyType'] = self.proxy.proxyType + task['proxyAddress'] = self.proxy.proxyAddress + task['proxyPort'] = self.proxy.proxyPort + task['proxyLogin'] = self.proxy.proxyLogin + task['proxyPassword'] = self.proxy.proxyPassword if self.is_invisible is not None: task['isInvisible'] = self.is_invisible if self.data is not None: diff --git a/capmonstercloud_client/requests/HcaptchaRequestBase.py b/capmonstercloud_client/requests/HcaptchaRequestBase.py deleted file mode 100644 index d4c7088..0000000 --- a/capmonstercloud_client/requests/HcaptchaRequestBase.py +++ /dev/null @@ -1,13 +0,0 @@ -from pydantic import Field -from typing import Optional - -from .baseRequest import BaseRequest - -class HcaptchaRequestBase(BaseRequest): - websiteUrl: str - websiteKey: str - is_invisible: Optional[bool] = Field(default=None) - data: Optional[str] = Field(default=None) - user_agent: Optional[str] = Field(default=None) - cookies: Optional[str] = Field(default=None) - fallbackToActualUA: Optional[bool] = Field(default=None) \ No newline at end of file diff --git a/capmonstercloud_client/requests/ImageToTextRequest.py b/capmonstercloud_client/requests/ImageToTextRequest.py index c02196e..6755a82 100644 --- a/capmonstercloud_client/requests/ImageToTextRequest.py +++ b/capmonstercloud_client/requests/ImageToTextRequest.py @@ -1,6 +1,6 @@ import base64 -from pydantic import validator, Field, BaseModel +from pydantic import validator, Field from typing import Optional, Dict, Union from .baseRequest import BaseRequest from .enums import TextModules diff --git a/capmonstercloud_client/requests/ImpervaCustomTaskProxylessRequest.py b/capmonstercloud_client/requests/ImpervaCustomTaskProxylessRequest.py deleted file mode 100644 index 5adc53e..0000000 --- a/capmonstercloud_client/requests/ImpervaCustomTaskProxylessRequest.py +++ /dev/null @@ -1,33 +0,0 @@ -from typing import Dict, Union -from pydantic import Field, validator - -from .ImpervaCustomTaskRequestBase import ImpervaCustomTaskRequestBase - -class ImpervaCustomTaskProxylessRequest(ImpervaCustomTaskRequestBase): - metadata : Dict[str, str] - - @validator('metadata') - def validate_metadata(cls, value): - if value.get('incapsulaScriptBase64') is None: - raise TypeError(f'Expect that incapsulaScriptBase64 will be defined.') - else: - if not isinstance(value.get('incapsulaScriptBase64'), str): - raise TypeError(f'Expect that incapsulaScriptBase64 will be str.') - if value.get('incapsulaSessionCookie') is None: - raise TypeError(f'Expect that incapsulaSessionCookie will be defined.') - else: - if not isinstance(value.get('incapsulaSessionCookie'), str): - raise TypeError(f'Expect that incapsulaSessionCookie will be str.') - if value.get('reese84UrlEndpoint') is not None and not isinstance(value.get('incapsulaSessionCookie'), str): - raise TypeError(f'Expect that reese84UrlEndpoint will be str.') - return value - - def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: - task = {} - task['type'] = self.type - task['class'] = self.captchaClass - task['websiteURL'] = self.websiteUrl - task['metadata'] = self.metadata - if self.userAgent is not None: - task['userAgent'] = self.userAgent - return task \ No newline at end of file diff --git a/capmonstercloud_client/requests/ImpervaCustomTaskRequest.py b/capmonstercloud_client/requests/ImpervaCustomTaskRequest.py index 1746ad3..5e47dce 100644 --- a/capmonstercloud_client/requests/ImpervaCustomTaskRequest.py +++ b/capmonstercloud_client/requests/ImpervaCustomTaskRequest.py @@ -1,10 +1,10 @@ from typing import Dict, Union from pydantic import Field, validator -from .proxy_info import ProxyInfo -from .ImpervaCustomTaskRequestBase import ImpervaCustomTaskRequestBase +from .CustomTaskRequestBase import CustomTaskRequestBase -class ImpervaCustomTaskRequest(ImpervaCustomTaskRequestBase, ProxyInfo): +class ImpervaCustomTaskRequest(CustomTaskRequestBase): + captchaClass: str = Field(default='Imperva') metadata : Dict[str, str] @validator('metadata') @@ -29,11 +29,12 @@ def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: task['class'] = self.captchaClass task['websiteURL'] = self.websiteUrl task['metadata'] = self.metadata - task['proxyType'] = self.proxyType - task['proxyAddress'] = self.proxyAddress - task['proxyPort'] = self.proxyPort - task['proxyLogin'] = self.proxyLogin - task['proxyPassword'] = self.proxyPassword + if self.proxy: + task['proxyType'] = self.proxy.proxyType + task['proxyAddress'] = self.proxy.proxyAddress + task['proxyPort'] = self.proxy.proxyPort + task['proxyLogin'] = self.proxy.proxyLogin + task['proxyPassword'] = self.proxy.proxyPassword if self.userAgent is not None: task['userAgent'] = self.userAgent return task \ No newline at end of file diff --git a/capmonstercloud_client/requests/ImpervaCustomTaskRequestBase.py b/capmonstercloud_client/requests/ImpervaCustomTaskRequestBase.py deleted file mode 100644 index c943e02..0000000 --- a/capmonstercloud_client/requests/ImpervaCustomTaskRequestBase.py +++ /dev/null @@ -1,8 +0,0 @@ -from typing import Dict, Union -from pydantic import Field - -from .CustomTaskRequestBase import CustomTaskRequestBase - -class ImpervaCustomTaskRequestBase(CustomTaskRequestBase): - type: str = Field(default='CustomTask') - captchaClass: str = Field(default='Imperva') diff --git a/capmonstercloud_client/requests/RecaptchaComplexImageTask.py b/capmonstercloud_client/requests/RecaptchaComplexImageTask.py index b597d9e..bdadac9 100644 --- a/capmonstercloud_client/requests/RecaptchaComplexImageTask.py +++ b/capmonstercloud_client/requests/RecaptchaComplexImageTask.py @@ -1,4 +1,4 @@ -from typing import Dict, Union, Optional +from typing import Dict, Union from pydantic import Field, validator from .ComplexImageTaskBase import ComplexImageTaskRequestBase diff --git a/capmonstercloud_client/requests/RecaptchaV2EnterpiseRequest.py b/capmonstercloud_client/requests/RecaptchaV2EnterpiseRequest.py index bf88b32..e740983 100644 --- a/capmonstercloud_client/requests/RecaptchaV2EnterpiseRequest.py +++ b/capmonstercloud_client/requests/RecaptchaV2EnterpiseRequest.py @@ -1,22 +1,26 @@ -from typing import Dict, Union +from typing import Dict, Union, Optional from pydantic import Field -from .RecaptchaV2EnterpriseRequestBase import RecaptchaV2EnterpriseRequestBase -from .proxy_info import ProxyInfo +from .baseRequestWithProxy import BaseRequestWithProxy -class RecaptchaV2EnterpriseRequest(RecaptchaV2EnterpriseRequestBase, ProxyInfo): +class RecaptchaV2EnterpriseRequest(BaseRequestWithProxy): type: str = Field(default='RecaptchaV2EnterpriseTask') - + websiteUrl: str + websiteKey: str + enterprisePayload: Optional[str] = Field(default=None) + apiDomain: Optional[str] = Field(default=None) + def getTaskDict(self) -> Dict[str, Union[str, int]]: task = {} task['type'] = self.type task['websiteURL'] = self.websiteUrl task['websiteKey'] = self.websiteKey - task['proxyType'] = self.proxyType - task['proxyAddress'] = self.proxyAddress - task['proxyPort'] = self.proxyPort - task['proxyLogin'] = self.proxyLogin - task['proxyPassword'] = self.proxyPassword + if self.proxy: + task['proxyType'] = self.proxy.proxyType + task['proxyAddress'] = self.proxy.proxyAddress + task['proxyPort'] = self.proxy.proxyPort + task['proxyLogin'] = self.proxy.proxyLogin + task['proxyPassword'] = self.proxy.proxyPassword if self.enterprisePayload is not None: task['enterprisePayload'] = {'s': self.enterprisePayload} if self.apiDomain is not None: diff --git a/capmonstercloud_client/requests/RecaptchaV2EnterpriseProxylessRequest.py b/capmonstercloud_client/requests/RecaptchaV2EnterpriseProxylessRequest.py deleted file mode 100644 index e91d8b6..0000000 --- a/capmonstercloud_client/requests/RecaptchaV2EnterpriseProxylessRequest.py +++ /dev/null @@ -1,18 +0,0 @@ -from typing import Dict, Union -from pydantic import Field - -from .RecaptchaV2EnterpriseRequestBase import RecaptchaV2EnterpriseRequestBase - -class RecaptchaV2EnterpriseProxylessRequest(RecaptchaV2EnterpriseRequestBase): - type: str = Field(default='RecaptchaV2EnterpriseTaskProxyless') - - def getTaskDict(self) -> Dict[str, Union[str, Dict[str, str]]]: - task = {} - task['type'] = self.type - task['websiteURL'] = self.websiteUrl - task['websiteKey'] = self.websiteKey - if self.enterprisePayload is not None: - task['enterprisePayload'] = {'s': self.enterprisePayload} - if self.apiDomain is not None: - task['apiDomain'] = self.apiDomain - return task \ No newline at end of file diff --git a/capmonstercloud_client/requests/RecaptchaV2EnterpriseRequestBase.py b/capmonstercloud_client/requests/RecaptchaV2EnterpriseRequestBase.py deleted file mode 100644 index 1cff194..0000000 --- a/capmonstercloud_client/requests/RecaptchaV2EnterpriseRequestBase.py +++ /dev/null @@ -1,11 +0,0 @@ -from typing import Optional -from pydantic import Field - -from .baseRequest import BaseRequest - - -class RecaptchaV2EnterpriseRequestBase(BaseRequest): - websiteUrl: str - websiteKey: str - enterprisePayload: Optional[str] = Field(default=None) - apiDomain: Optional[str] = Field(default=None) \ No newline at end of file diff --git a/capmonstercloud_client/requests/RecaptchaV2ProxylessRequest.py b/capmonstercloud_client/requests/RecaptchaV2ProxylessRequest.py deleted file mode 100644 index 15d35eb..0000000 --- a/capmonstercloud_client/requests/RecaptchaV2ProxylessRequest.py +++ /dev/null @@ -1,30 +0,0 @@ -from pydantic import Field, validator -from typing import Dict -from .RecaptchaV2RequestBase import RecaptchaV2RequestBase - -class RecaptchaV2ProxylessRequest(RecaptchaV2RequestBase): - type: str = Field(default="NoCaptchaTaskProxyless") - - @validator('*') - def check_data(cls, value): - if value is not None: - if not isinstance(value, str): - raise TypeError(f'Expect that type {value} will be "str", got {type(value)}') - return value - - def getTaskDict(self) -> Dict[str, str]: - task = {} - task['type'] = self.type - task['websiteURL'] = self.websiteUrl - task['websiteKey'] = self.websiteKey - - if self.dataSValue is not None: - task['recaptchaDataSValue'] = self.dataSValue - - if self.userAgent is not None: - task['userAgent'] = self.userAgent - - if self.cookies is not None: - task['cookies'] = self.cookies - - return task diff --git a/capmonstercloud_client/requests/RecaptchaV2Request.py b/capmonstercloud_client/requests/RecaptchaV2Request.py index 27782f9..725e8e5 100644 --- a/capmonstercloud_client/requests/RecaptchaV2Request.py +++ b/capmonstercloud_client/requests/RecaptchaV2Request.py @@ -1,23 +1,28 @@ -from typing import Dict, Union +from typing import Dict, Union, Optional from pydantic import Field -from .RecaptchaV2RequestBase import RecaptchaV2RequestBase -from .proxy_info import ProxyInfo +from .baseRequestWithProxy import BaseRequestWithProxy -class RecaptchaV2Request(RecaptchaV2RequestBase, ProxyInfo): +class RecaptchaV2Request(BaseRequestWithProxy): type: str = Field(default="NoCaptchaTask") + websiteUrl: str + websiteKey: str + dataSValue: Optional[str] = Field(default=None) + userAgent: Optional[str] = Field(default=None) + cookies: Optional[str] = Field(default=None) def getTaskDict(self) -> Dict[str, Union[str, int]]: task = {} task['type'] = self.type task['websiteURL'] = self.websiteUrl task['websiteKey'] = self.websiteKey - task['proxyType'] = self.proxyType - task['proxyAddress'] = self.proxyAddress - task['proxyPort'] = self.proxyPort - task['proxyLogin'] = self.proxyLogin - task['proxyPassword'] = self.proxyPassword + if self.proxy: + task['proxyType'] = self.proxy.proxyType + task['proxyAddress'] = self.proxy.proxyAddress + task['proxyPort'] = self.proxy.proxyPort + task['proxyLogin'] = self.proxy.proxyLogin + task['proxyPassword'] = self.proxy.proxyPassword if self.dataSValue is not None: task['recaptchaDataSValue'] = self.dataSValue diff --git a/capmonstercloud_client/requests/RecaptchaV2RequestBase.py b/capmonstercloud_client/requests/RecaptchaV2RequestBase.py deleted file mode 100644 index 13c81ae..0000000 --- a/capmonstercloud_client/requests/RecaptchaV2RequestBase.py +++ /dev/null @@ -1,12 +0,0 @@ -from pydantic import Field -from typing import Optional - -from .baseRequest import BaseRequest - - -class RecaptchaV2RequestBase(BaseRequest): - websiteUrl: str - websiteKey: str - dataSValue: Optional[str] = Field(default=None) - userAgent: Optional[str] = Field(default=None) - cookies: Optional[str] = Field(default=None) \ No newline at end of file diff --git a/capmonstercloud_client/requests/RecognitionComplexImageTaskRequest.py b/capmonstercloud_client/requests/RecognitionComplexImageTaskRequest.py index a3e35d5..dec102b 100644 --- a/capmonstercloud_client/requests/RecognitionComplexImageTaskRequest.py +++ b/capmonstercloud_client/requests/RecognitionComplexImageTaskRequest.py @@ -1,7 +1,7 @@ -from typing import Optional, List, Dict, Union +from typing import Dict, Union from pydantic import validator from .ComplexImageTaskBase import ComplexImageTaskRequestBase -from ..exceptions import NumbersImagesErrors, ZeroImagesErrors, TaskNotDefinedError +from ..exceptions import ZeroImagesErrors, TaskNotDefinedError class RecognitionComplexImageTaskRequest(ComplexImageTaskRequestBase): diff --git a/capmonstercloud_client/requests/TenDiCustomTaskProxylessRequest.py b/capmonstercloud_client/requests/TenDiCustomTaskProxylessRequest.py deleted file mode 100644 index 19497d4..0000000 --- a/capmonstercloud_client/requests/TenDiCustomTaskProxylessRequest.py +++ /dev/null @@ -1,16 +0,0 @@ -from typing import Dict, Union -from pydantic import Field, validator - -from .TenDiCustomTaskRequestBase import TenDiCustomTaskRequestBase - -class TenDiCustomTaskProxylessRequest(TenDiCustomTaskRequestBase): - - def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: - task = {} - task['type'] = self.type - task['class'] = self.captchaClass - task['websiteURL'] = self.websiteUrl - task['websiteKey'] = self.websiteKey - if self.userAgent is not None: - task['userAgent'] = self.userAgent - return task \ No newline at end of file diff --git a/capmonstercloud_client/requests/TenDiCustomTaskRequest.py b/capmonstercloud_client/requests/TenDiCustomTaskRequest.py index d02e9fc..9ee01de 100644 --- a/capmonstercloud_client/requests/TenDiCustomTaskRequest.py +++ b/capmonstercloud_client/requests/TenDiCustomTaskRequest.py @@ -1,22 +1,24 @@ from typing import Dict, Union -from pydantic import Field, validator +from pydantic import Field -from .proxy_info import ProxyInfo -from .TenDiCustomTaskRequestBase import TenDiCustomTaskRequestBase +from .CustomTaskRequestBase import CustomTaskRequestBase + +class TenDiCustomTaskRequest(CustomTaskRequestBase): + captchaClass: str = Field(default='TenDI') + websiteKey: str = Field() -class TenDiCustomTaskRequest(TenDiCustomTaskRequestBase, ProxyInfo): - def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: task = {} task['type'] = self.type task['class'] = self.captchaClass task['websiteURL'] = self.websiteUrl task['websiteKey'] = self.websiteKey - task['proxyType'] = self.proxyType - task['proxyAddress'] = self.proxyAddress - task['proxyPort'] = self.proxyPort - task['proxyLogin'] = self.proxyLogin - task['proxyPassword'] = self.proxyPassword + if self.proxy: + task['proxyType'] = self.proxy.proxyType + task['proxyAddress'] = self.proxy.proxyAddress + task['proxyPort'] = self.proxy.proxyPort + task['proxyLogin'] = self.proxy.proxyLogin + task['proxyPassword'] = self.proxy.proxyPassword if self.userAgent is not None: task['userAgent'] = self.userAgent return task \ No newline at end of file diff --git a/capmonstercloud_client/requests/TenDiCustomTaskRequestBase.py b/capmonstercloud_client/requests/TenDiCustomTaskRequestBase.py deleted file mode 100644 index 3ef358d..0000000 --- a/capmonstercloud_client/requests/TenDiCustomTaskRequestBase.py +++ /dev/null @@ -1,11 +0,0 @@ -from .baseRequest import BaseRequest, Field -from typing import Optional -from pydantic import validator, model_validator -from .CustomTaskRequestBase import CustomTaskRequestBase - - -class TenDiCustomTaskRequestBase(CustomTaskRequestBase): - - type: str = Field(default='CustomTask') - captchaClass: str = Field(default='TenDI') - websiteKey: str = Field() \ No newline at end of file diff --git a/capmonstercloud_client/requests/TurnstileProxylessRequest.py b/capmonstercloud_client/requests/TurnstileProxylessRequest.py deleted file mode 100644 index c087e8f..0000000 --- a/capmonstercloud_client/requests/TurnstileProxylessRequest.py +++ /dev/null @@ -1,10 +0,0 @@ -from pydantic import Field -from typing import Dict -from .TurnstileRequestBase import TurnstileRequestBase - - -class TurnstileProxylessRequest(TurnstileRequestBase): - type: str = Field(default="TurnstileTaskProxyless") - - def getTaskDict(self) -> Dict[str, str]: - return {k: v for k, v in self.model_dump().items() if v is not None} diff --git a/capmonstercloud_client/requests/TurnstileRequest.py b/capmonstercloud_client/requests/TurnstileRequest.py index b2418d2..7920bb0 100644 --- a/capmonstercloud_client/requests/TurnstileRequest.py +++ b/capmonstercloud_client/requests/TurnstileRequest.py @@ -1,13 +1,51 @@ -from typing import Dict -from pydantic import Field -from .TurnstileRequestBase import TurnstileRequestBase -from .proxy_info import ProxyInfo +from typing import Dict, Optional +from pydantic import Field, validator, model_validator +from .baseRequestWithProxy import BaseRequestWithProxy -class TurnstileRequest(TurnstileRequestBase, ProxyInfo): +class TurnstileRequest(BaseRequestWithProxy): type: str = Field(default="TurnstileTask") + websiteURL: str + websiteKey: str + pageAction: Optional[str] = Field(default=None) + data: Optional[str] = Field(default=None) + pageData: Optional[str] = Field(default=None) + userAgent: Optional[str] = Field(default=None) + cloudflareTaskType: Optional[str] = Field(default=None) + htmlPageBase64: Optional[str] = Field(default=None) + apiJsUrl: Optional[str] = Field(default=None) + @validator('cloudflareTaskType') + def validate_cloudflare_task(cls, value): + if value is not None: + if value not in ['cf_clearance', 'token']: + raise ValueError(f'cloudflareTaskType could be "cf_clearance" if you need cookie or ' \ + f'"token" if required token from Turnstile.') + return value + + @model_validator(mode='before') + def validate_cloudflare_type_token(self): + + if self.get('htmlPageBase64') is None: + if self.get('cloudflareTaskType') == 'cf_clearance': + raise RuntimeError(f'Expect that "htmlPageBase64" will be filled ' \ + f'when cloudflareTaskType is "cf_clearance"') + + if self.get('cloudflareTaskType') == 'token': + for field in ['pageAction', 'pageData', 'data']: + if self.get(field) is None: + raise RuntimeError(f'Expect that "{field}" will be filled ' \ + f'when "cloudflareTaskType" = "token".') + + if self.get('cloudflareTaskType') is not None: + if self.get('cloudflareTaskType') in ['cf_clearance', 'token']: + if self.get('userAgent') is None: + raise RuntimeError(f'Expect that userAgent will be filled ' \ + f'when cloudflareTaskType specified.') + + return self + def getTaskDict(self) -> Dict[str, str]: return {k: v for k, v in self.model_dump().items() if v is not None} \ No newline at end of file diff --git a/capmonstercloud_client/requests/TurnstileRequestBase.py b/capmonstercloud_client/requests/TurnstileRequestBase.py deleted file mode 100644 index a26ff9d..0000000 --- a/capmonstercloud_client/requests/TurnstileRequestBase.py +++ /dev/null @@ -1,47 +0,0 @@ -from .baseRequest import BaseRequest, Field -from typing import Optional -from pydantic import validator, model_validator - - -class TurnstileRequestBase(BaseRequest): - - websiteURL: str - websiteKey: str - pageAction: Optional[str] = Field(default=None) - data: Optional[str] = Field(default=None) - pageData: Optional[str] = Field(default=None) - userAgent: Optional[str] = Field(default=None) - cloudflareTaskType: Optional[str] = Field(default=None) - htmlPageBase64: Optional[str] = Field(default=None) - apiJsUrl: Optional[str] = Field(default=None) - - @validator('cloudflareTaskType') - def validate_cloudflare_task(cls, value): - if value is not None: - if value not in ['cf_clearance', 'token']: - raise ValueError(f'cloudflareTaskType could be "cf_clearance" if you need cookie or ' \ - f'"token" if required token from Turnstile.') - return value - - @model_validator(mode='before') - def validate_cloudflare_type_token(self): - - if self.get('htmlPageBase64') is None: - if self.get('cloudflareTaskType') == 'cf_clearance': - raise RuntimeError(f'Expect that "htmlPageBase64" will be filled ' \ - f'when cloudflareTaskType is "cf_clearance"') - - if self.get('cloudflareTaskType') == 'token': - for field in ['pageAction', 'pageData', 'data']: - if self.get(field) is None: - raise RuntimeError(f'Expect that "{field}" will be filled ' \ - f'when "cloudflareTaskType" = "token".') - - if self.get('cloudflareTaskType') is not None: - if self.get('cloudflareTaskType') in ['cf_clearance', 'token']: - if self.get('userAgent') is None: - raise RuntimeError(f'Expect that userAgent will be filled ' \ - f'when cloudflareTaskType specified.') - - return self - \ No newline at end of file diff --git a/capmonstercloud_client/requests/__init__.py b/capmonstercloud_client/requests/__init__.py index 52317df..10acf4c 100644 --- a/capmonstercloud_client/requests/__init__.py +++ b/capmonstercloud_client/requests/__init__.py @@ -1,42 +1,35 @@ from .ImageToTextRequest import ImageToTextRequest -from .RecaptchaV2ProxylessRequest import RecaptchaV2ProxylessRequest from .RecaptchaV2Request import RecaptchaV2Request -from .RecaptchaV2EnterpriseProxylessRequest import RecaptchaV2EnterpriseProxylessRequest from .RecaptchaV2EnterpiseRequest import RecaptchaV2EnterpriseRequest from .RecaptchaV3ProxylessRequest import RecaptchaV3ProxylessRequest -from .HcaptchaProxylessRequest import HcaptchaProxylessRequest +from .RecaptchaComplexImageTask import RecaptchaComplexImageTaskRequest from .HcaptchaRequest import HcaptchaRequest -from .FuncaptchaProxylessRequest import FuncaptchaProxylessRequest from .FuncaptchaRequest import FuncaptchaRequest from .FuncaptchaComplexImageTask import FunCaptchaComplexImageTaskRequest -from .GeetestProxylessRequest import GeetestProxylessRequest from .GeetestRequest import GeetestRequest -from .TurnstileProxylessRequest import TurnstileProxylessRequest from .TurnstileRequest import TurnstileRequest from .HcaptchaComplexImageTask import HcaptchaComplexImageTaskRequest from .RecaptchaComplexImageTask import RecaptchaComplexImageTaskRequest from .baseRequest import BaseRequest from .DataDomeCustomTaskRequest import DataDomeCustomTaskRequest -from .DataDomeCustomTaskProxylessRequest import DataDomeCustomTaskProxylessRequest from .TenDiCustomTaskRequest import TenDiCustomTaskRequest -from .TenDiCustomTaskProxylessRequest import TenDiCustomTaskProxylessRequest from .BasiliskCustomTaskRequest import BasiliskCustomTaskRequest -from .BasiliskCustomTaskProxylessRequest import BasiliskCustomTaskProxylessRequest from .AmazonWafRequest import AmazonWafRequest -from .AmazonWafProxylessRequest import AmazonWafProxylessRequest from .BinanceTaskRequest import BinanceTaskRequest -from .BinanceTaskProxylessRequest import BinanceTaskProxylessRequest from .ImpervaCustomTaskRequest import ImpervaCustomTaskRequest -from .ImpervaCustomTaskProxylessRequest import ImpervaCustomTaskProxylessRequest from .RecognitionComplexImageTaskRequest import RecognitionComplexImageTaskRequest -REQUESTS = ['RecaptchaV2EnterpiseRequest', 'RecaptchaV2EnterpriseProxylessRequest', - 'RecaptchaV2ProxylessRequest', 'RecaptchaV2Request', 'RecaptchaV3ProxylessRequest', - 'ImageToTextRequest', 'FuncaptchaProxylessRequest', 'FuncaptchaRequest', - 'GeetestRequest', 'GeetestProxylessRequest', 'HcaptchaProxylessRequest', - 'HcaptchaRequest', 'DataDomeCustomTaskRequest', 'DataDomeCustomTaskProxylessRequest', - 'TenDiCustomTaskRequest', 'TenDiCustomTaskProxylessRequest', 'BasiliskCustomTaskRequest', - 'BasiliskCustomTaskProxylessRequest', 'AmazonWafRequest', 'AmazonWafProxylessRequest', - 'BinanceTaskRequest', 'BinanceTaskProxylessRequest', 'ImpervaCustomTaskProxylessRequest', - 'ImpervaCustomTaskRequest', 'RecognitionComplexImageTaskRequest'] +REQUESTS = ['RecaptchaV2EnterpiseRequest', 'RecaptchaV2Request', 'RecaptchaV3ProxylessRequest', 'RecaptchaComplexImageTaskRequest' + 'ImageToTextRequest', + 'FuncaptchaRequest', 'FunCaptchaComplexImageTaskRequest', + 'HcaptchaRequest', 'HcaptchaComplexImageTaskRequest' + 'GeetestRequest', + 'DataDomeCustomTaskRequest', + 'TenDiCustomTaskRequest', + 'BasiliskCustomTaskRequest', + 'AmazonWafRequest', + 'BinanceTaskRequest', + 'ImpervaCustomTaskRequest', + 'TurnstileRequest', + 'RecognitionComplexImageTaskRequest'] diff --git a/capmonstercloud_client/requests/baseRequest.py b/capmonstercloud_client/requests/baseRequest.py index 679b5e6..d3b21db 100644 --- a/capmonstercloud_client/requests/baseRequest.py +++ b/capmonstercloud_client/requests/baseRequest.py @@ -4,7 +4,8 @@ class BaseRequest(BaseModel, ABC): no_cache: bool = Field(default=False) - + type: str = Field(default='') + @abstractmethod def getTaskDict(self) -> Dict[str, Union[str, int, bool]]: pass \ No newline at end of file diff --git a/capmonstercloud_client/requests/baseRequestWithProxy.py b/capmonstercloud_client/requests/baseRequestWithProxy.py new file mode 100644 index 0000000..d069005 --- /dev/null +++ b/capmonstercloud_client/requests/baseRequestWithProxy.py @@ -0,0 +1,7 @@ +from typing import Dict, Union, Optional +from pydantic import BaseModel, Field +from .baseRequest import BaseRequest +from .proxy_info import ProxyInfo + +class BaseRequestWithProxy(BaseRequest): + proxy: Optional[ProxyInfo] = None diff --git a/capmonstercloud_client/version.txt b/capmonstercloud_client/version.txt index 359a5b9..56fea8a 100644 --- a/capmonstercloud_client/version.txt +++ b/capmonstercloud_client/version.txt @@ -1 +1 @@ -2.0.0 \ No newline at end of file +3.0.0 \ No newline at end of file diff --git a/examples/binance.py b/examples/binance.py index 4ee41ec..cf1c5ac 100644 --- a/examples/binance.py +++ b/examples/binance.py @@ -2,14 +2,14 @@ import time import asyncio -from capmonstercloudclient.requests import BinanceTaskProxylessRequest +from capmonstercloudclient.requests import BinanceTaskRequest from capmonstercloudclient import ClientOptions, CapMonsterClient async def solve_captcha_sync(num_requests): - return [await cap_monster_client.solve_captcha(datadome_request) for _ in range(num_requests)] + return [await cap_monster_client.solve_captcha(binance_request) for _ in range(num_requests)] async def solve_captcha_async(num_requests): - tasks = [asyncio.create_task(cap_monster_client.solve_captcha(datadome_request)) + tasks = [asyncio.create_task(cap_monster_client.solve_captcha(binance_request)) for _ in range(num_requests)] return await asyncio.gather(*tasks, return_exceptions=True) @@ -17,7 +17,7 @@ async def solve_captcha_async(num_requests): key = os.getenv('API_KEY') client_options = ClientOptions(api_key=key) cap_monster_client = CapMonsterClient(options=client_options) - datadome_request = BinanceTaskProxylessRequest( + binance_request = BinanceTaskRequest( websiteUrl='https://accounts.binance.com/ru/login?loginChannel=&return_to=', websiteKey='login', validateId="2b8137c0b9b44189800368819354e114" diff --git a/examples/datadome.py b/examples/datadome.py index 64d6b64..3cd5d8f 100644 --- a/examples/datadome.py +++ b/examples/datadome.py @@ -2,7 +2,7 @@ import time import asyncio -from capmonstercloudclient.requests import DataDomeCustomTaskProxylessRequest +from capmonstercloudclient.requests import DataDomeCustomTaskRequest from capmonstercloudclient import ClientOptions, CapMonsterClient async def solve_captcha_sync(num_requests): @@ -19,7 +19,7 @@ async def solve_captcha_async(num_requests): cap_monster_client = CapMonsterClient(options=client_options) metadata = {'captchaUrl': 'https://geo.captcha-delivery.com/captcha/?initialCid=AHrlqAAAAAMAJxx4dfgwjzwAQW0ctQ%3D%3D&hash=D66B23AC3F48A302A7654416846381&cid=d3k5rbDsu8cq0kmPHISS3hsC3f4qeL_K12~G33PrE4fbkmDYSul6l0Ze_aG5sUHLKG0676UpTv6GFvUgIActglZF33GTodOoRhEDkMMsuWTodlYa3YYQ9xKy9J89PAWh&t=fe&referer=https%3A%2F%2Fantoinevastel.com%2Fbots%2Fdatadome&s=21705&e=04fc682817ba89bf8fa4b18031fa53294fa0fb7449d95c036a1986413e6dfc7d', 'datadomeCookie': 'datadome=d3k5rbDsu8cq0kmPHISS3hsC3f4qeL_K12~G33PrE4fbkmDYSul6l0Ze_aG5sUHLKG0676UpTv6GFvUgIActglZF33GTodOoRhEDkMMsuWTodlYa3YYQ9xKy9J89PAWh'} - datadome_request = DataDomeCustomTaskProxylessRequest(websiteUrl='https://antoinevastel.com/bots/datadome', + datadome_request = DataDomeCustomTaskRequest(websiteUrl='https://antoinevastel.com/bots/datadome', metadata=metadata ) nums = 3 diff --git a/examples/funCaptcha.py b/examples/funCaptcha.py index 100a9cd..44db252 100644 --- a/examples/funCaptcha.py +++ b/examples/funCaptcha.py @@ -2,7 +2,7 @@ import time import asyncio -from capmonstercloudclient.requests import FuncaptchaProxylessRequest +from capmonstercloudclient.requests import FuncaptchaRequest from capmonstercloudclient import ClientOptions, CapMonsterClient async def solve_captcha_sync(num_requests): @@ -17,7 +17,7 @@ async def solve_captcha_async(num_requests): key = os.getenv('API_KEY') client_options = ClientOptions(api_key=key) cap_monster_client = CapMonsterClient(options=client_options) - funcaptcha_request = FuncaptchaProxylessRequest(websiteUrl='https://example.com/', + funcaptcha_request = FuncaptchaRequest(websiteUrl='https://example.com/', websitePublicKey='websitePublicKey', funcaptchaApiJSSubdomain='funcaptchaApiJSSubdomain') diff --git a/examples/geeTest.py b/examples/geeTest.py index 2745f2f..1e45ca5 100644 --- a/examples/geeTest.py +++ b/examples/geeTest.py @@ -2,7 +2,7 @@ import time import asyncio -from capmonstercloudclient.requests import GeetestProxylessRequest +from capmonstercloudclient.requests import GeetestRequest from capmonstercloudclient import ClientOptions, CapMonsterClient async def solve_captcha_sync(num_requests): @@ -17,7 +17,7 @@ async def solve_captcha_async(num_requests): key = os.getenv('API_KEY') client_options = ClientOptions(api_key=key) cap_monster_client = CapMonsterClient(options=client_options) - geetest_request = GeetestProxylessRequest(websiteUrl='https://example.com/', + geetest_request = GeetestRequest(websiteUrl='https://example.com/', gt='gt', challenge='challenge' ) diff --git a/examples/geeTestv4.py b/examples/geeTestv4.py index e0ae472..7c90bc6 100644 --- a/examples/geeTestv4.py +++ b/examples/geeTestv4.py @@ -2,7 +2,7 @@ import time import asyncio -from capmonstercloudclient.requests import GeetestProxylessRequest +from capmonstercloudclient.requests import GeetestRequest from capmonstercloudclient import ClientOptions, CapMonsterClient async def solve_captcha_sync(num_requests): @@ -17,7 +17,7 @@ async def solve_captcha_async(num_requests): key = os.getenv('API_KEY') client_options = ClientOptions(api_key=key) cap_monster_client = CapMonsterClient(options=client_options) - geetest_request = GeetestProxylessRequest(websiteUrl="https://faucetpay.io/account/login", + geetest_request = GeetestRequest(websiteUrl="https://faucetpay.io/account/login", gt='4eb8b0c2b27f3365b9244d9da81638c6', version=4, initParameters={'riskType ': 'slide'}, diff --git a/examples/hcaptcha.py b/examples/hcaptcha.py index 17ce667..359d049 100644 --- a/examples/hcaptcha.py +++ b/examples/hcaptcha.py @@ -2,7 +2,7 @@ import time import asyncio -from capmonstercloudclient.requests import HcaptchaProxylessRequest +from capmonstercloudclient.requests import HcaptchaRequest from capmonstercloudclient import ClientOptions, CapMonsterClient async def solve_captcha_sync(num_requests): @@ -18,11 +18,11 @@ async def solve_captcha_async(num_requests): client_options = ClientOptions(api_key=key) cap_monster_client = CapMonsterClient(options=client_options) - hcaptcha_request = HcaptchaProxylessRequest(websiteUrl='https://lessons.zennolab.com/captchas/hcaptcha/?level=difficult', + hcaptcha_request = HcaptchaRequest(websiteUrl='https://lessons.zennolab.com/captchas/hcaptcha/?level=difficult', websiteKey='b744cfe0-50b1-455e-90ac-5e5a09ccb49f') nums = 3 - + print(hcaptcha_request.getTaskDict()) # Sync test sync_start = time.time() sync_responses = asyncio.run(solve_captcha_sync(nums)) diff --git a/examples/imperva.py b/examples/imperva.py index 8eb729a..5c7335a 100644 --- a/examples/imperva.py +++ b/examples/imperva.py @@ -2,7 +2,7 @@ import time import asyncio -from capmonstercloudclient.requests import ImpervaCustomTaskProxylessRequest +from capmonstercloudclient.requests import ImpervaCustomTaskRequest from capmonstercloudclient import ClientOptions, CapMonsterClient import json @@ -21,7 +21,7 @@ async def solve_captcha_async(num_requests): metadata = {"incapsulaScriptBase64": "", "incapsulaSessionCookie": "SAyLRzdYgUntD6v0r7nFBmxTYGcAAAAArkznhRMmVs/cBynTg3r6YA==", "reese84UrlEndpoint": "Alarums-Exeunter-Hath-Brese-Banq-Wheth-frangerd-"} - imperva_request = ImpervaCustomTaskProxylessRequest( + imperva_request = ImpervaCustomTaskRequest( websiteUrl='https://example.com/login', metadata=metadata ) diff --git a/examples/proxy_usage.py b/examples/proxy_usage.py new file mode 100644 index 0000000..b35fa7c --- /dev/null +++ b/examples/proxy_usage.py @@ -0,0 +1,45 @@ +import os +import time +import asyncio + +from capmonstercloudclient.requests import BinanceTaskRequest +from capmonstercloudclient import ClientOptions, CapMonsterClient +from capmonstercloudclient.requests.proxy_info import ProxyInfo + +async def solve_captcha_sync(num_requests): + return [await cap_monster_client.solve_captcha(binance_request) for _ in range(num_requests)] + +async def solve_captcha_async(num_requests): + tasks = [asyncio.create_task(cap_monster_client.solve_captcha(binance_request)) + for _ in range(num_requests)] + return await asyncio.gather(*tasks, return_exceptions=True) + +if __name__ == '__main__': + key = os.getenv('API_KEY') + client_options = ClientOptions(api_key=key) + cap_monster_client = CapMonsterClient(options=client_options) + proxy = ProxyInfo(proxyType='https', + proxyAddress='proxyAddress', + proxyPort=8000, + proxyLogin='proxyLogin', + proxyPassword='proxyPassword' + ) + binance_request = BinanceTaskRequest( + websiteUrl='https://accounts.binance.com/ru/login?loginChannel=&return_to=', + websiteKey='login', + validateId="2b8137c0b9b44189800368819354e114", + proxy=proxy + ) + nums = 3 + print(binance_request.getTaskDict()) + # Sync test + sync_start = time.time() + sync_responses = asyncio.run(solve_captcha_sync(nums)) + print(f'average execution time sync {1/((time.time()-sync_start)/nums):0.2f} ' \ + f'resp/sec\nsolution: {sync_responses[0]}') + + # Async test + async_start = time.time() + async_responses = asyncio.run(solve_captcha_async(nums)) + print(f'average execution time async {1/((time.time()-async_start)/nums):0.2f} ' \ + f'resp/sec\nsolution: {async_responses[0]}') \ No newline at end of file diff --git a/examples/recaptchaV2.py b/examples/recaptchaV2.py index 735f1cc..ac83e4d 100644 --- a/examples/recaptchaV2.py +++ b/examples/recaptchaV2.py @@ -3,7 +3,7 @@ import asyncio from capmonstercloudclient import CapMonsterClient, ClientOptions -from capmonstercloudclient.requests import RecaptchaV2ProxylessRequest +from capmonstercloudclient.requests import RecaptchaV2Request async def solve_captcha_sync(num_requests): return [await cap_monster_client.solve_captcha(recaptcha2request) for _ in range(num_requests)] @@ -19,7 +19,7 @@ async def solve_captcha_async(num_requests): client_options = ClientOptions(api_key=key) cap_monster_client = CapMonsterClient(options=client_options) - recaptcha2request = RecaptchaV2ProxylessRequest(websiteUrl="https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high", + recaptcha2request = RecaptchaV2Request(websiteUrl="https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high", websiteKey="6Lcg7CMUAAAAANphynKgn9YAgA4tQ2KI_iqRyTwd") nums = 3 diff --git a/examples/recaptchaV2Enterprise.py b/examples/recaptchaV2Enterprise.py index fad1b17..4aebc7e 100644 --- a/examples/recaptchaV2Enterprise.py +++ b/examples/recaptchaV2Enterprise.py @@ -3,7 +3,7 @@ import asyncio from capmonstercloudclient import CapMonsterClient, ClientOptions -from capmonstercloudclient.requests import RecaptchaV2EnterpriseProxylessRequest +from capmonstercloudclient.requests import RecaptchaV2EnterpriseRequest async def solve_captcha_sync(num_requests): return [await cap_monster_client.solve_captcha(recaptcha2request) for _ in range(num_requests)] @@ -20,7 +20,7 @@ async def solve_captcha_async(num_requests): client_options = ClientOptions(api_key=key) cap_monster_client = CapMonsterClient(options=client_options) - recaptcha2request = RecaptchaV2EnterpriseProxylessRequest(websiteUrl='https://example.com/', + recaptcha2request = RecaptchaV2EnterpriseRequest(websiteUrl='https://example.com/', websiteKey="websiteKey") nums = 3 diff --git a/examples/recaptchaV3.py b/examples/recaptchaV3.py index 272b232..8f95798 100644 --- a/examples/recaptchaV3.py +++ b/examples/recaptchaV3.py @@ -3,7 +3,7 @@ import asyncio from capmonstercloudclient import CapMonsterClient, ClientOptions -from capmonstercloudclient.requests import RecaptchaV3ProxylessRequest +from capmonstercloudclient.requests import RecaptchaV3Request async def solve_captcha_sync(num_requests): return [await cap_monster_client.solve_captcha(recaptcha3request) for _ in range(num_requests)] @@ -19,7 +19,7 @@ async def solve_captcha_async(num_requests): client_options = ClientOptions(api_key=key) cap_monster_client = CapMonsterClient(options=client_options) - recaptcha3request = RecaptchaV3ProxylessRequest(websiteUrl="https://lessons.zennolab.com/captchas/recaptcha/v3.php?level=beta", + recaptcha3request = RecaptchaV3Request(websiteUrl="https://lessons.zennolab.com/captchas/recaptcha/v3.php?level=beta", websiteKey="6Le0xVgUAAAAAIt20XEB4rVhYOODgTl00d8juDob", min_score=0.9) diff --git a/examples/turnstile.py b/examples/turnstile.py index 9e80237..f953d63 100644 --- a/examples/turnstile.py +++ b/examples/turnstile.py @@ -2,17 +2,17 @@ import asyncio import time -from capmonstercloudclient.requests import TurnstileProxylessRequest +from capmonstercloudclient.requests import TurnstileRequest from capmonstercloudclient import CapMonsterClient, ClientOptions async def solve_captcha(client: CapMonsterClient, - request: TurnstileProxylessRequest, + request: TurnstileRequest, num_requests: int) -> dict: return [await client.solve_captcha(request) for _ in range(num_requests)] async def solve_captcha_async(client: CapMonsterClient, - request: TurnstileProxylessRequest, + request: TurnstileRequest, num_requests: int) -> dict: tasks = [asyncio.create_task(client.solve_captcha(request)) for _ in range(num_requests)] @@ -25,7 +25,7 @@ async def solve_captcha_async(client: CapMonsterClient, client_options = ClientOptions(api_key=api_key) client = CapMonsterClient(client_options) - turnstile_request = TurnstileProxylessRequest(websiteURL='http://tsmanaged.zlsupport.com/', + turnstile_request = TurnstileRequest(websiteURL='http://tsmanaged.zlsupport.com/', websiteKey='0x4AAAAAAABUYP0XeMJF0xoy') sync_start = time.time() diff --git a/test/amazonwaf_response_test.py b/test/amazonwaf_response_test.py index 05bd800..f59999a 100644 --- a/test/amazonwaf_response_test.py +++ b/test/amazonwaf_response_test.py @@ -3,7 +3,7 @@ import os from pydantic.error_wrappers import ValidationError -from capmonstercloudclient.requests import AmazonWafProxylessRequest +from capmonstercloudclient.requests import AmazonWafRequest from capmonstercloudclient import CapMonsterClient, ClientOptions def get_all_keys(dictionary): @@ -33,7 +33,7 @@ def testOuts(self): challenge = "https://41bcdd4fb3cb.610cd090.us-east-1.token.awswaf.com/41bcdd4fb3cb/0d21de737ccb/cd77baa6c832/challenge.js" captcha = "https://41bcdd4fb3cb.610cd090.us-east-1.captcha.awswaf.com/41bcdd4fb3cb/0d21de737ccb/cd77baa6c832/captcha.js" - request = AmazonWafProxylessRequest(websiteUrl='https://efw47fpad9.execute-api.us-east-1.amazonaws.com/latest', + request = AmazonWafRequest(websiteUrl='https://efw47fpad9.execute-api.us-east-1.amazonaws.com/latest', websiteKey=goku_props['key'], challengeScript=challenge, captchaScript=captcha, diff --git a/test/amazonwaf_test.py b/test/amazonwaf_test.py index 7aa3c91..4d6cb54 100644 --- a/test/amazonwaf_test.py +++ b/test/amazonwaf_test.py @@ -1,7 +1,7 @@ import unittest from pydantic.error_wrappers import ValidationError -from capmonstercloudclient.requests import AmazonWafProxylessRequest +from capmonstercloudclient.requests import AmazonWafRequest from capmonstercloudclient.exceptions import NumbersImagesErrors, TaskNotDefinedError, ZeroImagesErrors, \ UserAgentNotDefinedError @@ -17,14 +17,14 @@ class AmazonWafRequestTest(unittest.TestCase): def testCaptchaInputTypes(self): with self.assertRaises(ValidationError): - request = AmazonWafProxylessRequest(websiteUrl=AmazonWafRequestTest.websiteUrlExample) + request = AmazonWafRequest(websiteUrl=AmazonWafRequestTest.websiteUrlExample) with self.assertRaises(ValidationError): - request = AmazonWafProxylessRequest( + request = AmazonWafRequest( websiteKey=AmazonWafRequestTest.websiteKeyExample, ) with self.assertRaises(ValidationError): - request = AmazonWafProxylessRequest(websiteUrl=AmazonWafRequestTest.websiteUrlExample, + request = AmazonWafRequest(websiteUrl=AmazonWafRequestTest.websiteUrlExample, websiteKey=AmazonWafRequestTest.websiteKeyExample, challengeScript=AmazonWafRequestTest.challengeScriptExample, captchaScript=int(AmazonWafRequestTest.captchaScriptExample), @@ -33,7 +33,7 @@ def testCaptchaInputTypes(self): ) - request = AmazonWafProxylessRequest(websiteUrl=AmazonWafRequestTest.websiteUrlExample, + request = AmazonWafRequest(websiteUrl=AmazonWafRequestTest.websiteUrlExample, websiteKey=AmazonWafRequestTest.websiteKeyExample, challengeScript=AmazonWafRequestTest.challengeScriptExample, captchaScript=AmazonWafRequestTest.captchaScriptExample, @@ -44,7 +44,7 @@ def testCaptchaInputTypes(self): def testAllRequiredFieldsFilling(self): required_fields = ['websiteURL', 'type', 'websiteKey', 'challengeScript', 'captchaScript', 'context', 'iv'] - request = AmazonWafProxylessRequest(websiteUrl=AmazonWafRequestTest.websiteUrlExample, + request = AmazonWafRequest(websiteUrl=AmazonWafRequestTest.websiteUrlExample, websiteKey=AmazonWafRequestTest.websiteKeyExample, challengeScript=AmazonWafRequestTest.challengeScriptExample, captchaScript=AmazonWafRequestTest.captchaScriptExample, diff --git a/test/basilisk_test.py b/test/basilisk_test.py index 0493456..1312663 100644 --- a/test/basilisk_test.py +++ b/test/basilisk_test.py @@ -1,7 +1,7 @@ import unittest from pydantic.error_wrappers import ValidationError -from capmonstercloudclient.requests import BasiliskCustomTaskProxylessRequest +from capmonstercloudclient.requests import BasiliskCustomTaskRequest from capmonstercloudclient.exceptions import NumbersImagesErrors, TaskNotDefinedError, ZeroImagesErrors, \ UserAgentNotDefinedError @@ -14,22 +14,22 @@ class BasiliskCustomTaskRequestTest(unittest.TestCase): def testCaptchaInputTypes(self): with self.assertRaises(ValidationError): - request = BasiliskCustomTaskProxylessRequest(websiteUrl=BasiliskCustomTaskRequestTest.websiteUrlExample) + request = BasiliskCustomTaskRequest(websiteUrl=BasiliskCustomTaskRequestTest.websiteUrlExample) with self.assertRaises(ValidationError): - request = BasiliskCustomTaskProxylessRequest( + request = BasiliskCustomTaskRequest( websiteKey=BasiliskCustomTaskRequestTest.websiteKeyExample, ) - request = BasiliskCustomTaskProxylessRequest(websiteUrl=BasiliskCustomTaskRequestTest.websiteUrlExample, + request = BasiliskCustomTaskRequest(websiteUrl=BasiliskCustomTaskRequestTest.websiteUrlExample, websiteKey=BasiliskCustomTaskRequestTest.websiteKeyExample, userAgent=BasiliskCustomTaskRequestTest.userAgentExample ) def testAllRequiredFieldsFilling(self): required_fields = ['class', 'type', 'websiteURL', 'websiteKey'] - request = BasiliskCustomTaskProxylessRequest(websiteUrl=BasiliskCustomTaskRequestTest.websiteUrlExample, + request = BasiliskCustomTaskRequest(websiteUrl=BasiliskCustomTaskRequestTest.websiteUrlExample, websiteKey=BasiliskCustomTaskRequestTest.websiteKeyExample) request_dict = request.getTaskDict() for i in required_fields: diff --git a/test/binance_request_test.py b/test/binance_request_test.py index acf5793..390646e 100644 --- a/test/binance_request_test.py +++ b/test/binance_request_test.py @@ -2,7 +2,7 @@ from copy import deepcopy from pydantic import ValidationError -from capmonstercloudclient.requests import BinanceTaskProxylessRequest +from capmonstercloudclient.requests import BinanceTaskRequest class BinanceRequestTest(unittest.TestCase): @@ -17,7 +17,7 @@ def test_binance(self, 'websiteURL', 'websiteKey', 'validateId'] - request = BinanceTaskProxylessRequest(websiteKey=self.websiteKeyExample, + request = BinanceTaskRequest(websiteKey=self.websiteKeyExample, websiteUrl=self.websiteUrlExample, validateId='asdgf') task_dictionary = request.getTaskDict() @@ -31,15 +31,15 @@ def test_binance_missing(self,): 'websiteKey', 'validateId'] base_kwargs = {} - self.assertRaises(ValidationError, BinanceTaskProxylessRequest, **base_kwargs) + self.assertRaises(ValidationError, BinanceTaskRequest, **base_kwargs) base_kwargs.update({'websiteUrl': self.websiteUrlExample}) - self.assertRaises(ValidationError, BinanceTaskProxylessRequest, **base_kwargs) + self.assertRaises(ValidationError, BinanceTaskRequest, **base_kwargs) base_kwargs.update({'websiteKey': self.websiteKeyExample}) - self.assertRaises(ValidationError, BinanceTaskProxylessRequest, **base_kwargs) + self.assertRaises(ValidationError, BinanceTaskRequest, **base_kwargs) base_kwargs.update({'validateId': 'asdgf'}) - BinanceTaskProxylessRequest(**base_kwargs) + BinanceTaskRequest(**base_kwargs) base_kwargs.update({'userAgent': self.userAgentExample}) - BinanceTaskProxylessRequest(**base_kwargs) + BinanceTaskRequest(**base_kwargs) if __name__ == '__main__': unittest.main() \ No newline at end of file diff --git a/test/binance_response_test.py b/test/binance_response_test.py index bef3a50..54cdb6f 100644 --- a/test/binance_response_test.py +++ b/test/binance_response_test.py @@ -3,8 +3,9 @@ import os from pydantic.error_wrappers import ValidationError -from capmonstercloudclient.requests import BinanceTaskProxylessRequest +from capmonstercloudclient.requests import BinanceTaskRequest from capmonstercloudclient import CapMonsterClient, ClientOptions +from capmonstercloudclient.requests.proxy_info import ProxyInfo def get_all_keys(dictionary): all_values = [] @@ -25,7 +26,7 @@ def testOuts(self): api_key = os.getenv('API_KEY') options = ClientOptions(api_key=api_key) client = CapMonsterClient(options) - request = BinanceTaskProxylessRequest(websiteUrl='https://accounts.binance.com/ru/login?loginChannel=&return_to=', + request = BinanceTaskRequest(websiteUrl='https://accounts.binance.com/ru/login?loginChannel=&return_to=', websiteKey='login', validateId="2b8137c0b9b44189800368819354e114" ) @@ -33,6 +34,26 @@ def testOuts(self): for i in required_outs: self.assertTrue(i in get_all_keys(result)) + def testOutsProxy(self): + required_outs = ['token', 'userAgent'] + api_key = os.getenv('API_KEY') + options = ClientOptions(api_key=api_key) + client = CapMonsterClient(options) + proxy = ProxyInfo(proxyType='https', + proxyAddress='proxyAddress', + proxyPort=8000, + proxyLogin='proxyLogin', + proxyPassword='proxyPassword' + ) + request = BinanceTaskRequest(websiteUrl='https://accounts.binance.com/ru/login?loginChannel=&return_to=', + websiteKey='login', + validateId="2b8137c0b9b44189800368819354e114", + proxy=proxy + ) + result = asyncio.run(client.solve_captcha(request)) + for i in required_outs: + self.assertTrue(i in get_all_keys(result)) + if __name__ == '__main__': unittest.main() diff --git a/test/cmclient_test.py b/test/cmclient_test.py index ce1dcf3..d970668 100644 --- a/test/cmclient_test.py +++ b/test/cmclient_test.py @@ -2,7 +2,7 @@ import unittest import os -from capmonstercloudclient.requests import RecaptchaV2ProxylessRequest +from capmonstercloudclient.requests import RecaptchaV2Request from capmonstercloudclient import CapMonsterClient, ClientOptions from capmonstercloudclient.exceptions import UnknownRequestInstanceError @@ -15,7 +15,7 @@ class InstanceRequestTest(unittest.IsolatedAsyncioTestCase): def testSuccessResponse(self): options = ClientOptions(api_key=api_key) client = CapMonsterClient(options=options) - request = RecaptchaV2ProxylessRequest(websiteUrl="https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high", + request = RecaptchaV2Request(websiteUrl="https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high", websiteKey="6Lcg7CMUAAAAANphynKgn9YAgA4tQ2KI_iqRyTwd") # Success response_1 = asyncio.run(client.solve_captcha(request)) diff --git a/test/datadome_response_test.py b/test/datadome_response_test.py index 373af6e..c36c59d 100644 --- a/test/datadome_response_test.py +++ b/test/datadome_response_test.py @@ -3,7 +3,7 @@ import os from pydantic.error_wrappers import ValidationError -from capmonstercloudclient.requests import DataDomeCustomTaskProxylessRequest +from capmonstercloudclient.requests import DataDomeCustomTaskRequest from capmonstercloudclient import CapMonsterClient, ClientOptions def get_all_keys(dictionary): @@ -28,7 +28,7 @@ def testOuts(self): metadata = {'captchaUrl': 'https://geo.captcha-delivery.com/captcha/?initialCid=AHrlqAAAAAMAJxx4dfgwjzwAQW0ctQ%3D%3D&hash=D66B23AC3F48A302A7654416846381&cid=d3k5rbDsu8cq0kmPHISS3hsC3f4qeL_K12~G33PrE4fbkmDYSul6l0Ze_aG5sUHLKG0676UpTv6GFvUgIActglZF33GTodOoRhEDkMMsuWTodlYa3YYQ9xKy9J89PAWh&t=fe&referer=https%3A%2F%2Fantoinevastel.com%2Fbots%2Fdatadome&s=21705&e=04fc682817ba89bf8fa4b18031fa53294fa0fb7449d95c036a1986413e6dfc7d', 'datadomeCookie': 'datadome=d3k5rbDsu8cq0kmPHISS3hsC3f4qeL_K12~G33PrE4fbkmDYSul6l0Ze_aG5sUHLKG0676UpTv6GFvUgIActglZF33GTodOoRhEDkMMsuWTodlYa3YYQ9xKy9J89PAWh'} - request = DataDomeCustomTaskProxylessRequest(websiteUrl='https://antoinevastel.com/bots/datadome', + request = DataDomeCustomTaskRequest(websiteUrl='https://antoinevastel.com/bots/datadome', metadata=metadata) result = asyncio.run(client.solve_captcha(request)) diff --git a/test/datadome_test.py b/test/datadome_test.py index 41d799a..2ebaaaf 100644 --- a/test/datadome_test.py +++ b/test/datadome_test.py @@ -1,7 +1,7 @@ import unittest from pydantic.error_wrappers import ValidationError -from capmonstercloudclient.requests import DataDomeCustomTaskProxylessRequest +from capmonstercloudclient.requests import DataDomeCustomTaskRequest from capmonstercloudclient.exceptions import NumbersImagesErrors, TaskNotDefinedError, ZeroImagesErrors, \ UserAgentNotDefinedError @@ -23,17 +23,17 @@ def testCaptchaInputTypes(self): metadataListExtra = DataDomeCustomTaskRequestTest.metadataExample.copy() metadataListExtra['htmlPageBase64'] = metadataListExtra['captchaUrl'] with self.assertRaises(ValidationError): - request = DataDomeCustomTaskProxylessRequest(websiteUrl=DataDomeCustomTaskRequestTest.websiteUrlExample, + request = DataDomeCustomTaskRequest(websiteUrl=DataDomeCustomTaskRequestTest.websiteUrlExample, metadata=metadataListUrl, ) with self.assertRaises(ValidationError): - request = DataDomeCustomTaskProxylessRequest(websiteUrl=DataDomeCustomTaskRequestTest.websiteUrlExample, + request = DataDomeCustomTaskRequest(websiteUrl=DataDomeCustomTaskRequestTest.websiteUrlExample, metadata=metadataListImage, ) with self.assertRaises(ValidationError): - request = DataDomeCustomTaskProxylessRequest(websiteUrl=DataDomeCustomTaskRequestTest.websiteUrlExample, + request = DataDomeCustomTaskRequest(websiteUrl=DataDomeCustomTaskRequestTest.websiteUrlExample, metadata=metadataListExtra, ) @@ -41,7 +41,7 @@ def testAllRequiredFieldsFilling(self): required_fields = ['class', 'type', 'websiteURL', 'metadata'] metadata_fields = ['datadomeCookie'] one_of_fields = [['captchaUrl', 'htmlPageBase64']] - request = DataDomeCustomTaskProxylessRequest(websiteUrl=DataDomeCustomTaskRequestTest.websiteUrlExample, + request = DataDomeCustomTaskRequest(websiteUrl=DataDomeCustomTaskRequestTest.websiteUrlExample, metadata=DataDomeCustomTaskRequestTest.metadataExample) request_dict = request.getTaskDict() for i in required_fields: diff --git a/test/geetest_integration_test.py b/test/geetest_integration_test.py index 6e7ba5c..7483d42 100644 --- a/test/geetest_integration_test.py +++ b/test/geetest_integration_test.py @@ -2,11 +2,11 @@ import asyncio import unittest -from capmonstercloudclient.requests import GeetestProxylessRequest +from capmonstercloudclient.requests import GeetestRequest from capmonstercloudclient import ClientOptions, CapMonsterClient -def solve(client: CapMonsterClient, request: GeetestProxylessRequest): +def solve(client: CapMonsterClient, request: GeetestRequest): return asyncio.run(client.solve_captcha(request)) class GeeTestIntegrationTest(unittest.TestCase): @@ -18,7 +18,7 @@ class GeeTestIntegrationTest(unittest.TestCase): def test_check_response_outputs(self): required_keys = ['captcha_id', 'lot_number', 'pass_token', 'gen_time', 'captcha_output'] - geetest_request = GeetestProxylessRequest(websiteUrl="https://faucetpay.io/account/login", + geetest_request = GeetestRequest(websiteUrl="https://faucetpay.io/account/login", gt='4eb8b0c2b27f3365b9244d9da81638c6', version=4, initParameters={'riskType ': 'slide'}, diff --git a/test/hc_response_test.py b/test/hc_response_test.py index 3bbb0fc..a9c706b 100644 --- a/test/hc_response_test.py +++ b/test/hc_response_test.py @@ -3,7 +3,7 @@ import os from pydantic.error_wrappers import ValidationError -from capmonstercloudclient.requests import HcaptchaProxylessRequest +from capmonstercloudclient.requests import HcaptchaRequest from capmonstercloudclient import CapMonsterClient, ClientOptions class HcaptchaOutsTest(unittest.TestCase): @@ -13,7 +13,7 @@ def testOuts(self): api_key = os.getenv('API_KEY') options = ClientOptions(api_key=api_key) client = CapMonsterClient(options) - request = HcaptchaProxylessRequest(websiteUrl='https://lessons.zennolab.com/captchas/hcaptcha/?level=difficult', + request = HcaptchaRequest(websiteUrl='https://lessons.zennolab.com/captchas/hcaptcha/?level=difficult', websiteKey='b744cfe0-50b1-455e-90ac-5e5a09ccb49f') result = asyncio.run(client.solve_captcha(request)) diff --git a/test/imperva_request_test.py b/test/imperva_request_test.py index d4fe517..b08aaf3 100644 --- a/test/imperva_request_test.py +++ b/test/imperva_request_test.py @@ -2,7 +2,7 @@ from copy import deepcopy from pydantic import ValidationError -from capmonstercloudclient.requests import ImpervaCustomTaskProxylessRequest +from capmonstercloudclient.requests import ImpervaCustomTaskRequest class ImpervaRequestTest(unittest.TestCase): @@ -20,7 +20,7 @@ def test_imperva(self, 'metadata'] metadata_required_fields = ['incapsulaScriptBase64', 'incapsulaSessionCookie'] metadata_example = {"incapsulaScriptBase64": self.incapsulaScriptBase64Example,"incapsulaSessionCookie": self.incapsulaSessionCookieExample} - request = ImpervaCustomTaskProxylessRequest(websiteUrl=self.websiteUrlExample, metadata=metadata_example) + request = ImpervaCustomTaskRequest(websiteUrl=self.websiteUrlExample, metadata=metadata_example) task_dictionary = request.getTaskDict() for f in required_fields: self.assertTrue(f in list(task_dictionary.keys()), @@ -31,13 +31,13 @@ def test_imperva(self, def test_imperva_metadata(self,): base_kwargs = {"websiteUrl": self.websiteUrlExample, "metadata": {}} - self.assertRaises(TypeError, ImpervaCustomTaskProxylessRequest, **base_kwargs) + self.assertRaises(TypeError, ImpervaCustomTaskRequest, **base_kwargs) base_kwargs['metadata']['incapsulaScriptBase64'] = self.incapsulaScriptBase64Example - self.assertRaises(TypeError, ImpervaCustomTaskProxylessRequest, **base_kwargs) + self.assertRaises(TypeError, ImpervaCustomTaskRequest, **base_kwargs) base_kwargs['metadata']['incapsulaSessionCookie'] = self.incapsulaSessionCookieExample - ImpervaCustomTaskProxylessRequest(**base_kwargs) + ImpervaCustomTaskRequest(**base_kwargs) base_kwargs['metadata']['reese84UrlEndpoint'] = self.reese84UrlEndpointExample - ImpervaCustomTaskProxylessRequest(**base_kwargs) + ImpervaCustomTaskRequest(**base_kwargs) def test_imperva_missing(self,): required_fields = ['type', @@ -45,11 +45,11 @@ def test_imperva_missing(self,): 'metadata'] base_kwargs = {} metadata_example = {"incapsulaScriptBase64": self.incapsulaScriptBase64Example,"incapsulaSessionCookie": self.incapsulaSessionCookieExample} - self.assertRaises(ValidationError, ImpervaCustomTaskProxylessRequest, **base_kwargs) + self.assertRaises(ValidationError, ImpervaCustomTaskRequest, **base_kwargs) base_kwargs.update({'websiteUrl': self.websiteUrlExample}) - self.assertRaises(ValidationError, ImpervaCustomTaskProxylessRequest, **base_kwargs) + self.assertRaises(ValidationError, ImpervaCustomTaskRequest, **base_kwargs) base_kwargs.update({'metadata': metadata_example}) - ImpervaCustomTaskProxylessRequest(**base_kwargs) + ImpervaCustomTaskRequest(**base_kwargs) if __name__ == '__main__': unittest.main() \ No newline at end of file diff --git a/test/requests_generation_test.py b/test/requests_generation_test.py index 46accc3..74849d1 100644 --- a/test/requests_generation_test.py +++ b/test/requests_generation_test.py @@ -15,8 +15,8 @@ def test_rcv2(self): 'recaptchaDataSValue', 'userAgent', 'cookies'] - rc2_no_proxy_type = 'NoCaptchaTaskProxyless' - request = requests.RecaptchaV2ProxylessRequest(websiteUrl='some_url', + rc2_no_proxy_type = 'NoCaptchaTask' + request = requests.RecaptchaV2Request(websiteUrl='some_url', websiteKey='sime_key', dataSValue='sdfa', userAgent='fasdf', @@ -25,7 +25,7 @@ def test_rcv2(self): for key in default_keys: self.assertIsNotNone(task.get(key), msg=f'Missing {key} for ReCaptchaV2 request.') self.assertTrue(rc2_no_proxy_type==task.get('type'), - msg=f'Task type of ReCaptchaV2Proxyless not equal to {rc2_no_proxy_type}') + msg=f'Task type of ReCaptchaV2 not equal to {rc2_no_proxy_type}') rc2_proxy_type = 'NoCaptchaTask' default_proxy_keys = default_keys + PROXY_LIST @@ -42,32 +42,32 @@ def test_rcv2(self): def test_rcv3(self): default_keys = ['type', 'websiteURL', 'websiteKey', 'minScore', 'pageAction'] - rc3_type = 'RecaptchaV3TaskProxyless' - request = requests.RecaptchaV3ProxylessRequest(websiteUrl='some_url', + rc3_type = 'RecaptchaV3Task' + request = requests.RecaptchaV3Request(websiteUrl='some_url', websiteKey='some_key', min_score=0.2, pageAction='asdfsfd') task = request.getTaskDict() for key in default_keys: - self.assertIsNotNone(task.get(key), msg=f'Missing {key} for ReCaptchaV3Proxyless request.') + self.assertIsNotNone(task.get(key), msg=f'Missing {key} for ReCaptchaV3 request.') self.assertEqual(rc3_type, task.get('type'), - msg=f'Task type of ReCaptchaV3Proxyless not equal to {rc3_type}') + msg=f'Task type of ReCaptchaV3 not equal to {rc3_type}') def test_rcv2_enterprise(self): - rcv2e_type = 'RecaptchaV2EnterpriseTaskProxyless' + rcv2e_type = 'RecaptchaV2EnterpriseTask' default_keys = ['type', 'websiteURL', 'websiteKey', 'enterprisePayload', 'apiDomain'] - request = requests.RecaptchaV2EnterpriseProxylessRequest(websiteUrl='some_url', + request = requests.RecaptchaV2EnterpriseRequest(websiteUrl='some_url', websiteKey='some_key', enterprisePayload='payload', apiDomain='asdfasdf') task = request.getTaskDict() for key in default_keys: - self.assertIsNotNone(task.get(key), msg=f'Missing {key} for RecaptchaV2EnterpriseTaskProxyless request.') + self.assertIsNotNone(task.get(key), msg=f'Missing {key} for RecaptchaV2EnterpriseTask request.') self.assertEqual(rcv2e_type, task.get('type'), - msg=f'Task type of RecaptchaV2EnterpriseTaskProxyless not equal to {rcv2e_type}') + msg=f'Task type of RecaptchaV2EnterpriseTask not equal to {rcv2e_type}') proxy_request = requests.RecaptchaV2EnterpriseRequest( websiteUrl='some_url', websiteKey='some_key', @@ -85,18 +85,18 @@ def test_rcv2_enterprise(self): msg=f'Task type of RecaptchaV2EnterpriseTask not equal to {proxy_type}') def test_fc(self): - noproxy_type = 'FunCaptchaTaskProxyless' + noproxy_type = 'FunCaptchaTask' default_keys = ['type', 'websiteURL', 'funcaptchaApiJSSubdomain', 'websitePublicKey', 'data'] - request = requests.FuncaptchaProxylessRequest(websiteUrl='some_url', + request = requests.FuncaptchaRequest(websiteUrl='some_url', websitePublicKey='some_key', funcaptchaApiJSSubdomain='domain', data='asdfasdf') task = request.getTaskDict() for key in default_keys: self.assertIsNotNone(task.get(key), - msg=f'Missing {key} for FunCaptchaTaskProxyless request.') + msg=f'Missing {key} for FunCaptchaTask request.') self.assertEqual(noproxy_type, task.get('type'), - msg=f'Task type of FunCaptchaTaskProxyless not equal to {noproxy_type}') + msg=f'Task type of FunCaptchaTask not equal to {noproxy_type}') proxy_type = 'FunCaptchaTask' proxy_keys = default_keys + PROXY_LIST @@ -115,9 +115,9 @@ def test_fc(self): def test_hc(self): - noproxy_type = 'HCaptchaTaskProxyless' + noproxy_type = 'HCaptchaTask' default_keys = ['type', 'websiteURL', 'websiteKey', 'isInvisible', 'data', 'userAgent', 'cookies'] - request = requests.HcaptchaProxylessRequest(websiteUrl='some_url', + request = requests.HcaptchaRequest(websiteUrl='some_url', websiteKey='some_key', is_invisible=False, data='data', @@ -126,9 +126,9 @@ def test_hc(self): task = request.getTaskDict() for key in default_keys: self.assertIsNotNone(task.get(key), - msg=f'Missing {key} for HCaptchaTaskProxyless request.') + msg=f'Missing {key} for HCaptchaTask request.') self.assertEqual(noproxy_type, task.get('type'), - msg=f'Task type of HCaptchaTaskProxyless not equal to {noproxy_type}') + msg=f'Task type of HCaptchaTask not equal to {noproxy_type}') proxy_request = requests.HcaptchaRequest( websiteUrl='some_url', websiteKey='some_key', @@ -165,11 +165,11 @@ def test_image2text(self): def test_gt(self): - noproxy_type = 'GeeTestTaskProxyless' + noproxy_type = 'GeeTestTask' default_keys = ['type', 'websiteURL', 'gt', 'challenge', 'geetestApiServerSubdomain', 'geetestGetLib', 'userAgent'] - request = requests.GeetestProxylessRequest(websiteUrl='some_url', + request = requests.GeetestRequest(websiteUrl='some_url', gt='some_key', challenge='challenge', geetestApiServerSubdomain='api.domain', @@ -178,9 +178,9 @@ def test_gt(self): task = request.getTaskDict() for key in default_keys: self.assertIsNotNone(task.get(key), - msg=f'Missing {key} for GeeTestTaskProxyless request.') + msg=f'Missing {key} for GeeTestTask request.') self.assertEqual(noproxy_type, task.get('type'), - msg=f'Task type of GeeTestTaskProxyless not equal to {noproxy_type}') + msg=f'Task type of GeeTestTask not equal to {noproxy_type}') proxy_request = requests.GeetestRequest( websiteUrl='some_url', gt='some_key', challenge='challenge', diff --git a/test/tendi_response_test.py b/test/tendi_response_test.py index 27f3fe5..7720952 100644 --- a/test/tendi_response_test.py +++ b/test/tendi_response_test.py @@ -3,7 +3,7 @@ import os from pydantic.error_wrappers import ValidationError -from capmonstercloudclient.requests import TenDiCustomTaskProxylessRequest +from capmonstercloudclient.requests import TenDiCustomTaskRequest from capmonstercloudclient import CapMonsterClient, ClientOptions def get_all_keys(dictionary): @@ -26,7 +26,7 @@ def testOuts(self): options = ClientOptions(api_key=api_key) client = CapMonsterClient(options) - request = TenDiCustomTaskProxylessRequest(websiteUrl='https://www.tencentcloud.com/account/login?s_url=https%3A%2F%2Fconsole.tencentcloud.com%2F', + request = TenDiCustomTaskRequest(websiteUrl='https://www.tencentcloud.com/account/login?s_url=https%3A%2F%2Fconsole.tencentcloud.com%2F', websiteKey='2009899766') result = asyncio.run(client.solve_captcha(request)) for i in required_outs: diff --git a/test/tendi_test.py b/test/tendi_test.py index a6ee5f6..0a90b50 100644 --- a/test/tendi_test.py +++ b/test/tendi_test.py @@ -1,7 +1,7 @@ import unittest from pydantic.error_wrappers import ValidationError -from capmonstercloudclient.requests import TenDiCustomTaskProxylessRequest +from capmonstercloudclient.requests import TenDiCustomTaskRequest from capmonstercloudclient.exceptions import NumbersImagesErrors, TaskNotDefinedError, ZeroImagesErrors, \ UserAgentNotDefinedError @@ -14,22 +14,22 @@ class TenDiCustomTaskRequestTest(unittest.TestCase): def testCaptchaInputTypes(self): with self.assertRaises(ValidationError): - request = TenDiCustomTaskProxylessRequest(websiteUrl=TenDiCustomTaskRequestTest.websiteUrlExample) + request = TenDiCustomTaskRequest(websiteUrl=TenDiCustomTaskRequestTest.websiteUrlExample) with self.assertRaises(ValidationError): - request = TenDiCustomTaskProxylessRequest( + request = TenDiCustomTaskRequest( websiteKey=TenDiCustomTaskRequestTest.websiteKeyExample, ) - request = TenDiCustomTaskProxylessRequest(websiteUrl=TenDiCustomTaskRequestTest.websiteUrlExample, + request = TenDiCustomTaskRequest(websiteUrl=TenDiCustomTaskRequestTest.websiteUrlExample, websiteKey=TenDiCustomTaskRequestTest.websiteKeyExample, userAgent=TenDiCustomTaskRequestTest.userAgentExample ) def testAllRequiredFieldsFilling(self): required_fields = ['class', 'type', 'websiteURL', 'websiteKey'] - request = TenDiCustomTaskProxylessRequest(websiteUrl=TenDiCustomTaskRequestTest.websiteUrlExample, + request = TenDiCustomTaskRequest(websiteUrl=TenDiCustomTaskRequestTest.websiteUrlExample, websiteKey=TenDiCustomTaskRequestTest.websiteKeyExample) request_dict = request.getTaskDict() for i in required_fields: diff --git a/test/turnstile_test.py b/test/turnstile_test.py index 216772d..7fe8cbe 100644 --- a/test/turnstile_test.py +++ b/test/turnstile_test.py @@ -2,7 +2,7 @@ from copy import deepcopy from pydantic import ValidationError -from capmonstercloudclient.requests import TurnstileProxylessRequest +from capmonstercloudclient.requests import TurnstileRequest class TurnstileResponseTest(unittest.TestCase): @@ -12,7 +12,7 @@ def test_turnstile(self, required_fields = ['type', 'websiteURL', 'websiteKey'] - request = TurnstileProxylessRequest(websiteKey='0x4AAAAAAABUYP0XeMJF0xoy', + request = TurnstileRequest(websiteKey='0x4AAAAAAABUYP0XeMJF0xoy', websiteURL='http://tsmanaged.zlsupport.com', pageAction='asdgf') task_dictionary = request.getTaskDict() @@ -25,7 +25,7 @@ def test_cloudflareTaskType_type(self): kwargs = {'websiteKey': '0x4AAAAAAADnPIDROrmt1Wwj', 'websiteURL': 'https://nowsecure.nl', 'cloudflareTaskType': '.'} - self.assertRaises(ValidationError, TurnstileProxylessRequest, + self.assertRaises(ValidationError, TurnstileRequest, **kwargs) def test_cf_clearance_inputs(self): @@ -36,7 +36,7 @@ def test_cf_clearance_inputs(self): 'cloudflareTaskType', 'htmlPageBase64'] - request = TurnstileProxylessRequest(websiteKey='0x4AAAAAAADnPIDROrmt1Wwj', + request = TurnstileRequest(websiteKey='0x4AAAAAAADnPIDROrmt1Wwj', websiteURL='https://nowsecure.nl', cloudflareTaskType='cf_clearance', htmlPageBase64='htmlPageBase64Here', @@ -55,7 +55,7 @@ def test_token_inputs(self): 'pageAction', 'data', 'pageData', 'userAgent'] - request = TurnstileProxylessRequest(websiteKey='0x4AAAAAAADnPIDROrmt1Wwj', + request = TurnstileRequest(websiteKey='0x4AAAAAAADnPIDROrmt1Wwj', websiteURL='https://nowsecure.nl', cloudflareTaskType='token', pageAction='pageAction', @@ -78,15 +78,15 @@ def test_failed_cf_clearance_cases(self): # Token pipeline kwargs_1 = deepcopy(base_kwargs) kwargs_1.update({'cloudflareTaskType': 'token'}) - self.assertRaises(RuntimeError, TurnstileProxylessRequest, **kwargs_1) + self.assertRaises(RuntimeError, TurnstileRequest, **kwargs_1) kwargs_1.update({'pageAction': 'pageAction'}) - self.assertRaises(RuntimeError, TurnstileProxylessRequest, **kwargs_1) + self.assertRaises(RuntimeError, TurnstileRequest, **kwargs_1) kwargs_1.update({'pageData': 'pageData'}) - self.assertRaises(RuntimeError, TurnstileProxylessRequest, **kwargs_1) + self.assertRaises(RuntimeError, TurnstileRequest, **kwargs_1) kwargs_1.update({'data': 'data'}) - self.assertRaises(RuntimeError, TurnstileProxylessRequest, **kwargs_1) + self.assertRaises(RuntimeError, TurnstileRequest, **kwargs_1) kwargs_1.update({'userAgent': 'userAgent'}) - TurnstileProxylessRequest(**kwargs_1) + TurnstileRequest(**kwargs_1) def test_failed_token_cases(self): @@ -96,11 +96,11 @@ def test_failed_token_cases(self): # cf_clearance pipeline kwargs_2 = deepcopy(base_kwargs) kwargs_2.update({'cloudflareTaskType': 'cf_clearance'}) - self.assertRaises(RuntimeError, TurnstileProxylessRequest, **kwargs_2) + self.assertRaises(RuntimeError, TurnstileRequest, **kwargs_2) kwargs_2.update({'htmlPageBase64': 'htmlPageBase64Here'}) - self.assertRaises(RuntimeError, TurnstileProxylessRequest, **kwargs_2) + self.assertRaises(RuntimeError, TurnstileRequest, **kwargs_2) kwargs_2.update({'userAgent': 'userAgent'}) - TurnstileProxylessRequest(**kwargs_2) + TurnstileRequest(**kwargs_2) if __name__ == '__main__': unittest.main()