Skip to content

Commit 0918bc6

Browse files
committed
release v2.2.0
1 parent 21ea5e0 commit 0918bc6

File tree

4 files changed

+238
-1
lines changed

4 files changed

+238
-1
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "2.1.4"
1+
__version__ = "2.2.0"
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
from typing import Union, Optional
2+
3+
from .core.base import CaptchaParams
4+
from .core.enum import ProxyTypeEnm, CaptchaTypeEnm
5+
6+
__all__ = ("AmazonWAF",)
7+
8+
9+
class AmazonWAF(CaptchaParams):
10+
def __init__(
11+
self,
12+
api_key: str,
13+
captcha_type: Union[CaptchaTypeEnm, str],
14+
websiteURL: str,
15+
websiteKey: str,
16+
iv: str,
17+
context: str,
18+
proxyType: Optional[Union[ProxyTypeEnm, str]] = None,
19+
proxyAddress: Optional[str] = None,
20+
proxyPort: Optional[int] = None,
21+
proxyLogin: Optional[str] = None,
22+
proxyPassword: Optional[str] = None,
23+
userAgent: Optional[str] = None,
24+
sleep_time: Optional[int] = 10,
25+
):
26+
"""
27+
The class is used to work with FunCaptcha.
28+
29+
Args:
30+
api_key: Capsolver API key
31+
captcha_type: Captcha type
32+
websiteURL: Address of a target web page. Can be located anywhere on the web site, even in a member area
33+
websiteKey: Value of key from window.gokuProps object in WAF page source code
34+
iv: Value of iv from window.gokuProps object in WAF page source code
35+
context: Value of context from window.gokuProps object in WAF page source code
36+
37+
proxyType: Type of the proxy
38+
proxyAddress: Proxy IP address IPv4/IPv6. Not allowed to use:
39+
host names instead of IPs,
40+
transparent proxies (where client IP is visible),
41+
proxies from local networks (192.., 10.., 127...)
42+
proxyPort: Proxy port.
43+
proxyLogin: Proxy login.
44+
proxyPassword: Proxy password.
45+
userAgent: Browser UserAgent.
46+
sleep_time: The waiting time between requests to get the result of the Captcha
47+
48+
Examples:
49+
>>> AmazonWAF(api_key="99d7d111a0111dc11184111c8bb111da",
50+
... captcha_type="AmazonTaskProxyless",
51+
... websiteURL="https://efw47fpad9.execute-api.us-east-1.amazonaws.com/latest",
52+
... websiteKey="AQIDAgghr5y45ywZwdADFLWk7XOA==",
53+
... iv="CgAAXFFFFSAAABVk",
54+
... context="qoJYgnKscdqwdqwdqwaormh/dYYK+Y=",
55+
... ).captcha_handler()
56+
{
57+
"errorId": 0,
58+
"errorCode": None,
59+
"errorDescription": None,
60+
"status":"ready",
61+
"solution":{
62+
"token":"0.Qz0.....f1"
63+
},
64+
"cost": 0.002,
65+
"ip": "46.53.249.230",
66+
"createTime": 1679004358,
67+
"endTime": 1679004368,
68+
"solveCount": 0,
69+
"taskId": 396687629
70+
}
71+
72+
>>> await AmazonWAF(api_key="99d7d111a0111dc11184111c8bb111da",
73+
... captcha_type="AmazonTaskProxyless",
74+
... websiteURL="https://efw47fpad9.execute-api.us-east-1.amazonaws.com/latest",
75+
... websiteKey="AQIDAgghr5y45ywZwdADFLWk7XOA==",
76+
... iv="CgAAXFFFFSAAABVk",
77+
... context="qoJYgnKscdqwdqwdqwaormh/dYYK+Y=",
78+
... ).aio_captcha_handler()
79+
{
80+
"errorId": 0,
81+
"errorCode": None,
82+
"errorDescription": None,
83+
"status":"ready",
84+
"solution":{
85+
"token":"0.Qz0.....f1"
86+
},
87+
"cost": 0.002,
88+
"ip": "46.53.249.230",
89+
"createTime": 1679004358,
90+
"endTime": 1679004368,
91+
"solveCount": 0,
92+
"taskId": 396687629
93+
}
94+
95+
>>> AmazonWAF(api_key="99d7d111a0111dc11184111c8bb111da",
96+
... captcha_type="AmazonTaskProxyless",
97+
... websiteURL="https://efw47fpad9.execute-api.us-east-1.amazonaws.com/latest",
98+
... websiteKey="AQIDAgghr5y45ywZwdADFLWk7XOA==",
99+
... iv="CgAAXFFFFSAAABVk",
100+
... context="qoJYgnKscdqwdqwdqwaormh/dYYK+Y=",
101+
... proxyType="http",
102+
... proxyAddress="0.0.0.0",
103+
... proxyPort=9988,
104+
... proxyLogin="proxy_login",
105+
... proxyPassword="proxy_password",
106+
... userAgent="some_real_user_agent",
107+
... ).captcha_handler()
108+
{
109+
"errorId": 0,
110+
"errorCode": None,
111+
"errorDescription": None,
112+
"status":"ready",
113+
"solution":{
114+
"token":"0.Qz0.....f1"
115+
},
116+
"cost": 0.002,
117+
"ip": "46.53.249.230",
118+
"createTime": 1679004358,
119+
"endTime": 1679004368,
120+
"solveCount": 0,
121+
"taskId": 396687629
122+
}
123+
124+
Notes:
125+
https://anti-captcha.com/apidoc/task-types/AmazonTask
126+
127+
https://anti-captcha.com/apidoc/task-types/AmazonTaskProxyless
128+
"""
129+
super().__init__(api_key=api_key, sleep_time=sleep_time)
130+
131+
# validation of the received parameters
132+
if captcha_type == CaptchaTypeEnm.AmazonTask:
133+
self.task_params = dict(
134+
type=captcha_type,
135+
websiteURL=websiteURL,
136+
websitePublicKey=websiteKey,
137+
iv=iv,
138+
context=context,
139+
proxyType=proxyType,
140+
proxyAddress=proxyAddress,
141+
proxyPort=proxyPort,
142+
proxyLogin=proxyLogin,
143+
proxyPassword=proxyPassword,
144+
userAgent=userAgent,
145+
)
146+
elif captcha_type == CaptchaTypeEnm.AmazonTaskProxyless:
147+
self.task_params = dict(
148+
type=captcha_type,
149+
websiteURL=websiteURL,
150+
websitePublicKey=websiteKey,
151+
iv=iv,
152+
context=context,
153+
)
154+
else:
155+
raise ValueError(
156+
f"Invalid `captcha_type` parameter set for `{self.__class__.__name__}`, \
157+
available - {CaptchaTypeEnm.FunCaptchaTaskProxyless.value,CaptchaTypeEnm.FunCaptchaTask.value}"
158+
)

