python-rucaptcha 5.3.1__py3-none-any.whl → 6.0__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.
@@ -1 +1 @@
1
- __version__ = "5.3.1"
1
+ __version__ = "6.0"
@@ -1,3 +1,5 @@
1
+ from typing import Union
2
+
1
3
  from .core.base import BaseCaptcha
2
4
  from .core.enums import AmazonWAFCaptchaEnm
3
5
 
@@ -5,11 +7,11 @@ from .core.enums import AmazonWAFCaptchaEnm
5
7
  class AmazonWAF(BaseCaptcha):
6
8
  def __init__(
7
9
  self,
8
- pageurl: str,
9
- sitekey: str,
10
+ websiteURL: str,
11
+ websiteKey: str,
10
12
  iv: str,
11
13
  context: str,
12
- method: str = AmazonWAFCaptchaEnm.AMAZON_WAF.value,
14
+ method: Union[str, AmazonWAFCaptchaEnm] = AmazonWAFCaptchaEnm.AmazonTaskProxyless,
13
15
  *args,
14
16
  **kwargs,
15
17
  ):
@@ -18,74 +20,80 @@ class AmazonWAF(BaseCaptcha):
18
20
 
19
21
  Args:
20
22
  rucaptcha_key: User API key
21
- pageurl: Full URL of the captcha page
22
- sitekey: Key value from the page
23
+ websiteURL: Full URL of the captcha page
24
+ websiteKey: Key value from the page
23
25
  iv: Value iv from the page
24
26
  context: Value of context from page
25
27
  method: Captcha type
26
28
 
27
29
  Examples:
28
30
  >>> AmazonWAF(rucaptcha_key="aa9011f31111181111168611f1151122",
29
- ... pageurl="https://page-with-waf.com/",
30
- ... sitekey="some-site-key",
31
+ ... websiteURL="https://page-with-waf.com/",
32
+ ... websiteKey="some-site-key",
31
33
  ... iv="some-iv-value",
32
34
  ... context="some-context-value").captcha_handler()
33
35
  {
34
- 'captchaSolve': 'eyJ0e......jNuSFqtyP4Ho',
35
- 'taskId': '7111111984',
36
- 'error': False,
37
- 'errorBody': None
36
+ "errorId":0,
37
+ "status":"ready",
38
+ "solution":{
39
+ "captcha_voucher":"eyJ0eXAiO...oQjTnJlBvAW4",
40
+ "existing_token":"f8ab5749-f916-...5D8yAA39JtKVbw="
41
+ },
42
+ "cost":"0.00145",
43
+ "ip":"1.2.3.4",
44
+ "createTime":1692863536,
45
+ "endTime":1692863556,
46
+ "solveCount":0,
47
+ "taskId": 73243152973,
38
48
  }
39
49
 
40
50
  >>> AmazonWAF(rucaptcha_key="aa9011f31111181111168611f1151122",
41
- ... pageurl="https://page-with-waf.com/",
42
- ... sitekey="some-site-key",
51
+ ... websiteURL="https://page-with-waf.com/",
52
+ ... websiteKey="some-site-key",
43
53
  ... iv="some-iv-value",
44
54
  ... context="some-context-value").aio_captcha_handler()
45
55
  {
46
- 'captchaSolve': 'eyJ0e......jNuSFqtyP4Ho',
47
- 'taskId': '7111111984',
48
- 'error': False,
49
- 'errorBody': None
56
+ "errorId":0,
57
+ "status":"ready",
58
+ "solution":{
59
+ "captcha_voucher":"eyJ0eXAiO...oQjTnJlBvAW4",
60
+ "existing_token":"f8ab5749-f916-...5D8yAA39JtKVbw="
61
+ },
62
+ "cost":"0.00145",
63
+ "ip":"1.2.3.4",
64
+ "createTime":1692863536,
65
+ "endTime":1692863556,
66
+ "solveCount":0,
67
+ "taskId": 73243152973,
50
68
  }
51
69
 
52
70
  Returns:
53
71
  Dict with full server response
54
72
 
55
73
  Notes:
