Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions capmonstercloud_client/CapMonsterCloudClient.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@
((AmazonWafRequest,), getAmazonWafTimeouts),
((BinanceTaskRequest,), getBinanceTimeouts),
((ImpervaCustomTaskRequest,), getImpervaTimeouts),
((RecognitionComplexImageTaskRequest), getCITTimeouts)
((RecognitionComplexImageTaskRequest), getCITTimeouts),
((MTCaptchaRequest), getImage2TextTimeouts),
((YidunRequest), getImage2TextTimeouts),
)


Expand Down Expand Up @@ -79,7 +81,9 @@ async def solve_captcha(self, request: Union[
BinanceTaskRequest,
ImpervaCustomTaskRequest,
TurnstileRequest,
RecognitionComplexImageTaskRequest],
RecognitionComplexImageTaskRequest,
MTCaptchaRequest,
YidunRequest],
) -> Dict[str, str]:
'''
Non-blocking method for captcha solving.
Expand Down
4 changes: 0 additions & 4 deletions capmonstercloud_client/requests/DataDomeCustomTaskRequest.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,8 @@ def validate_metadata(cls, value):
if value.get('captchaUrl') and value.get('htmlPageBase64'):
raise TypeError(f'Expected only one of [captchaUrl, htmlPageBase64]')
elif value.get('captchaUrl'):
if not isinstance(value.get('captchaUrl'), str):
raise TypeError(f'Expect that type imagesUrls array will be <str>, 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 TypeError(f'Expect that type imagesUrls array will be <str>, got {type(value.get("htmlPageBase64"))}')
return {i: value[i] for i in value if i != 'captchaUrl'}
else:
raise TypeError(f'Expected one of [captchaUrl, htmlPageBase64]')
Expand Down
32 changes: 32 additions & 0 deletions capmonstercloud_client/requests/MTCaptchaRequest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from typing import Dict, Optional, Union
from pydantic import Field
from .baseRequestWithProxy import BaseRequestWithProxy


class MTCaptchaRequest(BaseRequestWithProxy):
type: str = Field(default="MTCaptchaTask")
websiteUrl: str
websiteKey: str
pageAction: Optional[str] = Field(default=None)
isInvisible: Optional[bool] = Field(default=None)
userAgent: Optional[str] = Field(default=None)

def getTaskDict(self) -> Dict[str, Union[str, int, bool]]:
task = {}
task["type"] = self.type
task["websiteURL"] = self.websiteUrl
task["websiteKey"] = self.websiteKey
if self.pageAction is not None:
task["pageAction"] = self.pageAction
if self.isInvisible is not None:
task["isInvisible"] = self.isInvisible
if self.userAgent is not None:
task["userAgent"] = self.userAgent
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
38 changes: 34 additions & 4 deletions capmonstercloud_client/requests/TurnstileRequest.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Dict, Optional
from typing import Dict, Optional, Union
from pydantic import Field, validator, model_validator
from .baseRequestWithProxy import BaseRequestWithProxy

Expand Down Expand Up @@ -32,6 +32,11 @@ def validate_cloudflare_type_token(self):
raise RuntimeError(f'Expect that "htmlPageBase64" will be filled ' \
f'when cloudflareTaskType is "cf_clearance"')

if self.get('proxy') is None:
if self.get('cloudflareTaskType') == 'cf_clearance':
raise RuntimeError(f'You are working using queries, and you need cf_clearance cookies ' \
f'it is required that you need your proxies.')

if self.get('cloudflareTaskType') == 'token':
for field in ['pageAction', 'pageData', 'data']:
if self.get(field) is None:
Expand All @@ -43,9 +48,34 @@ def validate_cloudflare_type_token(self):
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}
def getTaskDict(self) -> Dict[str, Union[str, int, bool]]:
task = {}
task['type'] = self.type
task['websiteURL'] = self.websiteURL
task['websiteKey'] = self.websiteKey
if self.pageAction is not None:
task['pageAction'] = self.pageAction
if self.data is not None:
task['data'] = self.data
if self.pageData is not None:
task['pageData'] = self.pageData
if self.userAgent is not None:
task['userAgent'] = self.userAgent
if self.cloudflareTaskType is not None:
task['cloudflareTaskType'] = self.cloudflareTaskType
if self.htmlPageBase64 is not None:
task['htmlPageBase64'] = self.htmlPageBase64
if self.apiJsUrl is not None:
task['apiJsUrl'] = self.apiJsUrl
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

26 changes: 26 additions & 0 deletions capmonstercloud_client/requests/YidunRequest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from typing import Dict, Optional, Union
from pydantic import Field
from .baseRequestWithProxy import BaseRequestWithProxy


class YidunRequest(BaseRequestWithProxy):
type: str = Field(default="YidunTask")
websiteUrl: str
websiteKey: str
userAgent: Optional[str] = Field(default=None)

def getTaskDict(self) -> Dict[str, Union[str, int, bool]]:
task = {}
task["type"] = self.type
task["websiteURL"] = self.websiteUrl
task["websiteKey"] = self.websiteKey
if self.userAgent is not None:
task["userAgent"] = self.userAgent
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
3 changes: 3 additions & 0 deletions capmonstercloud_client/requests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
from .BinanceTaskRequest import BinanceTaskRequest
from .ImpervaCustomTaskRequest import ImpervaCustomTaskRequest
from .RecognitionComplexImageTaskRequest import RecognitionComplexImageTaskRequest
from .MTCaptchaRequest import MTCaptchaRequest
from .YidunRequest import YidunRequest
from .proxy_info import ProxyInfo


REQUESTS = ['RecaptchaV2EnterpiseRequest', 'RecaptchaV2Request', 'RecaptchaV3ProxylessRequest', 'RecaptchaComplexImageTaskRequest'
Expand Down
2 changes: 1 addition & 1 deletion capmonstercloud_client/version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3.1.0
3.2.0
52 changes: 0 additions & 52 deletions test/amazonwaf_response_test.py

This file was deleted.

103 changes: 57 additions & 46 deletions test/amazonwaf_test.py
Original file line number Diff line number Diff line change
@@ -1,64 +1,75 @@
import unittest

from pydantic.error_wrappers import ValidationError

from capmonstercloudclient.requests import AmazonWafRequest
from capmonstercloudclient.exceptions import NumbersImagesErrors, TaskNotDefinedError, ZeroImagesErrors, \
UserAgentNotDefinedError


class AmazonWafRequestTest(unittest.TestCase):

websiteUrlExample = 'https://example.com'
websiteKeyExample = '189123456'
challengeScriptExample = 'challenge_test'
captchaScriptExample = '123'
contextExample = 'context'
ivExample = 'ivexample_`¬'
websiteUrlExample = "https://example.com"
websiteKeyExample = "189123456"
challengeScriptExample = "challenge_test"
captchaScriptExample = "123"
contextExample = "context"
ivExample = "ivexample_`¬"

def testCaptchaInputTypes(self):

with self.assertRaises(ValidationError):
request = AmazonWafRequest(websiteUrl=AmazonWafRequestTest.websiteUrlExample)

request = AmazonWafRequest(
websiteUrl=AmazonWafRequestTest.websiteUrlExample
)

with self.assertRaises(ValidationError):
request = AmazonWafRequest(
websiteKey=AmazonWafRequestTest.websiteKeyExample,
)
websiteKey=AmazonWafRequestTest.websiteKeyExample,
)
with self.assertRaises(ValidationError):
request = AmazonWafRequest(websiteUrl=AmazonWafRequestTest.websiteUrlExample,
websiteKey=AmazonWafRequestTest.websiteKeyExample,
challengeScript=AmazonWafRequestTest.challengeScriptExample,
captchaScript=int(AmazonWafRequestTest.captchaScriptExample),
context=AmazonWafRequestTest.contextExample,
iv=AmazonWafRequestTest.ivExample
)

request = AmazonWafRequest(
websiteUrl=AmazonWafRequestTest.websiteUrlExample,
websiteKey=AmazonWafRequestTest.websiteKeyExample,
challengeScript=AmazonWafRequestTest.challengeScriptExample,
captchaScript=int(AmazonWafRequestTest.captchaScriptExample),
context=AmazonWafRequestTest.contextExample,
iv=AmazonWafRequestTest.ivExample,
)

request = AmazonWafRequest(
websiteUrl=AmazonWafRequestTest.websiteUrlExample,
websiteKey=AmazonWafRequestTest.websiteKeyExample,
challengeScript=AmazonWafRequestTest.challengeScriptExample,
captchaScript=AmazonWafRequestTest.captchaScriptExample,
context=AmazonWafRequestTest.contextExample,
iv=AmazonWafRequestTest.ivExample,
)

request = AmazonWafRequest(websiteUrl=AmazonWafRequestTest.websiteUrlExample,
websiteKey=AmazonWafRequestTest.websiteKeyExample,
challengeScript=AmazonWafRequestTest.challengeScriptExample,
captchaScript=AmazonWafRequestTest.captchaScriptExample,
context=AmazonWafRequestTest.contextExample,
iv=AmazonWafRequestTest.ivExample
)

def testAllRequiredFieldsFilling(self):
required_fields = ['websiteURL', 'type', 'websiteKey', 'challengeScript', 'captchaScript',
'context', 'iv']
request = AmazonWafRequest(websiteUrl=AmazonWafRequestTest.websiteUrlExample,
websiteKey=AmazonWafRequestTest.websiteKeyExample,
challengeScript=AmazonWafRequestTest.challengeScriptExample,
captchaScript=AmazonWafRequestTest.captchaScriptExample,
context=AmazonWafRequestTest.contextExample,
iv=AmazonWafRequestTest.ivExample,
cookieSolution=True
)
required_fields = [
"websiteURL",
"type",
"websiteKey",
"challengeScript",
"captchaScript",
"context",
"iv",
]
request = AmazonWafRequest(
websiteUrl=AmazonWafRequestTest.websiteUrlExample,
websiteKey=AmazonWafRequestTest.websiteKeyExample,
challengeScript=AmazonWafRequestTest.challengeScriptExample,
captchaScript=AmazonWafRequestTest.captchaScriptExample,
context=AmazonWafRequestTest.contextExample,
iv=AmazonWafRequestTest.ivExample,
cookieSolution=True,
)
request_dict = request.getTaskDict()
for i in required_fields:
self.assertTrue(i in list(request_dict.keys()),
msg=f'Required field {i} not in {request_dict}')
self.assertTrue(
i in list(request_dict.keys()),
msg=f"Required field {i} not in {request_dict}",
)

self.assertEqual(request_dict["type"], "AmazonTask")

self.assertEqual(request_dict['type'], 'AmazonTask')


if __name__ == '__main__':
unittest.main()
if __name__ == "__main__":
unittest.main()
38 changes: 0 additions & 38 deletions test/basilisk_response_test.py

This file was deleted.

Loading