src/python3_anticaptcha/core/enum.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ class CaptchaTypeEnm(str, MyEnum):
6161
# FriendlyCaptcha
6262
ProsopoTask = "ProsopoTask"
6363
ProsopoTaskProxyless = "ProsopoTaskProxyless"
64+
# AmazonWAF
65+
AmazonTask = "AmazonTask"
66+
AmazonTaskProxyless = "AmazonTaskProxyless"
6467
# Custom
6568
AntiGateTask = "AntiGateTask"
6669

tests/test_amazon_waf.py

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import pytest
2+
3+
from tests.conftest import BaseTest
4+
from python3_anticaptcha.core.enum import ProxyTypeEnm, CaptchaTypeEnm
5+
from python3_anticaptcha.amazon_waf import AmazonWAF
6+
from python3_anticaptcha.core.serializer import GetTaskResultResponseSer
7+
8+
9+
class TestAmazonWAF(BaseTest):
10+
websiteURL = "https://efw47fpad9.execute-api.us-east-1.amazonaws.com/latest"
11+
websiteKey = "AQIDAgghr5y45ywZwdADFLWk7XOA=="
12+
iv = "CgAAXFFFFSAAABVk"
13+
_context = "qoJYgnKscdqwdqwdqwaormh/dYYK+Y="
14+
15+
def get_proxy_args(self) -> dict:
16+
proxy_args = super().get_proxy_args()
17+
proxy_args.update({"userAgent": self.get_random_string()})
18+
return proxy_args
19+
20+
def test_sio_success(self):
21+
instance = AmazonWAF(
22+
api_key=self.API_KEY,
23+
websiteURL=self.websiteURL,
24+
websiteKey=self.websiteKey,
25+
iv=self.iv,
26+
context=self._context,
27+
captcha_type=CaptchaTypeEnm.AmazonTaskProxyless,
28+
)
29+
result = instance.captcha_handler()
30+
31+
assert isinstance(result, dict)
32+
ser_result = GetTaskResultResponseSer(**result)
33+
assert ser_result.errorId == 24
34+
35+
async def test_aio_success(self):
36+
instance = AmazonWAF(
37+
api_key=self.API_KEY,
38+
websiteURL=self.websiteURL,
39+
websiteKey=self.websiteKey,
40+
iv=self.iv,
41+
context=self._context,
42+
captcha_type=CaptchaTypeEnm.AmazonTaskProxyless,
43+
)
44+
result = await instance.aio_captcha_handler()
45+
46+
assert isinstance(result, dict)
47+
ser_result = GetTaskResultResponseSer(**result)
48+
assert ser_result.errorId == 24
49+
50+
@pytest.mark.parametrize("proxyType", ProxyTypeEnm)
51+
def test_proxy_args(self, proxyType: ProxyTypeEnm):
52+
proxy_args = self.get_proxy_args()
53+
proxy_args.update({"proxyType": proxyType})
54+
55+
instance = AmazonWAF(
56+
api_key=self.API_KEY,
57+
websiteURL=self.websiteURL,
58+
websiteKey=self.websiteKey,
59+
iv=self.iv,
60+
context=self._context,
61+
captcha_type=CaptchaTypeEnm.AmazonTask,
62+
**proxy_args,
63+
)
64+
for key, value in proxy_args.items():
65+
assert instance.task_params[key] == value
66+
67+
def test_err_captcha_type(self):
68+
with pytest.raises(ValueError):
69+
AmazonWAF(
70+
api_key=self.API_KEY,
71+
websiteURL=self.websiteURL,
72+
websiteKey=self.websiteKey,
73+
iv=self.iv,
74+
context=self._context,
75+
captcha_type=self.get_random_string(length=10),
76+
)

0 commit comments

Comments
 (0)