56
- https://rucaptcha.com/api-rucaptcha#amazon-waf
74
+ https://rucaptcha.com/api-docs/amazon-aws-waf-captcha
57
75
  """
58
76
  super().__init__(method=method, *args, **kwargs)
59
77
 
60
- self.post_payload.update({"sitekey": sitekey, "pageurl": pageurl, "iv": iv, "context": context})
61
-
62
78
  # check user params
63
79
  if method not in AmazonWAFCaptchaEnm.list_values():
64
80
  raise ValueError(f"Invalid method parameter set, available - {AmazonWAFCaptchaEnm.list_values()}")
81
+ # insert `gt` param to payload
82
+ self.create_task_payload["task"].update(
83
+ {
84
+ "websiteURL": websiteURL,
85
+ "websiteKey": websiteKey,
86
+ "iv": iv,
87
+ "context": context,
88
+ }
89
+ )
65
90
 
66
91
  def captcha_handler(self, **kwargs) -> dict:
67
92
  """
68
93
  Synchronous method for captcha solving
69
94
 
70
- Examples:
71
- >>> AmazonWAF(rucaptcha_key="aa9011f31111181111168611f1151122",
72
- ... pageurl="https://page-with-waf.com/",
73
- ... sitekey="some-site-key",
74
- ... iv="some-iv-value",
75
- ... context="some-context-value").captcha_handler()
76
- {
77
- 'captchaSolve': 'eyJ0e......jNuSFqtyP4Ho',
78
- 'taskId': '7111111984',
79
- 'error': False,
80
- 'errorBody': None
81
- }
82
-
83
95
  Returns:
84
- Response to captcha as JSON string with fields:
85
- captchaSolve - captcha solution,
86
- taskId - finds the ID of the task to solve the captcha,
87
- error - False - if everything is fine, True - if there is an error,
88
- errorBody - error name
96
+ Dict with full server response
89
97
 
90
98
  Notes:
91
99
  Check class docstirng for more info
@@ -97,25 +105,8 @@ class AmazonWAF(BaseCaptcha):
97
105
  """
98
106
  Asynchronous method for captcha solving
99
107
 
100
- Examples:
101
- >>> await AmazonWAF(rucaptcha_key="aa9011f31111181111168611f1151122",
102
- ... pageurl="https://page-with-waf.com/",
103
- ... sitekey="some-site-key",
104
- ... iv="some-iv-value",
105
- ... context="some-context-value").aio_captcha_handler()
106
- {
107
- 'captchaSolve': 'eyJ0e......jNuSFqtyP4Ho',
108
- 'taskId': '7111111984',
109
- 'error': False,
110
- 'errorBody': None
111
- }
112
-
113
108
  Returns:
114
- Response to captcha as JSON string with fields:
115
- captchaSolve - captcha solution,
116
- taskId - finds the ID of the task to solve the captcha,
117
- error - False - if everything is fine, True - if there is an error,
118
- errorBody - error name
109
+ Dict with full server response
119
110
 
120
111
  Notes:
121
112
  Check class docstirng for more info
@@ -1,15 +1,15 @@
1
- import base64
2
1
  import shutil
3
- from typing import Optional
2
+ from typing import Union, Optional
4
3
 
5
4
  from .core.base import BaseCaptcha
6
5
  from .core.enums import SaveFormatsEnm, AudioCaptchaEnm
6
+ from .core.serializer import GetTaskResultResponseSer
7
7
 
8
8
 
9
9
  class AudioCaptcha(BaseCaptcha):
10
10
  def __init__(
11
11
  self,
12
- save_format: str = SaveFormatsEnm.TEMP.value,
12
+ save_format: Union[str, SaveFormatsEnm] = SaveFormatsEnm.TEMP,
13
13
  audio_clearing: bool = True,
14
14
  audio_path: str = "PythonRuCaptchaAudio",
15
15
  lang: str = "en",
@@ -74,15 +74,16 @@ class AudioCaptcha(BaseCaptcha):
74
74
  Dict with full server response
75
75
 
76
76
  Notes:
77
- https://rucaptcha.com/api-rucaptcha#audio
77
+ https://rucaptcha.com/api-docs/audio
78
78
  """
79
79
 
80
- super().__init__(method=AudioCaptchaEnm.AUDIO.value, *args, **kwargs)
80
+ super().__init__(method=AudioCaptchaEnm.AudioTask.value, *args, **kwargs)
81
81
  self.save_format = save_format
82
82
  self.audio_clearing = audio_clearing
83
83
  self.audio_path = audio_path
84
+ self.result = GetTaskResultResponseSer()
84
85
 
