Skip to content

Commit e5a5a1b

Browse files
add yidun, mtcaptcha
1 parent 845e224 commit e5a5a1b

20 files changed

Lines changed: 1196 additions & 685 deletions

capmonstercloud_client/CapMonsterCloudClient.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@
3030
((AmazonWafRequest,), getAmazonWafTimeouts),
3131
((BinanceTaskRequest,), getBinanceTimeouts),
3232
((ImpervaCustomTaskRequest,), getImpervaTimeouts),
33-
((RecognitionComplexImageTaskRequest), getCITTimeouts)
33+
((RecognitionComplexImageTaskRequest), getCITTimeouts),
34+
((MTCaptchaRequest), getImage2TextTimeouts),
35+
((YidunRequest), getImage2TextTimeouts),
3436
)
3537

3638

@@ -79,7 +81,9 @@ async def solve_captcha(self, request: Union[
7981
BinanceTaskRequest,
8082
ImpervaCustomTaskRequest,
8183
TurnstileRequest,
82-
RecognitionComplexImageTaskRequest],
84+
RecognitionComplexImageTaskRequest,
85+
MTCaptchaRequest,
86+
YidunRequest],
8387
) -> Dict[str, str]:
8488
'''
8589
Non-blocking method for captcha solving.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from typing import Dict, Optional, Union
2+
from pydantic import Field
3+
from .baseRequestWithProxy import BaseRequestWithProxy
4+
5+
6+
class MTCaptchaRequest(BaseRequestWithProxy):
7+
type: str = Field(default="MTCaptchaTask")
8+
websiteUrl: str
9+
websiteKey: str
10+
pageAction: Optional[str] = Field(default=None)
11+
isInvisible: Optional[bool] = Field(default=None)
12+
userAgent: Optional[str] = Field(default=None)
13+
14+
def getTaskDict(self) -> Dict[str, Union[str, int, bool]]:
15+
task = {}
16+
task["type"] = self.type
17+
task["websiteURL"] = self.websiteUrl
18+
task["websiteKey"] = self.websiteKey
19+
if self.pageAction is not None:
20+
task["pageAction"] = self.pageAction
21+
if self.isInvisible is not None:
22+
task["isInvisible"] = self.isInvisible
23+
if self.userAgent is not None:
24+
task["userAgent"] = self.userAgent
25+
if self.proxy:
26+
task["proxyType"] = self.proxy.proxyType
27+
task["proxyAddress"] = self.proxy.proxyAddress
28+
task["proxyPort"] = self.proxy.proxyPort
29+
task["proxyLogin"] = self.proxy.proxyLogin
30+
task["proxyPassword"] = self.proxy.proxyPassword
31+
32+
return task
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from typing import Dict, Optional, Union
2+
from pydantic import Field
3+
from .baseRequestWithProxy import BaseRequestWithProxy
4+
5+
6+
class YidunRequest(BaseRequestWithProxy):
7+
type: str = Field(default="YidunTask")
8+
websiteUrl: str
9+
websiteKey: str
10+
userAgent: Optional[str] = Field(default=None)
11+
12+
def getTaskDict(self) -> Dict[str, Union[str, int, bool]]:
13+
task = {}
14+
task["type"] = self.type
15+
task["websiteURL"] = self.websiteUrl
16+
task["websiteKey"] = self.websiteKey
17+
if self.userAgent is not None:
18+
task["userAgent"] = self.userAgent
19+
if self.proxy:
20+
task["proxyType"] = self.proxy.proxyType
21+
task["proxyAddress"] = self.proxy.proxyAddress
22+
task["proxyPort"] = self.proxy.proxyPort
23+
task["proxyLogin"] = self.proxy.proxyLogin
24+
task["proxyPassword"] = self.proxy.proxyPassword
25+
26+
return task

capmonstercloud_client/requests/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
from .BinanceTaskRequest import BinanceTaskRequest
1919
from .ImpervaCustomTaskRequest import ImpervaCustomTaskRequest
2020
from .RecognitionComplexImageTaskRequest import RecognitionComplexImageTaskRequest
21+
from .MTCaptchaRequest import MTCaptchaRequest
22+
from .YidunRequest import YidunRequest
2123
from .proxy_info import ProxyInfo
2224

2325

test/amazonwaf_test.py

Lines changed: 57 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,75 @@
11
import unittest
22

33
from pydantic.error_wrappers import ValidationError
4+
45
from capmonstercloudclient.requests import AmazonWafRequest
5-
from capmonstercloudclient.exceptions import NumbersImagesErrors, TaskNotDefinedError, ZeroImagesErrors, \
6-
UserAgentNotDefinedError
6+
77

88
class AmazonWafRequestTest(unittest.TestCase):
9-
10-
websiteUrlExample = 'https://example.com'
11-
websiteKeyExample = '189123456'
12-
challengeScriptExample = 'challenge_test'
13-
captchaScriptExample = '123'
14-
contextExample = 'context'
15-
ivExample = 'ivexample_`¬'
9+
websiteUrlExample = "https://example.com"
10+
websiteKeyExample = "189123456"
11+
challengeScriptExample = "challenge_test"
12+
captchaScriptExample = "123"
13+
contextExample = "context"
14+
ivExample = "ivexample_`¬"
1615

1716
def testCaptchaInputTypes(self):
18-
1917
with self.assertRaises(ValidationError):
20-
request = AmazonWafRequest(websiteUrl=AmazonWafRequestTest.websiteUrlExample)
21-
18+
request = AmazonWafRequest(
19+
websiteUrl=AmazonWafRequestTest.websiteUrlExample
20+
)
21+
2222
with self.assertRaises(ValidationError):
2323
request = AmazonWafRequest(
24-
websiteKey=AmazonWafRequestTest.websiteKeyExample,
25-
)
24+
websiteKey=AmazonWafRequestTest.websiteKeyExample,
25+
)
2626
with self.assertRaises(ValidationError):
27-
request = AmazonWafRequest(websiteUrl=AmazonWafRequestTest.websiteUrlExample,
28-
websiteKey=AmazonWafRequestTest.websiteKeyExample,
29-
challengeScript=AmazonWafRequestTest.challengeScriptExample,
30-
captchaScript=int(AmazonWafRequestTest.captchaScriptExample),
31-
context=AmazonWafRequestTest.contextExample,
32-
iv=AmazonWafRequestTest.ivExample
33-
)
34-
27+
request = AmazonWafRequest(
28+
websiteUrl=AmazonWafRequestTest.websiteUrlExample,
29+
websiteKey=AmazonWafRequestTest.websiteKeyExample,
30+
challengeScript=AmazonWafRequestTest.challengeScriptExample,
31+
captchaScript=int(AmazonWafRequestTest.captchaScriptExample),
32+
context=AmazonWafRequestTest.contextExample,
33+
iv=AmazonWafRequestTest.ivExample,
34+
)
35+
36+
request = AmazonWafRequest(
37+
websiteUrl=AmazonWafRequestTest.websiteUrlExample,
38+
websiteKey=AmazonWafRequestTest.websiteKeyExample,
39+
challengeScript=AmazonWafRequestTest.challengeScriptExample,
40+
captchaScript=AmazonWafRequestTest.captchaScriptExample,
41+
context=AmazonWafRequestTest.contextExample,
42+
iv=AmazonWafRequestTest.ivExample,
43+
)
3544

36-
request = AmazonWafRequest(websiteUrl=AmazonWafRequestTest.websiteUrlExample,
37-
websiteKey=AmazonWafRequestTest.websiteKeyExample,
38-
challengeScript=AmazonWafRequestTest.challengeScriptExample,
39-
captchaScript=AmazonWafRequestTest.captchaScriptExample,
40-
context=AmazonWafRequestTest.contextExample,
41-
iv=AmazonWafRequestTest.ivExample
42-
)
43-
4445
def testAllRequiredFieldsFilling(self):
45-
required_fields = ['websiteURL', 'type', 'websiteKey', 'challengeScript', 'captchaScript',
46-
'context', 'iv']
47-
request = AmazonWafRequest(websiteUrl=AmazonWafRequestTest.websiteUrlExample,
48-
websiteKey=AmazonWafRequestTest.websiteKeyExample,
49-
challengeScript=AmazonWafRequestTest.challengeScriptExample,
50-
captchaScript=AmazonWafRequestTest.captchaScriptExample,
51-
context=AmazonWafRequestTest.contextExample,
52-
iv=AmazonWafRequestTest.ivExample,
53-
cookieSolution=True
54-
)
46+
required_fields = [
47+
"websiteURL",
48+
"type",
49+
"websiteKey",
50+
"challengeScript",
51+
"captchaScript",
52+
"context",
53+
"iv",
54+
]
55+
request = AmazonWafRequest(
56+
websiteUrl=AmazonWafRequestTest.websiteUrlExample,
57+
websiteKey=AmazonWafRequestTest.websiteKeyExample,
58+
challengeScript=AmazonWafRequestTest.challengeScriptExample,
59+
captchaScript=AmazonWafRequestTest.captchaScriptExample,
60+
context=AmazonWafRequestTest.contextExample,
61+
iv=AmazonWafRequestTest.ivExample,
62+
cookieSolution=True,
63+
)
5564
request_dict = request.getTaskDict()
5665
for i in required_fields:
57-
self.assertTrue(i in list(request_dict.keys()),
58-
msg=f'Required field {i} not in {request_dict}')
66+
self.assertTrue(
67+
i in list(request_dict.keys()),
68+
msg=f"Required field {i} not in {request_dict}",
69+
)
70+
71+
self.assertEqual(request_dict["type"], "AmazonTask")
5972

60-
self.assertEqual(request_dict['type'], 'AmazonTask')
61-
6273

63-
if __name__ == '__main__':
64-
unittest.main()
74+
if __name__ == "__main__":
75+
unittest.main()

test/basilisk_test.py

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,48 @@
11
import unittest
22

33
from pydantic.error_wrappers import ValidationError
4+
45
from capmonstercloudclient.requests import BasiliskCustomTaskRequest
5-
from capmonstercloudclient.exceptions import NumbersImagesErrors, TaskNotDefinedError, ZeroImagesErrors, \
6-
UserAgentNotDefinedError
6+
77

88
class BasiliskCustomTaskRequestTest(unittest.TestCase):
9-
10-
websiteUrlExample = 'https://example.com'
11-
websiteKeyExample = '189123456'
12-
userAgentExample = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
9+
websiteUrlExample = "https://example.com"
10+
websiteKeyExample = "189123456"
11+
userAgentExample = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
1312

1413
def testCaptchaInputTypes(self):
15-
1614
with self.assertRaises(ValidationError):
17-
request = BasiliskCustomTaskRequest(websiteUrl=BasiliskCustomTaskRequestTest.websiteUrlExample)
18-
15+
request = BasiliskCustomTaskRequest(
16+
websiteUrl=BasiliskCustomTaskRequestTest.websiteUrlExample
17+
)
18+
1919
with self.assertRaises(ValidationError):
2020
request = BasiliskCustomTaskRequest(
21-
websiteKey=BasiliskCustomTaskRequestTest.websiteKeyExample,
22-
)
23-
24-
25-
request = BasiliskCustomTaskRequest(websiteUrl=BasiliskCustomTaskRequestTest.websiteUrlExample,
26-
websiteKey=BasiliskCustomTaskRequestTest.websiteKeyExample,
27-
userAgent=BasiliskCustomTaskRequestTest.userAgentExample
28-
)
29-
21+
websiteKey=BasiliskCustomTaskRequestTest.websiteKeyExample,
22+
)
23+
24+
request = BasiliskCustomTaskRequest(
25+
websiteUrl=BasiliskCustomTaskRequestTest.websiteUrlExample,
26+
websiteKey=BasiliskCustomTaskRequestTest.websiteKeyExample,
27+
userAgent=BasiliskCustomTaskRequestTest.userAgentExample,
28+
)
29+
3030
def testAllRequiredFieldsFilling(self):
31-
required_fields = ['class', 'type', 'websiteURL', 'websiteKey']
32-
request = BasiliskCustomTaskRequest(websiteUrl=BasiliskCustomTaskRequestTest.websiteUrlExample,
33-
websiteKey=BasiliskCustomTaskRequestTest.websiteKeyExample)
31+
required_fields = ["class", "type", "websiteURL", "websiteKey"]
32+
request = BasiliskCustomTaskRequest(
33+
websiteUrl=BasiliskCustomTaskRequestTest.websiteUrlExample,
34+
websiteKey=BasiliskCustomTaskRequestTest.websiteKeyExample,
35+
)
3436
request_dict = request.getTaskDict()
3537
for i in required_fields:
36-
self.assertTrue(i in list(request_dict.keys()),
37-
msg=f'Required field {i} not in {request_dict}')
38+
self.assertTrue(
39+
i in list(request_dict.keys()),
40+
msg=f"Required field {i} not in {request_dict}",
41+
)
42+
43+
self.assertEqual(request_dict["class"], "Basilisk")
44+
self.assertEqual(request_dict["type"], "CustomTask")
3845

39-
self.assertEqual(request_dict['class'], 'Basilisk')
40-
self.assertEqual(request_dict['type'], 'CustomTask')
41-
4246

43-
if __name__ == '__main__':
44-
unittest.main()
47+
if __name__ == "__main__":
48+
unittest.main()

test/binance_test.py

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,46 @@
11
import unittest
2-
from copy import deepcopy
32

43
from pydantic import ValidationError
4+
55
from capmonstercloudclient.requests import BinanceTaskRequest
66

77

88
class BinanceRequestTest(unittest.TestCase):
9-
10-
websiteUrlExample = 'https://binance.com/login'
11-
websiteKeyExample = 'login'
12-
userAgentExample = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
13-
14-
def test_binance(self,
15-
):
16-
required_fields = ['type',
17-
'websiteURL',
18-
'websiteKey',
19-
'validateId']
20-
request = BinanceTaskRequest(websiteKey=self.websiteKeyExample,
21-
websiteUrl=self.websiteUrlExample,
22-
validateId='asdgf')
9+
websiteUrlExample = "https://binance.com/login"
10+
websiteKeyExample = "login"
11+
userAgentExample = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
12+
13+
def test_binance(
14+
self,
15+
):
16+
required_fields = ["type", "websiteURL", "websiteKey", "validateId"]
17+
request = BinanceTaskRequest(
18+
websiteKey=self.websiteKeyExample,
19+
websiteUrl=self.websiteUrlExample,
20+
validateId="asdgf",
21+
)
2322
task_dictionary = request.getTaskDict()
2423
for f in required_fields:
25-
self.assertTrue(f in list(task_dictionary.keys()),
26-
msg=f'Required captcha input key "{f}" does not include to request.')
27-
28-
def test_binance_missing(self,):
29-
required_fields = ['type',
30-
'websiteURL',
31-
'websiteKey',
32-
'validateId']
24+
self.assertTrue(
25+
f in list(task_dictionary.keys()),
26+
msg=f'Required captcha input key "{f}" does not include to request.',
27+
)
28+
29+
def test_binance_missing(
30+
self,
31+
):
32+
required_fields = ["type", "websiteURL", "websiteKey", "validateId"]
3333
base_kwargs = {}
3434
self.assertRaises(ValidationError, BinanceTaskRequest, **base_kwargs)
35-
base_kwargs.update({'websiteUrl': self.websiteUrlExample})
35+
base_kwargs.update({"websiteUrl": self.websiteUrlExample})
3636
self.assertRaises(ValidationError, BinanceTaskRequest, **base_kwargs)
37-
base_kwargs.update({'websiteKey': self.websiteKeyExample})
37+
base_kwargs.update({"websiteKey": self.websiteKeyExample})
3838
self.assertRaises(ValidationError, BinanceTaskRequest, **base_kwargs)
39-
base_kwargs.update({'validateId': 'asdgf'})
39+
base_kwargs.update({"validateId": "asdgf"})
4040
BinanceTaskRequest(**base_kwargs)
41-
base_kwargs.update({'userAgent': self.userAgentExample})
41+
base_kwargs.update({"userAgent": self.userAgentExample})
4242
BinanceTaskRequest(**base_kwargs)
4343

44-
if __name__ == '__main__':
45-
unittest.main()
44+
45+
if __name__ == "__main__":
46+
unittest.main()

0 commit comments

Comments
 (0)