capmonstercloudclient 1.3.4__py3-none-any.whl → 1.5.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. capmonstercloudclient/CapMonsterCloudClient.py +8 -1
  2. capmonstercloudclient/GetResultTimeouts.py +13 -1
  3. capmonstercloudclient/exceptions.py +5 -0
  4. capmonstercloudclient/requests/AmazonWafProxylessRequest.py +22 -0
  5. capmonstercloudclient/requests/AmazonWafRequest.py +28 -0
  6. capmonstercloudclient/requests/AmazonWafRequestBase.py +13 -0
  7. capmonstercloudclient/requests/BasiliskCustomTaskProxylessRequest.py +16 -0
  8. capmonstercloudclient/requests/BasiliskCustomTaskRequest.py +22 -0
  9. capmonstercloudclient/requests/BasiliskCustomTaskRequestBase.py +11 -0
  10. capmonstercloudclient/requests/CustomTaskRequestBase.py +10 -0
  11. capmonstercloudclient/requests/DataDomeCustomTaskProxylessRequest.py +36 -0
  12. capmonstercloudclient/requests/DataDomeCustomTaskRequest.py +42 -0
  13. capmonstercloudclient/requests/DataDomeCustomTaskRequestBase.py +8 -0
  14. capmonstercloudclient/requests/HcaptchaComplexImageTask.py +45 -4
  15. capmonstercloudclient/requests/HcaptchaProxylessRequest.py +2 -0
  16. capmonstercloudclient/requests/HcaptchaRequest.py +2 -0
  17. capmonstercloudclient/requests/HcaptchaRequestBase.py +2 -1
  18. capmonstercloudclient/requests/TenDiCustomTaskProxylessRequest.py +16 -0
  19. capmonstercloudclient/requests/TenDiCustomTaskRequest.py +22 -0
  20. capmonstercloudclient/requests/TenDiCustomTaskRequestBase.py +11 -0
  21. capmonstercloudclient/requests/__init__.py +11 -1
  22. capmonstercloudclient/version.txt +1 -1
  23. capmonstercloudclient-1.5.1.dist-info/METADATA +87 -0
  24. {capmonstercloudclient-1.3.4.dist-info → capmonstercloudclient-1.5.1.dist-info}/RECORD +27 -14
  25. {capmonstercloudclient-1.3.4.dist-info → capmonstercloudclient-1.5.1.dist-info}/WHEEL +1 -1
  26. capmonstercloudclient-1.3.4.dist-info/METADATA +0 -86
  27. {capmonstercloudclient-1.3.4.dist-info → capmonstercloudclient-1.5.1.dist-info}/LICENSE +0 -0
  28. {capmonstercloudclient-1.3.4.dist-info → capmonstercloudclient-1.5.1.dist-info}/top_level.txt +0 -0
@@ -24,6 +24,11 @@ _instance_config = (
24
24
  ((TurnstileProxylessRequest, TurnstileRequest), getTurnstileTimeouts),
25
25
  ((RecaptchaComplexImageTaskRequest, HcaptchaComplexImageTaskRequest,
26
26
  FunCaptchaComplexImageTaskRequest), getImage2TextTimeouts),
27
+ ((DataDomeCustomTaskRequest, DataDomeCustomTaskProxylessRequest), getDatadomeTimeouts),
28
+ ((TenDiCustomTaskRequest, TenDiCustomTaskProxylessRequest), getTenDiTimeouts),
29
+ ((BasiliskCustomTaskRequest, BasiliskCustomTaskProxylessRequest), getBasiliskTimeouts),
30
+ ((AmazonWafRequest, AmazonWafProxylessRequest), getAmazonWafTimeouts),
31
+
27
32
  )
28
33
 
29
34
 
@@ -70,7 +75,9 @@ class CapMonsterClient:
70
75
  TurnstileRequest,
71
76
  HcaptchaComplexImageTaskRequest,
72
77
  RecaptchaComplexImageTaskRequest,
73
- FunCaptchaComplexImageTaskRequest],
78
+ FunCaptchaComplexImageTaskRequest,
79
+ DataDomeCustomTaskProxylessRequest,
80
+ DataDomeCustomTaskRequest],
74
81
  ) -> Dict[str, str]:
75
82
  '''
76
83
  Non-blocking method for captcha solving.
@@ -30,4 +30,16 @@ def getGeetestTimeouts() -> GetResultTimeouts:
30
30
  return GetResultTimeouts(1, 0, 1, 80)
31
31
 
32
32
  def getTurnstileTimeouts() -> GetResultTimeouts:
33
- return GetResultTimeouts(1, 0, 1, 80)
33
+ return GetResultTimeouts(1, 0, 1, 80)
34
+
35
+ def getDatadomeTimeouts() -> GetResultTimeouts:
36
+ return GetResultTimeouts(1, 0, 1, 80)
37
+
38
+ def getTenDiTimeouts() -> GetResultTimeouts:
39
+ return GetResultTimeouts(1, 10, 3, 180)
40
+
41
+ def getBasiliskTimeouts() -> GetResultTimeouts:
42
+ return GetResultTimeouts(1, 10, 3, 100)
43
+
44
+ def getAmazonWafTimeouts() -> GetResultTimeouts:
45
+ return GetResultTimeouts(1, 10, 3, 180)
@@ -21,6 +21,11 @@ class ZeroImagesErrors(BaseError):
21
21
  class TaskNotDefinedError(BaseError):
22
22
  pass
23
23
 
24
+ class ExtraParamsError(BaseError):
25
+ pass
26
+
27
+
28
+
24
29
  class UserAgentNotDefinedError(BaseError):
25
30
 
26
31
  default_message = 'If "imageUrls" is not defined, then "userAgent" must explicitly specify signature ' \
@@ -0,0 +1,22 @@
1
+ from typing import Dict, Union
2
+ from pydantic import Field, validator
3
+
4
+ from .proxy_info import ProxyInfo
5
+ from .AmazonWafRequestBase import AmazonWafRequestBase
6
+
7
+ class AmazonWafProxylessRequest(AmazonWafRequestBase):
8
+ type: str = 'AmazonTaskProxyless'
9
+
10
+ def getTaskDict(self) -> Dict[str, Union[str, int, bool]]:
11
+ task = {}
12
+ task['type'] = self.type
13
+ task['websiteURL'] = self.websiteUrl
14
+ task['challengeScript'] = self.challengeScript
15
+ task['captchaScript'] = self.captchaScript
16
+ task['websiteKey'] = self.websiteKey
17
+ task['context'] = self.context
18
+ task['iv'] = self.iv
19
+
20
+ if self.cookieSolution is not None:
21
+ task['cookieSolution'] = self.cookieSolution
22
+ return task
@@ -0,0 +1,28 @@
1
+ from typing import Dict, Union
2
+ from pydantic import Field, validator
3
+
4
+ from .proxy_info import ProxyInfo
5
+ from .AmazonWafRequestBase import AmazonWafRequestBase
6
+
7
+ class AmazonWafRequest(AmazonWafRequestBase, ProxyInfo):
8
+ type: str = 'AmazonTask'
9
+
10
+ def getTaskDict(self) -> Dict[str, Union[str, int, bool]]:
11
+ task = {}
12
+ task['type'] = self.type
13
+ task['websiteURL'] = self.websiteUrl
14
+ task['challengeScript'] = self.challengeScript
15
+ task['captchaScript'] = self.captchaScript
16
+ task['websiteKey'] = self.websiteKey
17
+ task['context'] = self.context
18
+ task['iv'] = self.iv
19
+
20
+ task['proxyType'] = self.proxyType
21
+ task['proxyAddress'] = self.proxyAddress
22
+ task['proxyPort'] = self.proxyPort
23
+ task['proxyLogin'] = self.proxyLogin
24
+ task['proxyPassword'] = self.proxyPassword
25
+
26
+ if self.cookieSolution is not None:
27
+ task['cookieSolution'] = self.cookieSolution
28
+ return task
@@ -0,0 +1,13 @@
1
+ from pydantic import Field
2
+ from typing import Optional
3
+
4
+ from .baseRequest import BaseRequest
5
+
6
+ class AmazonWafRequestBase(BaseRequest):
7
+ websiteUrl: str
8
+ challengeScript: str
9
+ captchaScript: str
10
+ websiteKey: str
11
+ context: str
12
+ iv: str
13
+ cookieSolution: Optional[bool] = Field(default=None)
@@ -0,0 +1,16 @@
1
+ from typing import Dict, Union
2
+ from pydantic import Field, validator
3
+
4
+ from .BasiliskCustomTaskRequestBase import BasiliskCustomTaskRequestBase
5
+
6
+ class BasiliskCustomTaskProxylessRequest(BasiliskCustomTaskRequestBase):
7
+
8
+ def getTaskDict(self) -> Dict[str, Union[str, int, bool]]:
9
+ task = {}
10
+ task['type'] = self.type
11
+ task['class'] = self.captchaClass
12
+ task['websiteURL'] = self.websiteUrl
13
+ task['websiteKey'] = self.websiteKey
14
+ if self.userAgent is not None:
15
+ task['userAgent'] = self.userAgent
16
+ return task
@@ -0,0 +1,22 @@
1
+ from typing import Dict, Union
2
+ from pydantic import Field, validator
3
+
4
+ from .proxy_info import ProxyInfo
5
+ from .BasiliskCustomTaskRequestBase import BasiliskCustomTaskRequestBase
6
+
7
+ class BasiliskCustomTaskRequest(BasiliskCustomTaskRequestBase, ProxyInfo):
8
+
9
+ def getTaskDict(self) -> Dict[str, Union[str, int, bool]]:
10
+ task = {}
11
+ task['type'] = self.type
12
+ task['class'] = self.captchaClass
13
+ task['websiteURL'] = self.websiteUrl
14
+ task['websiteKey'] = self.websiteKey
15
+ task['proxyType'] = self.proxyType
16
+ task['proxyAddress'] = self.proxyAddress
17
+ task['proxyPort'] = self.proxyPort
18
+ task['proxyLogin'] = self.proxyLogin
19
+ task['proxyPassword'] = self.proxyPassword
20
+ if self.userAgent is not None:
21
+ task['userAgent'] = self.userAgent
22
+ return task
@@ -0,0 +1,11 @@
1
+ from .baseRequest import BaseRequest, Field
2
+ from typing import Optional
3
+ from pydantic import validator, model_validator
4
+ from .CustomTaskRequestBase import CustomTaskRequestBase
5
+
6
+
7
+ class BasiliskCustomTaskRequestBase(CustomTaskRequestBase):
8
+
9
+ type: str = Field(default='CustomTask')
10
+ captchaClass: str = Field(default='Basilisk')
11
+ websiteKey: str = Field()
@@ -0,0 +1,10 @@
1
+ from typing import Optional, List, Dict
2
+
3
+ from .baseRequest import BaseRequest
4
+
5
+ class CustomTaskRequestBase(BaseRequest):
6
+ captchaClass: str # Class(subtype) of ComplexImageTask
7
+ type: str = "CustomTask" # Recognition task type
8
+ websiteUrl: str # Address of a webpage with captcha
9
+ userAgent: Optional[str] = None # It is required that you use a signature of a modern browser
10
+ domains: Optional[List[str]] = None # Collection with base64 encoded images. Must be populated if <see cref="ImageUrls"/> not.
@@ -0,0 +1,36 @@
1
+ from typing import Dict, Union
2
+ from pydantic import Field, validator
3
+
4
+ from .DataDomeCustomTaskRequestBase import DataDomeCustomTaskRequestBase
5
+
6
+ class DataDomeCustomTaskProxylessRequest(DataDomeCustomTaskRequestBase):
7
+ metadata : Dict[str, str]
8
+
9
+ @validator('metadata')
10
+ def validate_metadata(cls, value):
11
+ if value.get('datadomeCookie') is None:
12
+ raise ValueError(f'Expect that datadomeCookie will be defined.')
13
+ if value.get('captchaUrl') and value.get('htmlPageBase64'):
14
+ raise ValueError(f'Expected only one of [captchaUrl, htmlPageBase64]')
15
+ elif value.get('captchaUrl'):
16
+ if not isinstance(value.get('captchaUrl'), str):
17
+ raise ValueError(f'Expect that type imagesUrls array will be <str>, got {type(value.get("captchaUrl"))}')
18
+ return {i: value[i] for i in value if i != 'htmlPageBase64'}
19
+ elif value.get('htmlPageBase64'):
20
+ if not isinstance(value.get('htmlPageBase64'), str):
21
+ raise ValueError(f'Expect that type imagesUrls array will be <str>, got {type(value.get("htmlPageBase64"))}')
22
+ return {i: value[i] for i in value if i != 'captchaUrl'}
23
+ else:
24
+ raise ValueError(f'Expected one of [captchaUrl, htmlPageBase64]')
25
+
26
+ def getTaskDict(self) -> Dict[str, Union[str, int, bool]]:
27
+ task = {}
28
+ task['type'] = self.type
29
+ task['class'] = self.captchaClass
30
+ task['websiteURL'] = self.websiteUrl
31
+ task['metadata'] = self.metadata
32
+ if self.userAgent is not None:
33
+ task['userAgent'] = self.userAgent
34
+ if self.domains is not None:
35
+ task['domains'] = self.domains
36
+ return task
@@ -0,0 +1,42 @@
1
+ from typing import Dict, Union
2
+ from pydantic import Field, validator
3
+ from .DataDomeCustomTaskRequestBase import DataDomeCustomTaskRequestBase
4
+ from .proxy_info import ProxyInfo
5
+
6
+ class DataDomeCustomTaskRequest(DataDomeCustomTaskRequestBase, ProxyInfo):
7
+ metadata : Dict[str, str]
8
+
9
+ @validator('metadata')
10
+ def validate_metadata(cls, value):
11
+ if value.get('datadomeCookie') is None:
12
+ raise TypeError(f'Expect that datadomeCookie will be defined.')
13
+ if value.get('captchaUrl') and value.get('htmlPageBase64'):
14
+ raise TypeError(f'Expected only one of [captchaUrl, htmlPageBase64]')
15
+ elif value.get('captchaUrl'):
16
+ if not isinstance(value.get('captchaUrl'), str):
17
+ raise TypeError(f'Expect that type imagesUrls array will be <str>, got {type(value.get("captchaUrl"))}')
18
+ return {i: value[i] for i in value if i != 'htmlPageBase64'}
19
+ elif value.get('htmlPageBase64'):
20
+ if not isinstance(value.get('htmlPageBase64'), str):
21
+ raise TypeError(f'Expect that type imagesUrls array will be <str>, got {type(value.get("htmlPageBase64"))}')
22
+ return {i: value[i] for i in value if i != 'captchaUrl'}
23
+ else:
24
+ raise TypeError(f'Expected one of [captchaUrl, htmlPageBase64]')
25
+
26
+ def getTaskDict(self) -> Dict[str, Union[str, int, bool]]:
27
+ task = {}
28
+ task['type'] = self.type
29
+ task['class'] = self.captchaClass
30
+ task['websiteURL'] = self.websiteUrl
31
+ task['proxyType'] = self.proxyType
32
+ task['proxyAddress'] = self.proxyAddress
33
+ task['proxyPort'] = self.proxyPort
34
+ task['proxyLogin'] = self.proxyLogin
35
+ task['proxyPassword'] = self.proxyPassword
36
+ task['domains'] = self.domains
37
+ task['metadata'] = self.metadata
38
+ if self.userAgent is not None:
39
+ task['userAgent'] = self.userAgent
40
+ if self.domains is not None:
41
+ task['domains'] = self.domains
42
+ return task
@@ -0,0 +1,8 @@
1
+ from typing import Dict, Union
2
+ from pydantic import Field
3
+
4
+ from .CustomTaskRequestBase import CustomTaskRequestBase
5
+
6
+ class DataDomeCustomTaskRequestBase(CustomTaskRequestBase):
7
+ type: str = Field(default='CustomTask')
8
+ captchaClass: str = Field(default='DataDome')
@@ -1,13 +1,15 @@
1
- from typing import Dict, Union
1
+ from typing import Dict, Union, List, Optional
2
2
  from pydantic import Field, validator
3
3
 
4
4
  from .ComplexImageTaskBase import ComplexImageTaskRequestBase
5
- from ..exceptions import NumbersImagesErrors, ZeroImagesErrors, TaskNotDefinedError
5
+ from ..exceptions import NumbersImagesErrors, ZeroImagesErrors, TaskNotDefinedError, ExtraParamsError
6
6
 
7
7
  class HcaptchaComplexImageTaskRequest(ComplexImageTaskRequestBase):
8
8
 
9
9
  captchaClass: str = Field(default='hcaptcha')
10
10
  metadata : Dict[str, str]
11
+ exampleImageUrls: Optional[List[str]] = None
12
+ exampleImagesBase64: Optional[List[str]] = None
11
13
 
12
14
  @validator('metadata')
13
15
  def validate_metadata(cls, value):
@@ -16,13 +18,43 @@ class HcaptchaComplexImageTaskRequest(ComplexImageTaskRequestBase):
16
18
  else:
17
19
  return value
18
20
 
21
+ @validator('exampleImageUrls')
22
+ def validate_urls_array(cls, value):
23
+ if value is not None:
24
+ if not isinstance(value, (list, tuple)):
25
+ raise TypeError(f'Expect that type exampleImageUrls array will be <list> or <tuple>, got {type(value)}')
26
+ elif len(value) > 1:
27
+ raise NumbersImagesErrors(f'Maximum number of images in list 1, got {len(value)}')
28
+ elif not len(value):
29
+ raise ZeroImagesErrors(f'At least one image url expected, got {len(value)}')
30
+ # Check for each element type
31
+ contain_types = [isinstance(x, str) for x in value]
32
+ if not all(contain_types):
33
+ raise TypeError(f'Next images from imagesUrls array are not string: {contain_types}')
34
+ return value
35
+
36
+ @validator('exampleImagesBase64')
37
+ def validate_urls_array(cls, value):
38
+ if value is not None:
39
+ if not isinstance(value, (list, tuple)):
40
+ raise TypeError(f'Expect that type exampleImagesBase64 array will be <list> or <tuple>, got {type(value)}')
41
+ elif len(value) > 1:
42
+ raise NumbersImagesErrors(f'Maximum number of images in list 1, got {len(value)}')
43
+ elif not len(value):
44
+ raise ZeroImagesErrors(f'At least one image base64 expected, got {len(value)}')
45
+ # Check for each element type
46
+ contain_types = [isinstance(x, str) for x in value]
47
+ if not all(contain_types):
48
+ raise TypeError(f'Next images from imagesBase64 array are not string: {contain_types}')
49
+ return value
50
+
19
51
  @validator('imagesUrls')
20
52
  def validate_urls_array(cls, value):
21
53
  if value is not None:
22
54
  if not isinstance(value, (list, tuple)):
23
55
  raise TypeError(f'Expect that type imagesUrls array will be <list> or <tuple>, got {type(value)}')
24
56
  elif len(value) > 18:
25
- raise NumbersImagesErrors(f'Maximum numbers images in list 18, got {len(value)}')
57
+ raise NumbersImagesErrors(f'Maximum number of images in list 18, got {len(value)}')
26
58
  elif not len(value):
27
59
  raise ZeroImagesErrors(f'At least one image url expected, got {len(value)}')
28
60
  # Check for each element type
@@ -37,7 +69,7 @@ class HcaptchaComplexImageTaskRequest(ComplexImageTaskRequestBase):
37
69
  if not isinstance(value, (list, tuple)):
38
70
  raise TypeError(f'Expect that type imagesBase64 array will be <list> or <tuple>, got {type(value)}')
39
71
  elif len(value) > 18:
40
- raise NumbersImagesErrors(f'Maximum numbers images in list 18, got {len(value)}')
72
+ raise NumbersImagesErrors(f'Maximum number of images in list 18, got {len(value)}')
41
73
  elif not len(value):
42
74
  raise ZeroImagesErrors(f'At least one image base64 expected, got {len(value)}')
43
75
  # Check for each element type
@@ -64,6 +96,15 @@ class HcaptchaComplexImageTaskRequest(ComplexImageTaskRequestBase):
64
96
 
65
97
  task['metadata'] = self.metadata
66
98
 
99
+ if self.exampleImageUrls and self.exampleImagesBase64:
100
+ raise ExtraParamsError('Expect only one of [exampleImageUrls, exampleImagesBase64]')
101
+
102
+ if self.exampleImageUrls is not None:
103
+ task['exampleImageUrls'] = self.exampleImageUrls
104
+
105
+ if self.exampleImagesBase64 is not None:
106
+ task['exampleImagesBase64'] = self.exampleImagesBase64
107
+
67
108
  if self.userAgent is not None:
68
109
  task['userAgent'] = self.userAgent
69
110
 
@@ -20,4 +20,6 @@ class HcaptchaProxylessRequest(HcaptchaRequestBase):
20
20
  task['userAgent'] = self.user_agent
21
21
  if self.cookies is not None:
22
22
  task['cookies'] = self.cookies
23
+ if self.fallbackToActualUA is not None:
24
+ task['fallbackToActualUA'] = self.fallbackToActualUA
23
25
  return task
@@ -26,5 +26,7 @@ class HcaptchaRequest(HcaptchaRequestBase, ProxyInfo):
26
26
  task['userAgent'] = self.user_agent
27
27
  if self.cookies is not None:
28
28
  task['cookies'] = self.cookies
29
+ if self.fallbackToActualUA is not None:
30
+ task['fallbackToActualUA'] = self.fallbackToActualUA
29
31
 
30
32
  return task
@@ -9,4 +9,5 @@ class HcaptchaRequestBase(BaseRequest):
9
9
  is_invisible: Optional[bool] = Field(default=None)
10
10
  data: Optional[str] = Field(default=None)
11
11
  user_agent: Optional[str] = Field(default=None)
12
- cookies: Optional[str] = Field(default=None)
12
+ cookies: Optional[str] = Field(default=None)
13
+ fallbackToActualUA: Optional[bool] = Field(default=None)
@@ -0,0 +1,16 @@
1
+ from typing import Dict, Union
2
+ from pydantic import Field, validator
3
+
4
+ from .TenDiCustomTaskRequestBase import TenDiCustomTaskRequestBase
5
+
6
+ class TenDiCustomTaskProxylessRequest(TenDiCustomTaskRequestBase):
7
+
8
+ def getTaskDict(self) -> Dict[str, Union[str, int, bool]]:
9
+ task = {}
10
+ task['type'] = self.type
11
+ task['class'] = self.captchaClass
12
+ task['websiteURL'] = self.websiteUrl
13
+ task['websiteKey'] = self.websiteKey
14
+ if self.userAgent is not None:
15
+ task['userAgent'] = self.userAgent
16
+ return task
@@ -0,0 +1,22 @@
1
+ from typing import Dict, Union
2
+ from pydantic import Field, validator
3
+
4
+ from .proxy_info import ProxyInfo
5
+ from .TenDiCustomTaskRequestBase import TenDiCustomTaskRequestBase
6
+
7
+ class TenDiCustomTaskRequest(TenDiCustomTaskRequestBase, ProxyInfo):
8
+
9
+ def getTaskDict(self) -> Dict[str, Union[str, int, bool]]:
10
+ task = {}
11
+ task['type'] = self.type
12
+ task['class'] = self.captchaClass
13
+ task['websiteURL'] = self.websiteUrl
14
+ task['websiteKey'] = self.websiteKey
15
+ task['proxyType'] = self.proxyType
16
+ task['proxyAddress'] = self.proxyAddress
17
+ task['proxyPort'] = self.proxyPort
18
+ task['proxyLogin'] = self.proxyLogin
19
+ task['proxyPassword'] = self.proxyPassword
20
+ if self.userAgent is not None:
21
+ task['userAgent'] = self.userAgent
22
+ return task
@@ -0,0 +1,11 @@
1
+ from .baseRequest import BaseRequest, Field
2
+ from typing import Optional
3
+ from pydantic import validator, model_validator
4
+ from .CustomTaskRequestBase import CustomTaskRequestBase
5
+
6
+
7
+ class TenDiCustomTaskRequestBase(CustomTaskRequestBase):
8
+
9
+ type: str = Field(default='CustomTask')
10
+ captchaClass: str = Field(default='TenDI')
11
+ websiteKey: str = Field()
@@ -16,9 +16,19 @@ from .TurnstileRequest import TurnstileRequest
16
16
  from .HcaptchaComplexImageTask import HcaptchaComplexImageTaskRequest
17
17
  from .RecaptchaComplexImageTask import RecaptchaComplexImageTaskRequest
18
18
  from .baseRequest import BaseRequest
19
+ from .DataDomeCustomTaskRequest import DataDomeCustomTaskRequest
20
+ from .DataDomeCustomTaskProxylessRequest import DataDomeCustomTaskProxylessRequest
21
+ from .TenDiCustomTaskRequest import TenDiCustomTaskRequest
22
+ from .TenDiCustomTaskProxylessRequest import TenDiCustomTaskProxylessRequest
23
+ from .BasiliskCustomTaskRequest import BasiliskCustomTaskRequest
24
+ from .BasiliskCustomTaskProxylessRequest import BasiliskCustomTaskProxylessRequest
25
+ from .AmazonWafRequest import AmazonWafRequest
26
+ from .AmazonWafProxylessRequest import AmazonWafProxylessRequest
19
27
 
20
28
  REQUESTS = ['RecaptchaV2EnterpiseRequest', 'RecaptchaV2EnterpriseProxylessRequest',
21
29
  'RecaptchaV2ProxylessRequest', 'RecaptchaV2Request', 'RecaptchaV3ProxylessRequest',
22
30
  'ImageToTextRequest', 'FuncaptchaProxylessRequest', 'FuncaptchaRequest',
23
31
  'GeetestRequest', 'GeetestProxylessRequest', 'HcaptchaProxylessRequest',
24
- 'HcaptchaRequest']
32
+ 'HcaptchaRequest', 'DataDomeCustomTaskRequest', 'DataDomeCustomTaskProxylessRequest',
33
+ 'TenDiCustomTaskRequest', 'TenDiCustomTaskProxylessRequest', 'BasiliskCustomTaskRequest',
34
+ 'BasiliskCustomTaskProxylessRequest', 'AmazonWafRequest', 'AmazonWafProxylessRequest']
@@ -1 +1 @@
1
- 1.3.4
1
+ 1.5.1
@@ -0,0 +1,87 @@
1
+ Metadata-Version: 2.1
2
+ Name: capmonstercloudclient
3
+ Version: 1.5.1
4
+ Summary: Official CapMonsterCloud Client: https://capmonster.cloud/
5
+ Home-page: https://github.com/ZennoLab/capmonstercloud-client-python
6
+ Author: Andrey Ilyin
7
+ Author-email: andrey.ilyin@zennolab.com
8
+ License: AGPL-3.0
9
+ Keywords: captcha
10
+ recaptcha
11
+ geetest
12
+ hcaptcha
13
+ funcaptcha
14
+ python3
15
+ python-library
16
+ capmonster
17
+ capmonstercloud
18
+ capmonstercloudclient
19
+ Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
20
+ Classifier: Programming Language :: Python
21
+ Classifier: Programming Language :: Python :: 3
22
+ Classifier: Programming Language :: Python :: 3 :: Only
23
+ Classifier: Programming Language :: Python :: 3.6
24
+ Classifier: Programming Language :: Python :: 3.7
25
+ Classifier: Programming Language :: Python :: 3.8
26
+ Classifier: Programming Language :: Python :: 3.9
27
+ Classifier: Programming Language :: Python :: 3.10
28
+ Classifier: Development Status :: 5 - Production/Stable
29
+ Classifier: Framework :: AsyncIO
30
+ Classifier: Operating System :: Unix
31
+ Classifier: Operating System :: Microsoft :: Windows
32
+ Classifier: Operating System :: MacOS
33
+ Requires-Python: >=3.6
34
+ Description-Content-Type: text/markdown
35
+ License-File: LICENSE
36
+ Requires-Dist: aiohttp >=3.7.4
37
+ Requires-Dist: pydantic ==2.1.*
38
+
39
+ # Zennolab.CapMonsterCloud.Client
40
+
41
+ Official python client library for [capmonster.cloud](https://capmonster.cloud/) captcha recognition service
42
+
43
+ ## Installation
44
+
45
+ python3 -m pip install capmonstercloudclient
46
+
47
+ ## Usage
48
+
49
+ ***
50
+ import asyncio
51
+
52
+ from capmonstercloudclient import CapMonsterClient, ClientOptions
53
+ from capmonstercloudclient.requests import RecaptchaV2ProxylessRequest
54
+
55
+ client_options = ClientOptions(api_key=<YOUR_API_KEY>)
56
+ cap_monster_client = CapMonsterClient(options=client_options)
57
+
58
+ async def solve_captcha():
59
+ return await cap_monster_client.solve_captcha(recaptcha2request)
60
+
61
+ recaptcha2request = RecaptchaV2ProxylessRequest(websiteUrl="https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high",
62
+ websiteKey="6Lcg7CMUAAAAANphynKgn9YAgA4tQ2KI_iqRyTwd")
63
+
64
+ responses = asyncio.run(solve_captcha())
65
+ print(responses)
66
+ ***
67
+
68
+ Supported captcha recognition requests:
69
+
70
+ - [GeeTestProxylessRequest](https://zenno.link/doc-geetest-en)
71
+ - [GeeTestRequest](https://zenno.link/doc-geetest-proxy-en)
72
+ - [HCaptchaProxylessRequest](https://zenno.link/doc-hcaptcha-en)
73
+ - [HCaptchaRequest](https://zenno.link/doc-hcaptcha-proxy-en)
74
+ - [ImageToTextRequest](https://zenno.link/doc-ImageToTextTask-en)
75
+ - [RecaptchaV2ProxylessRequest](https://zenno.link/doc-recaptcha2-en)
76
+ - [RecaptchaV2Request](https://zenno.link/doc-recaptcha2-proxy-en)
77
+ - [RecaptchaV3ProxylessRequest](https://zenno.link/doc-recaptcha3-en)
78
+ - [RecaptchaV2EnterpriseProxylessRequest](https://zenno.link/doc-recaptcha2e-en)
79
+ - [RecaptchaV2EnterpriseRequest](https://zenno.link/doc-recaptcha2e-proxy-en)
80
+ - [TurnstileProxylessRequest](https://zenno.link/doc-turnstile-en)
81
+ - [TurnstileRequest](https://zenno.link/doc-turnstile-proxy-en)
82
+ - [RecaptchaComplexImageTaskRequest](https://zenno.link/doc-complextask-rc-en)
83
+ - [HcaptchaComplexImageTaskRequest](https://zenno.link/doc-complextask-hc-en)
84
+ - [DataDomeCustomTaskRequest](https://docs.capmonster.cloud/docs/captchas/datadome)
85
+ - [TenDiCustomTaskRequest](https://docs.capmonster.cloud/docs/captchas/tendi)
86
+ - [BasiliskCustomTaskRequest](https://docs.capmonster.cloud/docs/captchas/Basilisk-task)
87
+ - [AmazonWafRequest](https://docs.capmonster.cloud/docs/captchas/amazon-task)
@@ -1,13 +1,23 @@
1
- capmonstercloudclient/CapMonsterCloudClient.py,sha256=WSheWUsOh_xekrtDfemp3R43oWbPFpQFji8BWaajlpg,8712
2
- capmonstercloudclient/GetResultTimeouts.py,sha256=RP7_fD6EpQa7flkyHgcpb_jZoyHtGIWY0Z_R01dcCDs,1021
1
+ capmonstercloudclient/CapMonsterCloudClient.py,sha256=-Xpkiefv3oF4gaKuGl9kRPSbonsVJ6RJbKTpZT9bzok,9216
2
+ capmonstercloudclient/GetResultTimeouts.py,sha256=Bt4gZ11lpXqGCYDvWx9SgABHmBtv6gqUnEDQliU-l58,1390
3
3
  capmonstercloudclient/__init__.py,sha256=XkfS_v1jZUx7HTUhdi-5uiZhvjvd9aLvt31jXXpVxeA,92
4
4
  capmonstercloudclient/captchaResult.py,sha256=qBRmadO9n6DMnG-IwJSzZEt54Z5OAXvWIC5Jvzd7OfI,314
5
5
  capmonstercloudclient/clientOptions.py,sha256=kd2CXnmz2_crZd85SoOHOjp1zBklEbu9OWDpk-JfBf4,895
6
- capmonstercloudclient/exceptions.py,sha256=ah-ppZvx7rQfWHsALyJbCc8Yn4GmVk5eSn4dIAQuI1I,878
6
+ capmonstercloudclient/exceptions.py,sha256=9iTzO0ymBo7eAJwv7qtoPZTmb4yaQ6Fvi69VqBXTcwk,925
7
7
  capmonstercloudclient/requestController.py,sha256=9t31zNN4z1UBw4Q0N9ZIy47CwSQl2VaxD1eqDTDIr9w,497
8
8
  capmonstercloudclient/utils.py,sha256=hP090ddzDCLknr5wGCR7sIALDbOtWbiSzgZPvPnDC3c,609
9
- capmonstercloudclient/version.txt,sha256=2Nc8Vw6HAjDWCtPBpzMVxh4-YdAUne_NZiu-z5HiatM,5
9
+ capmonstercloudclient/version.txt,sha256=3-fXGz9Cjrc-2FP4_e1l4pholuIdafRevwa7YjtFDhQ,6
10
+ capmonstercloudclient/requests/AmazonWafProxylessRequest.py,sha256=lgNC-03ccOsWZJM9xuLChaWAgNkOpMz4jRmhsK6yi58,753
11
+ capmonstercloudclient/requests/AmazonWafRequest.py,sha256=vXw1AcTStr3NPFMSTUxi0ZuQ9ICEhwfhZ3m5BhSc6Jw,986
12
+ capmonstercloudclient/requests/AmazonWafRequestBase.py,sha256=Ie4Vv6OZpFPvy6gQyuwsNMGKHEI4qNFa6Z5RK3KUqEw,308
13
+ capmonstercloudclient/requests/BasiliskCustomTaskProxylessRequest.py,sha256=2Vg6DpzrE4QHbBGQLaWZWMNf6oIMORFWeRr8Dz3gRgY,573
14
+ capmonstercloudclient/requests/BasiliskCustomTaskRequest.py,sha256=Avlc4f7_wAGUJ1MyazmA7Up8A7krmc4Z8TcvlcKpYuI,840
15
+ capmonstercloudclient/requests/BasiliskCustomTaskRequestBase.py,sha256=dhBbn6ffPQRIV8Usg4GwPEhIK7d59fT3kKsjOrvuiUU,367
10
16
  capmonstercloudclient/requests/ComplexImageTaskBase.py,sha256=7784BontlIxldtIEy9O4Id1nRo6abGpNJZl5z2KwusY,675
17
+ capmonstercloudclient/requests/CustomTaskRequestBase.py,sha256=qilOId-0g7kDeaE0ofmAqsCq0visR6SG5uxYD2xbKu4,518
18
+ capmonstercloudclient/requests/DataDomeCustomTaskProxylessRequest.py,sha256=ozFD8CWmGoAbKDRb3xy_JjpD7OsAdgSZSe0lpJvSXVw,1714
19
+ capmonstercloudclient/requests/DataDomeCustomTaskRequest.py,sha256=cW9Ysq7Gb5hgbiVduFGEACzx6vwZpNQkW1isJsX5S7A,2014
20
+ capmonstercloudclient/requests/DataDomeCustomTaskRequestBase.py,sha256=HuQaLwSsRVfUfyrkklmnK4YNo_gmhIwA5FrPm5dvThA,270
11
21
  capmonstercloudclient/requests/FuncaptchaComplexImageTask.py,sha256=5Mo9mBAXUuAx2Cv_lGfNaZLrsEwfrqxSz3ZPDy2KXvY,3074
12
22
  capmonstercloudclient/requests/FuncaptchaProxylessRequest.py,sha256=uyGOGoERkIFNUgWl3IiU952S4q_fHdoyrPfNcitKyZA,669
13
23
  capmonstercloudclient/requests/FuncaptchaRequest.py,sha256=XXyOlMj0XBePQ911owryzGjFAcsCaLJo32kMXsQ_ptg,927
@@ -15,10 +25,10 @@ capmonstercloudclient/requests/FuncaptchaRequestBase.py,sha256=7SmgYEaojxjUcR21d
15
25
  capmonstercloudclient/requests/GeetestProxylessRequest.py,sha256=A8-XRR0KEhGLhlOaLVLEZXDavQ86CjQl02bYZvcq84A,1161
16
26
  capmonstercloudclient/requests/GeetestRequest.py,sha256=FDr0x5ShrnKelrk4XJnAAlMB4abf2wXPt6uGptMPx1A,1428
17
27
  capmonstercloudclient/requests/GeetestRequestBase.py,sha256=eR6GMduiy6iyG0pBPpK-IZkRMEO2aj5r76m7QEzg1rE,699
18
- capmonstercloudclient/requests/HcaptchaComplexImageTask.py,sha256=X5BRQ8F8h4ENGcaW4ketDT7Gu294gq9_UaIhGzcwDC4,3074
19
- capmonstercloudclient/requests/HcaptchaProxylessRequest.py,sha256=PKj59OhSMPfLhIYMYaQIgeCOeUv4NvF3-9NCu2Gfw_k,779
20
- capmonstercloudclient/requests/HcaptchaRequest.py,sha256=ivyq93yuKtWnwpLsX2EDdVz8Bqrc4jeG7LOCIY_1vpk,1045
21
- capmonstercloudclient/requests/HcaptchaRequestBase.py,sha256=wXb8SM6JC1JvVzijMcDYLYGdT4u1LjmtHJAQDZJOpjk,375
28
+ capmonstercloudclient/requests/HcaptchaComplexImageTask.py,sha256=HGVJefD2h9GX4ILyCYNrew64ZkpFGf0UG1hxXIrg7v0,5240
29
+ capmonstercloudclient/requests/HcaptchaProxylessRequest.py,sha256=fv3_1PMN4ABxXhq5wIqSd_vRS935aOKlDim_f1psXNM,892
30
+ capmonstercloudclient/requests/HcaptchaRequest.py,sha256=0e-yBeEWqk6-lXSxgcIWROrgbKyh1OICjDarbCp0AQg,1158
31
+ capmonstercloudclient/requests/HcaptchaRequestBase.py,sha256=eF2njtIx3akgiPwA_hW8IMASBW9IEtkXRf0YDL9w4zE,436
22
32
  capmonstercloudclient/requests/ImageToTextRequest.py,sha256=iubmsWXBwpQKFSoqL2YugMCHjVRoj13HEH9BZbYley4,2492
23
33
  capmonstercloudclient/requests/RecaptchaComplexImageTask.py,sha256=fhT5tJo8__Ffc0sr4v0SxG0_tvqQt4A301CdM0zA8PI,3299
24
34
  capmonstercloudclient/requests/RecaptchaV2EnterpiseRequest.py,sha256=4mD8Lv52K9rhEzwXEBefnN0sN8TGwOsGvoFVrU7T44A,965
@@ -28,15 +38,18 @@ capmonstercloudclient/requests/RecaptchaV2ProxylessRequest.py,sha256=rfrvXjOuy09
28
38
  capmonstercloudclient/requests/RecaptchaV2Request.py,sha256=n2xhE9CH255nGChg1bc2cnQqTodehkUO9NZTPrJXcO8,995
29
39
  capmonstercloudclient/requests/RecaptchaV2RequestBase.py,sha256=IMjBmB8y7KwZ-CPkbYC48w2ADoEDiEpoK4Kzd8_Wbo8,329
30
40
  capmonstercloudclient/requests/RecaptchaV3ProxylessRequest.py,sha256=0IYCgNruZrVr0L7E4dfHE_Pv8DimkrH4PBkEPEv7dxw,1078
41
+ capmonstercloudclient/requests/TenDiCustomTaskProxylessRequest.py,sha256=_mxYiUwsjbSaQ-1J4DKjNbho8HIQCwwxW1LDQRU7y2I,561
42
+ capmonstercloudclient/requests/TenDiCustomTaskRequest.py,sha256=jWgGQaidkQHuJ8DeMMokQwlCKpI-5fhjoRQKflb6I6E,828
43
+ capmonstercloudclient/requests/TenDiCustomTaskRequestBase.py,sha256=3bnONuD0u9Qs2qZ6XCTV3G8tOqHQIgTm-sG4azHTikQ,361
31
44
  capmonstercloudclient/requests/TurnstileProxylessRequest.py,sha256=ZRiBYYudP5z8J79YjjMf5PSgR9q1eWTCb1TWWfnIn10,342
32
45
  capmonstercloudclient/requests/TurnstileRequest.py,sha256=xPH5EyXwvw3apI1YlUEcTktGP3wxkaRAWKpP6uqOguI,378
33
46
  capmonstercloudclient/requests/TurnstileRequestBase.py,sha256=8zzcQLV1Sh7LVuMcEmhrxuPKkObNO0gHmVm1-jUFbI4,1958
34
- capmonstercloudclient/requests/__init__.py,sha256=9F8sztFJ7CKTu5i2qlIWQHe9WXSr6_Z4qKLWJcYbZaU,1474
47
+ capmonstercloudclient/requests/__init__.py,sha256=ljuazzIqpXE_2JustJQL-27wGFxWnN7lj_dMGKt_QBo,2287
35
48
  capmonstercloudclient/requests/baseRequest.py,sha256=oVOtKdCfVhxQ9x4qDkIc1D_-q3B08hNQeUKrBLwkjaM,279
36
49
  capmonstercloudclient/requests/enums.py,sha256=itJ95OEzwous9zOe4n411w5LeBw4yCpCCTMomlT3LU0,1000
37
50
  capmonstercloudclient/requests/proxy_info.py,sha256=ctmxvykMflsym-snO449t9mOZ1jxpUFTnxcI8koACUw,678
38
- capmonstercloudclient-1.3.4.dist-info/LICENSE,sha256=VIIsA4331arqJBp_QqiY2cjVszTfuSt3I7uEUr4ouYw,1065
39
- capmonstercloudclient-1.3.4.dist-info/METADATA,sha256=ZxeWn5mNlXC4cMsyyFXL71b6q_7AlIRPlqLSiAjP2TE,4727
40
- capmonstercloudclient-1.3.4.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
41
- capmonstercloudclient-1.3.4.dist-info/top_level.txt,sha256=_rR6-Wb02PxobU8D33r_0OONJgybsros2e9H8opYGnA,22
42
- capmonstercloudclient-1.3.4.dist-info/RECORD,,
51
+ capmonstercloudclient-1.5.1.dist-info/LICENSE,sha256=VIIsA4331arqJBp_QqiY2cjVszTfuSt3I7uEUr4ouYw,1065
52
+ capmonstercloudclient-1.5.1.dist-info/METADATA,sha256=TyluVaZEYPeYMIIfy9rULZVHF3ArS34H5nsSdG22_gU,3610
53
+ capmonstercloudclient-1.5.1.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
54
+ capmonstercloudclient-1.5.1.dist-info/top_level.txt,sha256=_rR6-Wb02PxobU8D33r_0OONJgybsros2e9H8opYGnA,22
55
+ capmonstercloudclient-1.5.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.2)
2
+ Generator: setuptools (75.3.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,86 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: capmonstercloudclient
3
- Version: 1.3.4
4
- Summary: Official CapMonsterCloud Client: https://capmonster.cloud/
5
- Home-page: https://github.com/ZennoLab/capmonstercloud-client-python
6
- Author: Andrey Ilyin
7
- Author-email: andrey.ilyin@zennolab.com
8
- License: AGPL-3.0
9
- Keywords: captcha
10
- recaptcha
11
- geetest
12
- hcaptcha
13
- funcaptcha
14
- python3
15
- python-library
16
- capmonster
17
- capmonstercloud
18
- capmonstercloudclient
19
- Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
20
- Classifier: Programming Language :: Python
21
- Classifier: Programming Language :: Python :: 3
22
- Classifier: Programming Language :: Python :: 3 :: Only
23
- Classifier: Programming Language :: Python :: 3.6
24
- Classifier: Programming Language :: Python :: 3.7
25
- Classifier: Programming Language :: Python :: 3.8
26
- Classifier: Programming Language :: Python :: 3.9
27
- Classifier: Programming Language :: Python :: 3.10
28
- Classifier: Development Status :: 5 - Production/Stable
29
- Classifier: Framework :: AsyncIO
30
- Classifier: Operating System :: Unix
31
- Classifier: Operating System :: Microsoft :: Windows
32
- Classifier: Operating System :: MacOS
33
- Requires-Python: >=3.6
34
- Description-Content-Type: text/markdown
35
- License-File: LICENSE
36
- Requires-Dist: aiohttp >=3.7.4
37
- Requires-Dist: pydantic ==2.1.*
38
-
39
- # Zennolab.CapMonsterCloud.Client
40
-
41
- Official python client library for [capmonster.cloud](https://capmonster.cloud/) captcha recognition service
42
-
43
- ## Installation
44
-
45
- python3 -m pip install capmonstercloudclient
46
-
47
- ## Usage
48
-
49
- ***
50
- import asyncio
51
-
52
- from capmonstercloudclient import CapMonsterClient, ClientOptions
53
- from capmonstercloudclient.requests import RecaptchaV2ProxylessRequest
54
-
55
- client_options = ClientOptions(api_key=<YOUR_API_KEY>)
56
- cap_monster_client = CapMonsterClient(options=client_options)
57
-
58
- async def solve_captcha():
59
- return await cap_monster_client.solve_captcha(recaptcha2request)
60
-
61
- recaptcha2request = RecaptchaV2ProxylessRequest(websiteUrl="https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high",
62
- websiteKey="6Lcg7CMUAAAAANphynKgn9YAgA4tQ2KI_iqRyTwd")
63
-
64
- responses = asyncio.run(solve_captcha())
65
- print(responses)
66
- ***
67
-
68
- Supported captcha recognition requests:
69
-
70
- - [FunCaptchaProxylessRequest](https://zennolab.atlassian.net/wiki/spaces/APIS/pages/643629079/FunCaptchaTaskProxyless+solving+FunCaptcha)
71
- - [FunCaptchaRequest](https://zennolab.atlassian.net/wiki/spaces/APIS/pages/735805497/FunCaptchaTask+solving+FunCaptcha)
72
- - [GeeTestProxylessRequest](https://zennolab.atlassian.net/wiki/spaces/APIS/pages/1940291626/GeeTestTaskProxyless+GeeTest+captcha+recognition+without+proxy)
73
- - [GeeTestRequest](https://zennolab.atlassian.net/wiki/spaces/APIS/pages/1940357159/GeeTestTask+GeeTest+captcha+recognition)
74
- - [HCaptchaProxylessRequest](https://zennolab.atlassian.net/wiki/spaces/APIS/pages/1203240977/HCaptchaTaskProxyless+hCaptcha+puzzle+solving)
75
- - [HCaptchaRequest](https://zennolab.atlassian.net/wiki/spaces/APIS/pages/1203240988/HCaptchaTask+hCaptcha+puzzle+solving)
76
- - [ImageToTextRequest](https://zennolab.atlassian.net/wiki/spaces/APIS/pages/589863/ImageToTextTask)
77
- - [RecaptchaV2ProxylessRequest](https://zennolab.atlassian.net/wiki/spaces/APIS/pages/373161985/NoCaptchaTaskProxyless+solving+Google+recaptcha)
78
- - [RecaptchaV2Request](https://zennolab.atlassian.net/wiki/spaces/APIS/pages/680689685/NoCaptchaTask+solving+Google+recaptcha)
79
- - [RecaptchaV3ProxylessRequest](https://zennolab.atlassian.net/wiki/spaces/APIS/pages/566853650/RecaptchaV3TaskProxyless+solving+Google+ReCaptcha+v.3)
80
- - [RecaptchaV2EnterpriseProxylessRequest](https://zennolab.atlassian.net/wiki/spaces/APIS/pages/2178383893/RecaptchaV2EnterpriseTaskProxyless+solving+Google+reCAPTCHA+Enterprise+without+proxy)
81
- - [RecaptchaV2EnterpriseRequest](https://zennolab.atlassian.net/wiki/spaces/APIS/pages/2179104769/RecaptchaV2EnterpriseTask+solving+Google+reCAPTCHA+Enterprise)
82
- - [TurnstileProxylessRequest](https://zennolab.atlassian.net/wiki/spaces/APIS/pages/2257879047/TurnstileTaskProxyless+solving+Turnstile+without+proxy)
83
- - [TurnstileRequest](https://zennolab.atlassian.net/wiki/spaces/APIS/pages/2313814017/TurnstileTask+Cloudflare+Challenge)
84
- - [RecaptchaComplexImageTaskRequest](https://zennolab.atlassian.net/wiki/spaces/APIS/pages/2279538739/ComplexImageTask+Recaptcha+Google+captcha+solution)
85
- - [HcaptchaComplexImageTaskRequest](https://zennolab.atlassian.net/wiki/spaces/APIS/pages/2279604241/ComplexImageTask+HCaptcha+hCaptcha+captcha+solution)
86
- - [FunCaptchaComplexImageTaskRequest](https://zennolab.atlassian.net/wiki/spaces/APIS/pages/2291400705/ComplexImageTask+Funcaptcha+Funcaptcha+solving)