85
- self.post_payload.update({"lang": lang})
86
+ self.create_task_payload["task"].update({"lang": lang})
86
87
 
87
88
  def captcha_handler(
88
89
  self,
@@ -100,60 +101,25 @@ class AudioCaptcha(BaseCaptcha):
100
101
  captcha_base64: Captcha file BASE64 info
101
102
  kwargs: additional params for `requests` library
102
103
 
103
- Examples:
104
- >>> AudioCaptcha(rucaptcha_key="aa9011f31111181111168611f1151122",
105
- ... lang='en'
106
- ... ).captcha_handler(captcha_file='examples/mediacaptcha_audio/recaptcha_55914.mp3')
107
- {
108
- 'captchaSolve': 'five five nine one four',
109
- 'taskId': 73243152973,
110
- 'error': False,
111
- 'errorBody': None
112
- }
113
-
114
- >>> AudioCaptcha(rucaptcha_key="aa9011f31111181111168611f1151122",
115
- ... lang='en'
116
- ... ).captcha_handler(captcha_link='http://some/link/address/recaptcha_55914.mp3')
117
- {
118
- 'captchaSolve': 'five five nine one four',
119
- 'taskId': 73243152973,
120
- 'error': False,
121
- 'errorBody': None
122
- }
123
-
124
104
  Returns:
125
105
  Dict with full server response
126
106
 
127
107
  Notes:
128
108
  Check class docstirng for more info
129
109
  """
130
- # if a local file link is passed
131
- if captcha_file:
132
- self.post_payload.update({"body": base64.b64encode(self._local_file_captcha(captcha_file)).decode("utf-8")})
133
- # if the file is transferred in base64 encoding
134
- elif captcha_base64:
135
- self.post_payload.update({"body": base64.b64encode(captcha_base64).decode("utf-8")})
136
- # if a URL is passed
137
- elif captcha_link:
138
- try:
139
- content = self.url_open(url=captcha_link, **kwargs).content
140
- except Exception as error:
141
- self.result.error = True
142
- self.result.errorBody = str(error)
143
- return self.result.dict()
144
-
145
- # according to the value of the passed parameter, select the function to save the file
146
- if self.save_format == SaveFormatsEnm.CONST.value:
147
- self._file_const_saver(content, self.audio_path, file_extension="mp3")
148
- self.post_payload.update({"body": base64.b64encode(content).decode("utf-8")})
149
-
150
- else:
151
- # if none of the parameters are passed
152
- self.result.error = True
153
- self.result.errorBody = self.NO_CAPTCHA_ERR
154
- return self.result.dict()
155
-
156
- return self._processing_response(**kwargs)
110
+
111
+ self._body_file_processing(
112
+ save_format=self.save_format,
113
+ file_path=self.audio_path,
114
+ file_extension="mp3",
115
+ captcha_link=captcha_link,
116
+ captcha_file=captcha_file,
117
+ captcha_base64=captcha_base64,
118
+ **kwargs,
119
+ )
120
+ if not self.result.errorId:
121
+ return self._processing_response(**kwargs)
122
+ return self.result.to_dict()
157
123
 
158
124
  async def aio_captcha_handler(
159
125
  self,
@@ -171,59 +137,24 @@ class AudioCaptcha(BaseCaptcha):
171
137
  captcha_base64: Captcha file BASE64
172
138
  kwargs: additional params for `aiohttp` library
173
139
 
174
- Examples:
175
- >>> await AudioCaptcha(rucaptcha_key="aa9011f31111181111168611f1151122",
176
- ... lang='en'
177
- ... ).aio_captcha_handler(captcha_file='examples/mediacaptcha_audio/recaptcha_55914.mp3')
178
- {
179
- 'captchaSolve': 'five five nine one four',
180
- 'taskId': 73243152973,
181
- 'error': False,
182
- 'errorBody': None
183
- }
184
- >>> await AudioCaptcha(rucaptcha_key="aa9011f31111181111168611f1151122",
185
- ... lang='en'
186
- ... ).aio_captcha_handler(captcha_link='http://some/link/address/recaptcha_55914.mp3')
187
- {
188
- 'captchaSolve': 'five five nine one four',
189
- 'taskId': 73243152973,
190
- 'error': False,
191
- 'errorBody': None
192
- }
193
-
194
140
  Returns:
195
141
  Dict with full server response
196
142
 
197
143
  Notes:
198
144
  Check class docstirng for more info
199
145
  """
200
- # if a local file link is passed
201
- if captcha_file:
202
- self.post_payload.update({"body": base64.b64encode(self._local_file_captcha(captcha_file)).decode("utf-8")})
203
- # if the file is transferred in base64 encoding
204
- elif captcha_base64:
205
- self.post_payload.update({"body": base64.b64encode(captcha_base64).decode("utf-8")})
206
- # if a URL is passed
207
- elif captcha_link:
208
- try:
209
- content = await self.aio_url_read(url=captcha_link, **kwargs)
210
- except Exception as error:
211
- self.result.error = True
212
- self.result.errorBody = str(error)
213
- return self.result.dict()
214
-
215
- # according to the value of the passed parameter, select the function to save the file
216
- if self.save_format == SaveFormatsEnm.CONST.value:
217
- self._file_const_saver(content, self.audio_path, file_extension="mp3")
218
- self.post_payload.update({"body": base64.b64encode(content).decode("utf-8")})
219
-
220
- else:
221
- # if none of the parameters are passed
222
- self.result.error = True
223
- self.result.errorBody = self.NO_CAPTCHA_ERR
224
- return self.result.dict()
225
-
226
- return await self._aio_processing_response()
146
+ await self._aio_body_file_processing(
147
+ save_format=self.save_format,
148
+ file_path=self.audio_path,
149
+ file_extension="mp3",
150
+ captcha_link=captcha_link,
151
+ captcha_file=captcha_file,
152
+ captcha_base64=captcha_base64,
153
+ **kwargs,
154
+ )
155
+ if not self.result.errorId:
156
+ return await self._aio_processing_response()
157
+ return self.result.to_dict()
227
158
 
228
159
  def __del__(self):
229
160
  if self.save_format == SaveFormatsEnm.CONST.value and self.audio_clearing:
@@ -1,131 +1,121 @@
1
+ from typing import Union
2
+
1
3
  from .core.base import BaseCaptcha
2
4
  from .core.enums import CapyPuzzleEnm
3
5
 
4
6
 
5
7
  class CapyPuzzle(BaseCaptcha):
6
- def __init__(self, pageurl: str, captchakey: str, method: str = CapyPuzzleEnm.CAPY.value, *args, **kwargs):
8
+ def __init__(
9
+ self,
10
+ websiteURL: str,
11
+ websiteKey: str,
12
+ method: Union[str, CapyPuzzleEnm] = CapyPuzzleEnm.CapyTaskProxyless,
13
+ *args,
14
+ **kwargs,
15
+ ):
7
16
  """
8
17
  The class is used to work with CapyPuzzle.
9
18
 
10
19
  Args:
11
20
  rucaptcha_key: User API key
12
- pageurl: Full URL of the captcha page
13
- captchakey: The value of the `captchakey` parameter you found in the code of the page
21
+ websiteURL: Full URL of the captcha page
22
+ websiteKey: The value of the `captchakey` parameter you found in the code of the page
14
23
  method: Captcha type
15
24
 
16
25
  Examples:
17
26
  >>> CapyPuzzle(rucaptcha_key="aa9011f31111181111168611f1151122",
18
- ... captchakey="PUZZLE_Cme4hZLjuZRMYC3uh14C52D3uNms5w",
19
- ... pageurl="https://www.capy.me/account/register/",
20
- ... method=CapyPuzzleEnm.CAPY.value,
27
+ ... websiteKey="PUZZLE_Cme4hZLjuZRMYC3uh14C52D3uNms5w",
28
+ ... websiteURL="https://www.capy.me/account/register/",
29
+ ... method=CapyPuzzleEnm.CapyTaskProxyless.value,
21
30
  ... api_server="https://jp.api.capy.me/",
22
31
  ... version="puzzle",
23
32
  ... ).captcha_handler()
24
33
  {
25
- "captchaSolve": {
26
- "captchakey": "PUZZLE_C...w",
27
- "challengekey": "Uf....It",
28
- "answer": "26x...x9mx"
34
+ "errorId":0,
35
+ "status":"ready",
36
+ "solution":{
37
+ "captchakey":"PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v",
38
+ "challengekey":"qHAPtn68KTnXFM8VQ3mtYRtmy3cSKuHJ",
39
+ "answer":"0xax8ex0xax84x0xkx7qx0xux7gx0xx42x0x3ox42x0x3ox4cx",
40
+ "respKey":""
29
41
  },
30
- "taskId": 73052314114,
31
- "error": False,
32
- "errorBody": None
42
+ "cost":"0.00299",
43
+ "ip":"1.2.3.4",
44
+ "createTime":1692863536,
45
+ "endTime":1692863556,
46
+ "solveCount":1,
47
+ "taskId":75190409731
33
48
  }
34
49
 
35
50
  >>> CapyPuzzle(rucaptcha_key="aa9011f31111181111168611f1151122",
36
- ... captchakey="AVATAR_Cme4hZLjuZRMYC3uh14C52D3uNms5w",
37
- ... pageurl="https://www.capy.me/account/register/",
38
- ... method=CapyPuzzleEnm.CAPY.value,
51
+ ... websiteKey="PUZZLE_Cme4hZLjuZRMYC3uh14C52D3uNms5w",
52
+ ... websiteURL="https://www.capy.me/account/register/",
53
+ ... method=CapyPuzzleEnm.CapyTaskProxyless.value,
39
54
  ... api_server="https://jp.api.capy.me/",
40
55
  ... version="avatar",
41
56
  ... ).captcha_handler()
42
57
  {
43
- "captchaSolve": {
44
- "captchakey": "AVATART_C...w",
45
- "challengekey": "Uf....It",
46
- "answer": "26x...x9mx"
58
+ "errorId":0,
59
+ "status":"ready",
60
+ "solution":{
61
+ "captchakey":"PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v",
62
+ "challengekey":"qHAPtn68KTnXFM8VQ3mtYRtmy3cSKuHJ",
63
+ "answer":"0xax8ex0xax84x0xkx7qx0xux7gx0xx42x0x3ox42x0x3ox4cx",
64
+ "respKey":""
47
65
  },
48
- "taskId": 73052314114,
49
- "error": False,
50
- "errorBody": None
66
+ "cost":"0.00299",
67
+ "ip":"1.2.3.4",
68
+ "createTime":1692863536,
69
+ "endTime":1692863556,
70
+ "solveCount":1,
71
+ "taskId":75190409731
51
72
  }
52
73
 
53
74
  >>> CapyPuzzle(rucaptcha_key="aa9011f31111181111168611f1151122",
54
- ... captchakey="PUZZLE_Cme4hZLjuZRMYC3uh14C52D3uNms5w",
55
- ... pageurl="https://www.capy.me/account/register/",
56
- ... method="capy",
75
+ ... websiteKey="PUZZLE_Cme4hZLjuZRMYC3uh14C52D3uNms5w",
76
+ ... websiteURL="https://www.capy.me/account/register/",
77
+ ... method="CapyTaskProxyless",
57
78
  ... api_server="https://jp.api.capy.me/",
58
79
  ... version="puzzle",
59
80
  ... ).captcha_handler()
60
81
  {
61
- "captchaSolve": {
62
- "captchakey": "PUZZLE_C...w",
63
- "challengekey": "Uf....It",
64
- "answer": "26x...x9mx"
82
+ "errorId":0,
83
+ "status":"ready",
84
+ "solution":{
85
+ "captchakey":"PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v",
86
+ "challengekey":"qHAPtn68KTnXFM8VQ3mtYRtmy3cSKuHJ",
87
+ "answer":"0xax8ex0xax84x0xkx7qx0xux7gx0xx42x0x3ox42x0x3ox4cx",
88
+ "respKey":""
65
89
  },
66
- "taskId": 73052314114,
67
- "error": False,
68
- "errorBody": None
90
+ "cost":"0.00299",
91
+ "ip":"1.2.3.4",
92
+ "createTime":1692863536,
93
+ "endTime":1692863556,
94
+ "solveCount":1,
95
+ "taskId":75190409731
69
96
  }
70
97
 
71
98
  Returns:
72
99
  Dict with full server response
73
100
 
74
101
  Notes:
75
- https://rucaptcha.com/api-rucaptcha#solving_capy
102
+ https://rucaptcha.com/api-docs/capy-puzzle-captcha
76
103
  """
77
104
  super().__init__(method=method, *args, **kwargs)
78
105
 
79
- self.post_payload.update({"captchakey": captchakey, "pageurl": pageurl})
106
+ self.create_task_payload["task"].update({"websiteURL": websiteURL, "websiteKey": websiteKey})
80
107
 
81
108
  # check user params
82
109
  if method not in CapyPuzzleEnm.list_values():
83
110
  raise ValueError(f"Invalid method parameter set, available - {CapyPuzzleEnm.list_values()}")
84
111
 
85
- def captcha_handler(self, **kwargs):
112
+ def captcha_handler(self, **kwargs) -> dict:
86
113
  """
87
114
  Sync solving method
88
115
 
89
116
  Args:
90
117
  kwargs: additional params for `requests` library
91
118
 
92
- Examples:
93
- >>> CapyPuzzle(rucaptcha_key="aa9011f31111181111168611f1151122",
94
- ... captchakey="PUZZLE_Cme4hZLjuZRMYC3uh14C52D3uNms5w",
95
- ... pageurl="https://www.capy.me/account/register/",
96
- ... method=CapyPuzzleEnm.CAPY.value,
97
- ... api_server="https://jp.api.capy.me/",
98
- ... version="puzzle",
99
- ... ).captcha_handler()
100
- {
101
- "captchaSolve": {
102
- "captchakey": "PUZZLE_C...w",
103
- "challengekey": "Uf....It",
104
- "answer": "26x...x9mx"
105
- },
106
- "taskId": 73052314114,
107
- "error": False,
108
- "errorBody": None
109
- }
110
-
111
- >>> CapyPuzzle(rucaptcha_key="aa9011f31111181111168611f1151122",
112
- ... captchakey="PUZZLE_Cme4hZLjuZRMYC3uh14C52D3uNms5w",
113
- ... pageurl="https://www.capy.me/account/register/",
114
- ... method=CapyPuzzleEnm.CAPY.value,
115
- ... api_server="https://jp.api.capy.me/",
116
- ... version="avatar",
117
- ... ).captcha_handler()
118
- {
119
- "captchaSolve": {
120
- "captchakey": "AVATART_C...w",
121
- "challengekey": "Uf....It",
122
- "answer": "26x...x9mx"
123
- },
124
- "taskId": 73052314114,
125
- "error": False,
126
- "errorBody": None
127
- }
128
-
129
119
  Returns:
130
120
  Dict with full server response
131
121
 
@@ -135,47 +125,10 @@ class CapyPuzzle(BaseCaptcha):
135
125
 
136
126
  return self._processing_response(**kwargs)
137
127
 
138
- async def aio_captcha_handler(self):
128
+ async def aio_captcha_handler(self) -> dict:
139
129
  """
140
130
  Async solving method
141
131
 
142
- Examples:
143
- >>> await CapyPuzzle(rucaptcha_key="aa9011f31111181111168611f1151122",
144
- ... captchakey="PUZZLE_Cme4hZLjuZRMYC3uh14C52D3uNms5w",
145
- ... pageurl="https://www.capy.me/account/register/",
146
- ... method=CapyPuzzleEnm.CAPY.value,
147
- ... api_server="https://jp.api.capy.me/",
148
- ... version="puzzle",
149
- ... ).aio_captcha_handler()
150
- {
151
- "captchaSolve": {
152
- "captchakey": "PUZZLE_C...w",
153
- "challengekey": "Uf....It",
154
- "answer": "26x...x9mx"
155
- },
156
- "taskId": 73052314114,
157
- "error": False,
158
- "errorBody": None
159
- }
160
-
161
- >>> await CapyPuzzle(rucaptcha_key="aa9011f31111181111168611f1151122",
162
- ... captchakey="PUZZLE_Cme4hZLjuZRMYC3uh14C52D3uNms5w",
163
- ... pageurl="https://www.capy.me/account/register/",
164
- ... method=CapyPuzzleEnm.CAPY.value,
165
- ... api_server="https://jp.api.capy.me/",
166
- ... version="avatar",
167
- ... ).aio_captcha_handler()
168
- {
169
- "captchaSolve": {
170
- "captchakey": "AVATART_C...w",
171
- "challengekey": "Uf....It",
172
- "answer": "26x...x9mx"
173
- },
174
- "taskId": 73052314114,
175
- "error": False,
176
- "errorBody": None
177
- }
178
-
179
132
  Returns:
180
133
  Dict with full server response
181
134