anti_captcha 2.3.0 → 2.5.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 714b5c0e2058c2056e0b0a0fcdf41c0c07147f29b690bbf49132cc7ffbca976e
4
- data.tar.gz: 3c7942ec7d1a4a747a53fa690be368466e84ce0e9baefe9877a6fb33a4d034bb
3
+ metadata.gz: 7911a78f0b2ccdcb075555ea6ea96aa2abc6914311b792a4b2579ec1a3bc8901
4
+ data.tar.gz: f2e2df9d4ba1042fed67fed6d670dd6c22fc097f0856fa61e1da17a74483043c
5
5
  SHA512:
6
- metadata.gz: db68e12ba53274a19e85a0babc1236a640b59c844b5e87781afdda0f3648e98fb3c64e37047f21a4a7443e5a6d5533347b5d9aad9de172651d782568b22abd52
7
- data.tar.gz: 8001df4b7668af35346bc00fcde615f369b5ae38b87b31f59704ff60c68028d4113c553b7c90258801cf3c7a3dfd358b6fc5c1f220d66fada7f1f9c31374f529
6
+ metadata.gz: f1915d353fe91b85276cb5ace41c09b3762b8313c2903ab064f2f9fdb6572b151bfd2357f6a80f6883e4922773aeb096d3cca57c2939b309f093ef4f844cf181
7
+ data.tar.gz: cf6cdc10ac27031ccd362d8fb15da2af3d4e77cc849a4ab905854c831977b20c89a38fd47cad502f778d6b359493a45d4add2d0f5512f1984b0dcda23822e3a7
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
- Developed by [Infosimples](https://infosimples.com).
2
-
3
1
  # AntiCaptcha
4
2
 
5
- AntiCaptcha is a Ruby API for Anti-Captcha - [Anti-Captcha.com](http://getcaptchasolution.com/ipuz16klxh).
3
+ AntiCaptcha is a Ruby API for Anti-Captcha - [Anti-Captcha.com](http://getcaptchasolution.com/ipuz16klxh)
6
4
 
7
5
  ## Installation
8
6
 
@@ -14,215 +12,322 @@ gem 'anti_captcha'
14
12
 
15
13
  And then execute:
16
14
 
17
- $ bundle
15
+ ```bash
16
+ $ bundle
17
+ ````
18
18
 
19
19
  Or install it yourself as:
20
20
 
21
- $ gem install anti_captcha
21
+ ```bash
22
+ $ gem install anti_captcha
23
+ ````
22
24
 
23
25
  ## Usage
24
26
 
25
- 1. **Create a client**
26
-
27
- ```ruby
28
- # Create a client
29
- client = AntiCaptcha.new('my_key')
30
- ```
31
-
32
- 2. **Solve Image CAPTCHA**
33
-
34
- There are two methods available:
27
+ ### 1. Create a client
35
28
 
36
- - `decode_image`: solves image CAPTCHAs. It doesn't raise exceptions.
37
- - `decode_image!`: solves image CAPTCHAs. It may raise an `AntiCaptcha::Error` if something goes wrong.
38
-
39
- If the solution is not available, an empty solution object will be returned.
40
-
41
- ```ruby
42
- solution = client.decode_image!(path: 'path/to/my/captcha/file')
43
- solution.text # CAPTCHA solution.
44
- solution.url # Image URL.
45
- solution.task_result.task_id # The ID of the task.
46
- ```
47
-
48
- You can also specify *file*, *body* and *body64* when decoding an image.
29
+ ```ruby
30
+ client = AntiCaptcha.new('my_key')
31
+ ```
49
32
 
50
- ```ruby
51
- client.decode_image!(file: File.open('path/to/my/captcha/file', 'rb'))
33
+ ### 2. Solve a CAPTCHA
52
34
 
53
- client.decode_image!(body: File.open('path/to/my/captcha/file', 'rb').read)
35
+ There are two types of methods available: `decode_*` and `decode_*!`:
54
36
 
55
- client.decode_image!(body64: Base64.encode64(File.open('path/to/my/captcha/file', 'rb').read))
56
- ```
37
+ - `decode_*` does not raise exceptions.
38
+ - `decode_*!` may raise a `AntiCaptcha::Error` if something goes wrong.
57
39
 
58
- > Internally, the gem will always convert the image to body64 (binary base64 encoded).
40
+ If the solution is not available, an empty solution object will be returned.
59
41
 
60
- 3. **Report incorrectly solved image CAPTCHA for refund**
42
+ ```ruby
43
+ solution = client.decode_image!(path: 'path/to/my/captcha/file')
44
+ solution.text # CAPTCHA solution
45
+ solution.url # Image URL
46
+ solution.task_result.task_id # The task ID
47
+ ```
61
48
 
62
- It is only possible to report incorrectly solved image CAPTCHAs.
49
+ #### Image CAPTCHA
63
50
 
64
- ```ruby
65
- client.report_incorrect_image_catpcha!(task_id)
66
- ```
51
+ You can specify `file`, `body` or `body64` when decoding an image.
67
52
 
68
- 4. **Get your account balance**
53
+ ```ruby
54
+ client.decode_image!(file: File.open('path/to/my/captcha/file', 'rb'))
55
+ client.decode_image!(body: File.open('path/to/my/captcha/file', 'rb').read)
56
+ client.decode_image!(body64: Base64.encode64(File.open('path/to/my/captcha/file', 'rb').read))
57
+ ```
69
58
 
70
- ```ruby
71
- client.get_balance!
72
- ```
59
+ #### reCAPTCHA v2
73
60
 
74
- 5. **Get current stats of a queue.**
61
+ ```ruby
62
+ solution = client.decode_recaptcha_v2!(
63
+ website_key: 'xyz',
64
+ website_url: 'http://example.com/example=1',
65
+ # proxy_type: 'http', # OPTIONAL
66
+ # proxy_address: '127.0.0.1', # OPTIONAL
67
+ # proxy_port: '8080', # OPTIONAL
68
+ # proxy_login: 'proxyLoginHere', # OPTIONAL
69
+ # proxy_password: 'proxyPasswordHere', # OPTIONAL
70
+ # user_agent: 'MODERN_USER_AGENT_HERE', # OPTIONAL
71
+ )
72
+
73
+ solution.g_recaptcha_response
74
+ "03AOPBWq_RPO2vLzyk0h8gH0cA2X4v3tpYCPZR6Y4yxKy1s3Eo7CHZRQntxrd..."
75
+ ```
75
76
 
76
- Queue IDs:
77
- - `1` Standart ImageToText, English language.
78
- - `2` Standart ImageToText, Russian language.
79
- - `5` Recaptcha NoCaptcha tasks.
80
- - `6` Recaptcha Proxyless task.
81
- - `7` Funcaptcha task.
82
- - `10` Funcaptcha Proxyless task.
83
- - `18` Recaptcha V3 s0.3
84
- - `19` Recaptcha V3 s0.7
85
- - `20` Recaptcha V3 s0.9
86
- - `21` hCaptcha Proxy-On
87
- - `22` hCaptcha Proxyless
77
+ *Parameters:*
88
78
 
89
- ```ruby
90
- client.get_queue_stats!(queue_id)
91
- ```
79
+ - `website_key`: the Google website key for the reCAPTCHA.
80
+ - `website_url`: the URL of the page with the reCAPTCHA challenge.
81
+ - `proxy_type`: optional parameter. Proxy connection protocol.
82
+ - `proxy_address`: optional parameter. The proxy address.
83
+ - `proxy_port`: optional parameter. The proxy port.
84
+ - `proxy_login`: optional parameter. The proxy login.
85
+ - `proxy_password`: optional parameter. The proxy password.
86
+ - `user_agent`: optional parameter. The user agent.
92
87
 
93
- 6. **Clickable CAPTCHAs (e.g. "No CAPTCHA reCAPTCHA")**
88
+ #### reCAPTCHA v3
94
89
 
95
- This method allows you to solve CAPTCHAs similar to
96
- [reCAPTCHA v2](https://support.google.com/recaptcha/?hl=en#6262736).
90
+ ```ruby
91
+ solution = client.decode_recaptcha_v3!(
92
+ website_key: 'xyz',
93
+ website_url: 'http://example.com/example=1',
94
+ page_action: 'myverify',
95
+ min_score: 0.3, # OPTIONAL
96
+ # is_enterprise: false, # OPTIONAL
97
+ )
98
+
99
+ solution.g_recaptcha_response
100
+ "03AOPBWq_RPO2vLzyk0h8gH0cA2X4v3tpYCPZR6Y4yxKy1s3Eo7CHZRQntxrd..."
101
+ ```
97
102
 
98
- There are two methods available:
103
+ *Parameters:*
99
104
 
100
- - `decode_nocaptcha`: solves NoCaptcha CAPTCHAs. It doesn't raise exceptions.
101
- - `decode_nocaptcha!`: solves NoCaptcha CAPTCHAs. It may raise an `AntiCaptcha::Error` if something goes wrong.
105
+ - `website_key`: the Google website key for the reCAPTCHA.
106
+ - `website_url`: the URL of the page with the reCAPTCHA challenge.
107
+ - `action`: the action name used by the CAPTCHA.
108
+ - `min_score`: optional parameter. The minimal score needed for the CAPTCHA resolution. Defaults to `0.3`.
109
+ - `is_enterprise`: optional parameter. Set to `true` if you are solving a reCAPTCHA v3 Enterprise. Defaults to `false`.
102
110
 
103
- **Send the `website_key` and `website_url` parameters**
111
+ > About the `action` parameter: in order to find out what this is, you need to inspect the JavaScript
112
+ > code of the website looking for a call to the `grecaptcha.execute` function.
113
+ >
114
+ > ```javascript
115
+ > // Example
116
+ > grecaptcha.execute('6Lc2fhwTAAAAAGatXTzFYfvlQMI2T7B6ji8UVV_f', { action: "examples/v3scores" })
117
+ > ````
104
118
 
105
- This method requires no browser emulation. You can send two parameters that
106
- identify the website in which the CAPTCHA is found.
119
+ > About the `min_score` parameter: it's strongly recommended to use a minimum score of `0.3` as higher
120
+ > scores are rare.
107
121
 
108
- ```ruby
109
- options = {
110
- website_key: 'xyz',
111
- website_url: 'http://example.com/example=1'
112
- }
122
+ #### hCaptcha
113
123
 
114
- solution = client.decode_nocaptcha!(options)
115
- solution.g_recaptcha_response # Solution of the captcha
116
- ```
124
+ ```ruby
125
+ solution = client.decode_h_captcha!(
126
+ website_key: 'xyz',
127
+ website_url: 'http://example.com/example=1',
128
+ # proxy_type: 'http', # OPTIONAL
129
+ # proxy_address: '127.0.0.1', # OPTIONAL
130
+ # proxy_port: '8080', # OPTIONAL
131
+ # proxy_login: 'proxyLoginHere', # OPTIONAL
132
+ # proxy_password: 'proxyPasswordHere', # OPTIONAL
133
+ # user_agent: 'MODERN_USER_AGENT_HERE', # OPTIONAL
134
+ )
135
+
136
+ solution.token
137
+ "P0_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXNza2V5IjoiNnpWV..."
138
+
139
+ # Or
140
+
141
+ solution.g_recaptcha_response # Deprecated
142
+ "P0_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXNza2V5IjoiNnpWV..."
143
+ ```
117
144
 
118
- The solution (`solution.g_recaptcha_response`) will be a code that validates
119
- the form, like the following:
145
+ *Parameters:*
120
146
 
121
- ```ruby
122
- "1JJHJ_VuuHAqJKxcaasbTsqw-L1Sm4gD57PTeaEr9-MaETG1vfu2H5zlcwkjsRoZoHxx6V9yUDw8Ig-hYD8kakmSnnjNQd50w_Y_tI3aDLp-s_7ZmhH6pcaoWWsid5hdtMXyvrP9DscDuCLBf7etLle8caPWSaYCpAq9DOTtj5NpSg6-OeCJdGdkjsakFUMeGeqmje87wSajcjmdjl_w4XZBY2zy8fUH6XoAGZ6AeCTulIljBQDObQynKDd-rutPvKNxZasDk-LbhTfw508g1lu9io6jnvm3kbAdnkfZ0x0PkGiUMHU7hnuoW6bXo2Yn_Zt5tDWL7N7wFtY6B0k7cTy73f8er508zReOuoyz2NqL8smDCmcJu05ajkPGt20qzpURMwHaw"
123
- ```
147
+ - `website_key`: the site key for the hCatpcha.
148
+ - `website_url`: the URL of the page with the hCaptcha challenge.
149
+ - `proxy_type`: optional parameter. Proxy connection protocol.
150
+ - `proxy_address`: optional parameter. The proxy address.
151
+ - `proxy_port`: optional parameter. The proxy port.
152
+ - `proxy_login`: optional parameter. The proxy login.
153
+ - `proxy_password`: optional parameter. The proxy password.
154
+ - `user_agent`: optional parameter. The user agent.
124
155
 
125
- 7. **FunCaptcha**
156
+ #### FunCaptcha
126
157
 
127
- This method allows you to solve FunCaptcha.
158
+ ```ruby
159
+ solution = client.decode_fun_captcha!(
160
+ website_public_key: 'xyz',
161
+ website_url: 'http://example.com/example=1',
162
+ # proxy_type: 'http', # OPTIONAL
163
+ # proxy_address: '127.0.0.1', # OPTIONAL
164
+ # proxy_port: '8080', # OPTIONAL
165
+ # proxy_login: 'proxyLoginHere', # OPTIONAL
166
+ # proxy_password: 'proxyPasswordHere', # OPTIONAL
167
+ # user_agent: 'MODERN_USER_AGENT_HERE', # OPTIONAL
168
+ )
169
+
170
+ solution.token
171
+ "380633616d817f2b8.2351188603|r=ap-southeast-2|met..."
172
+ ```
128
173
 
129
- **Send the `website_public_key` and `website_url` parameters**
174
+ *Parameters:*
130
175
 
131
- This method requires no browser emulation. You can send two parameters that
132
- identify the website in which the CAPTCHA is found.
176
+ - `website_key`: the site key for the hCatpcha.
177
+ - `website_url`: the URL of the page with the hCaptcha challenge.
178
+ - `proxy_type`: optional parameter. Proxy connection protocol.
179
+ - `proxy_address`: optional parameter. The proxy address.
180
+ - `proxy_port`: optional parameter. The proxy port.
181
+ - `proxy_login`: optional parameter. The proxy login.
182
+ - `proxy_password`: optional parameter. The proxy password.
183
+ - `user_agent`: optional parameter. The user agent.
133
184
 
134
- ```ruby
135
- options = {
136
- website_public_key: 'xyz',
137
- website_url: 'http://example.com/example=1',
138
- language_pool: '...'
139
- }
185
+ #### Geetest
140
186
 
141
- solution = client.decode_fun_captcha(options)
142
- solution.token # Solution of the captcha
143
- ```
187
+ ```ruby
188
+ solution = client.decode_geetest!(
189
+ website_url: 'http://mywebsite.com/geetest/test.php',
190
+ gt: '874703612e5cac182812a00e273aad0d',
191
+ challenge: 'a559b82bca2c500101a1c8a4f4204742',
192
+ # proxy_type: 'http', # OPTIONAL
193
+ # proxy_address: '127.0.0.1', # OPTIONAL
194
+ # proxy_port: '8080', # OPTIONAL
195
+ # proxy_login: 'proxyLoginHere', # OPTIONAL
196
+ # proxy_password: 'proxyPasswordHere', # OPTIONAL
197
+ # user_agent: 'MODERN_USER_AGENT_HERE', # OPTIONAL
198
+ )
144
199
 
145
- 8. **reCAPTCHA V3**
200
+ solution.v3['challenge']
201
+ "3c1c5153aa48011e92883aed820069f3hj"
146
202
 
147
- This method allows you to solve [reCAPTCHA v3](https://developers.google.com/recaptcha/docs/v3).
203
+ solution.v3['validate']
204
+ "47ad5a0a6eb98a95b2bcd9e9eecc8272"
148
205
 
149
- There are two methods available:
206
+ solution.v3['seccode']
207
+ "83fa4f2d23005fc91c3a015a1613f803|jordan"
150
208
 
151
- - `decode_recaptcha_v3`: solves reCAPTCHA v3. It doesn't raise exceptions.
152
- - `decode_recaptcha_v3!`: solves reCAPTCHA v3. It may raise an `AntiCaptcha::Error` if something goes wrong.
209
+ # Or
153
210
 
154
- **Send the `website_key`, `website_url`, `min_score` and `page_action` parameters**
211
+ solution.v4['captcha_id']
212
+ "fcd636b4514bf7ac4143922550b3008b"
155
213
 
156
- This method requires no browser emulation. You can send four parameters that
157
- identify the website in which the CAPTCHA is found and the minimum score (0.3, 0.5 or 0.7) you
158
- desire.
214
+ solution.v4['lot_number']
215
+ "354ab6dd4e594fdc903074c4d8d37b24"
159
216
 
160
- **It's strongly recommended to use a minimum score of 0.3 as higher scores are extremely rare.**
217
+ solution.v4['pass_token']
218
+ "b645946a654e60218c7922b74b3b5ee8e8717e8fd3cd51..."
161
219
 
162
- ```ruby
163
- options = {
164
- website_key: 'xyz',
165
- website_url: 'http://example.com/example=1',
166
- min_score: 0.3,
167
- page_action: 'myverify'
168
- }
220
+ solution.v4['gen_time']
221
+ "1649921519"
169
222
 
170
- solution = client.decode_recaptcha_v3!(options)
171
- solution.g_recaptcha_response # Solution of the captcha
172
- ```
223
+ solution.v4['captcha_output']
224
+ "cFPIALDXSop8Ri2mPABbRWzNBs86N8D4vNUTuVa7wN7E..."
225
+ ```
226
+ *Parameters:*
227
+
228
+ - `website_url`: URL of a target web page. It can be located anywhere on the web site, even in a member's area.
229
+ - `gt`: the domain's public key.
230
+ - `challenge`: changing token key. Make sure you grab a fresh one for each captcha.
231
+ - `geetest_api_server_subdomain`: optional parameter. API subdomain. May be required for some implementations.
232
+ - `geetest_get_lib`: optional parameter. Required for some implementations. Send the JSON encoded into a string. The value can be traced in the browser's developer tools. Put a breakpoint before calling the "initGeetest" function.
233
+ - `version`: optional parameter. Version number. Default version is 3. Supported versions: 3 and 4.
234
+ - `init_parameters`: optional parameter. Additional initialization parameters for version 4.
235
+ - `proxy_type`: optional parameter. Proxy connection protocol.
236
+ - `proxy_address`: optional parameter. The proxy address.
237
+ - `proxy_port`: optional parameter. The proxy port.
238
+ - `proxy_login`: optional parameter. The proxy login.
239
+ - `proxy_password`: optional parameter. The proxy password.
240
+ - `user_agent`: optional parameter. The user agent.
241
+
242
+ #### Cloudflare Turnstile
173
243
 
174
- The solution (`solution.g_recaptcha_response`) will be a code that validates
175
- the form, like the following:
244
+ ```ruby
245
+ solution = client.decode_turnstile!(
246
+ website_key: 'xyz',
247
+ website_url: 'http://example.com/example=1',
248
+ # proxy_type: 'http', # OPTIONAL
249
+ # proxy_address: '127.0.0.1', # OPTIONAL
250
+ # proxy_port: '8080', # OPTIONAL
251
+ # proxy_login: 'proxyLoginHere', # OPTIONAL
252
+ # proxy_password: 'proxyPasswordHere', # OPTIONAL
253
+ )
254
+
255
+ solution.token
256
+ "0.vtJqmZnvobaUzK2i2PyKaSqHELYtBZfRoPwMvLMdA81WL_9G0vCO3y2VQVIeVplG0mxYF7uX......."
257
+ ```
176
258
 
177
- ```ruby
178
- "1JJHJ_VuuHAqJKxcaasbTsqw-L1Sm4gD57PTeaEr9-MaETG1vfu2H5zlcwkjsRoZoHxx6V9yUDw8Ig-hYD8kakmSnnjNQd50w_Y_tI3aDLp-s_7ZmhH6pcaoWWsid5hdtMXyvrP9DscDuCLBf7etLle8caPWSaYCpAq9DOTtj5NpSg6-OeCJdGdkjsakFUMeGeqmje87wSajcjmdjl_w4XZBY2zy8fUH6XoAGZ6AeCTulIljBQDObQynKDd-rutPvKNxZasDk-LbhTfw508g1lu9io6jnvm3kbAdnkfZ0x0PkGiUMHU7hnuoW6bXo2Yn_Zt5tDWL7N7wFtY6B0k7cTy73f8er508zReOuoyz2NqL8smDCmcJu05ajkPGt20qzpURMwHaw"
179
- ```
259
+ *Parameters:*
180
260
 
181
- 9. **hCaptcha**
261
+ - `website_key`: the site key for the Turnstile.
262
+ - `website_url`: the URL of the page with the Turnstile challenge.
263
+ - `proxy_type`: optional parameter. Proxy connection protocol.
264
+ - `proxy_address`: optional parameter. The proxy address.
265
+ - `proxy_port`: optional parameter. The proxy port.
266
+ - `proxy_login`: optional parameter. The proxy login.
267
+ - `proxy_password`: optional parameter. The proxy password.
182
268
 
183
- This method allows you to solve hCaptcha.
269
+ ### 3. Report an incorrectly solved image CAPTCHA for a refund
184
270
 
185
- There are two methods available:
271
+ It is only possible to report incorrectly solved image CAPTCHAs.
186
272
 
187
- - `decode_h_captcha`: solves hCaptcha CAPTCHAs. It doesn't raise exceptions.
188
- - `decode_h_captcha!`: solves hCaptcha CAPTCHAs. It may raise an error if something goes wrong.
273
+ ```ruby
274
+ client.report_incorrect_image_catpcha!(task_id)
275
+ ```
189
276
 
190
- **Send the `website_key` and `website_url` parameters**
277
+ ### 4. Get your account balance
191
278
 
192
- This method requires no browser emulation. You can send two parameters that
193
- identify the website in which the CAPTCHA is found.
279
+ ```ruby
280
+ client.get_balance!
281
+ ```
194
282
 
195
- ```ruby
196
- options = {
197
- website_key: 'xyz',
198
- website_url: 'http://example.com/example=1'
199
- }
283
+ ### 5. Get current stats of a queue.
284
+
285
+ Queue IDs:
286
+
287
+ - `1` Standart ImageToText, English language
288
+ - `2` Standart ImageToText, Russian language
289
+ - `5` Recaptcha NoCaptcha tasks
290
+ - `6` Recaptcha Proxyless task
291
+ - `7` Funcaptcha task
292
+ - `10` Funcaptcha Proxyless task
293
+ - `12` GeeTest with proxy
294
+ - `13` GeeTest without proxy
295
+ - `18` Recaptcha V3 s0.3
296
+ - `19` Recaptcha V3 s0.7
297
+ - `20` Recaptcha V3 s0.9
298
+ - `21` hCaptcha with proxy
299
+ - `22` hCaptcha without proxy
300
+ - `23` Recaptcha Enterprise V2 with proxy
301
+ - `24` Recaptcha Enterprise V2 without proxy
302
+ - `25` AntiGateTask
303
+ - `26` Turnstile with proxy
304
+ - `27` Turnstile without proxy
200
305
 
201
- solution = client.decode_h_captcha!(options)
202
- solution.g_recaptcha_response # Solution of the captcha
203
- ```
306
+ ```ruby
307
+ client.get_queue_stats!(queue_id)
308
+ ```
204
309
 
205
310
  ## Notes
206
311
 
207
- #### Ruby dependencies
312
+ ### Ruby dependencies
208
313
 
209
314
  AntiCaptcha doesn't require specific dependencies. That saves you memory and
210
315
  avoid conflicts with other gems.
211
316
 
212
- #### Input image format
317
+ ### Input image format
213
318
 
214
- Any format you use in the decode method (file, path, body, body64) will always
215
- be converted to a body64, which is a binary base64 encoded string. So, if you
216
- already have this format available on your side, there's no need to do
217
- convertions before calling the API.
319
+ Any format you use in the `decode_image!` method (`file`, `path`, `body` or `body64`)
320
+ will always be converted to a `body64`, which is a base64-encoded binary string.
321
+ So, if you already have this format on your end, there is no need for convertions
322
+ before calling the API.
218
323
 
219
324
  > Our recomendation is to never convert your image format, unless needed. Let
220
325
  > the gem convert internally. It may save you resources (CPU, memory and IO).
221
326
 
222
- #### Versioning
327
+ ### Versioning
223
328
 
224
329
  AntiCaptcha gem uses [Semantic Versioning](http://semver.org/).
225
330
 
226
331
  # License
227
332
 
228
- MIT License. Copyright (C) 2011-2015 Infosimples. https://infosimples.com/
333
+ MIT License. Copyright (C) 2011-2022 Infosimples. https://infosimples.com/
data/anti_captcha.gemspec CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
22
  spec.require_paths = ["lib"]
23
23
 
24
- spec.add_development_dependency "bundler", "~> 1.15"
24
+ spec.add_development_dependency "bundler", ">= 2.2.33"
25
25
  spec.add_development_dependency "rake", "~> 12.3.3"
26
26
  spec.add_development_dependency "rspec", "~> 3.0"
27
27
  end
@@ -4,8 +4,7 @@ module AntiCaptcha
4
4
  #
5
5
  class Client
6
6
  BASE_URL = 'https://api.anti-captcha.com/:action'
7
- PROXYABLE_TASKS = %w(NoCaptchaTask FunCaptchaTask HCaptchaTask)
8
- SUPPORTED_TASKS = %w(ImageToTextTask NoCaptchaTask FunCaptchaTask HCaptchaTask)
7
+ PROXYABLE_TASKS = %w(RecaptchaV2Task FunCaptchaTask HCaptchaTask GeeTestTask TurnstileTask)
9
8
 
10
9
  attr_accessor :client_key, :timeout, :polling
11
10
 
@@ -14,7 +13,7 @@ module AntiCaptcha
14
13
  #
15
14
  # @param [String] client_key The key of the Anti Captcha account.
16
15
  # @param [Hash] options Options hash.
17
- # @option options [Integer] :timeout (60) Seconds before giving up of a
16
+ # @option options [Integer] :timeout (120) Seconds before giving up of a
18
17
  # captcha being solved.
19
18
  # @option options [Integer] :polling (5) Seconds before checking answer
20
19
  # again.
@@ -23,7 +22,7 @@ module AntiCaptcha
23
22
  #
24
23
  def initialize(client_key, options = {})
25
24
  self.client_key = client_key
26
- self.timeout = options[:timeout] || 60
25
+ self.timeout = options[:timeout] || 120
27
26
  self.polling = options[:polling] || 5
28
27
  end
29
28
 
@@ -75,18 +74,19 @@ module AntiCaptcha
75
74
  end
76
75
 
77
76
  #
78
- # Decodes a NoCaptcha CAPTCHA.
77
+ # Decodes a reCAPTCHA v2 (NoCaptcha).
79
78
  #
80
- # @see `AntiCaptcha::Client#decode_nocaptcha!`
79
+ # @see `AntiCaptcha::Client#decode_recaptcha_v2!`
81
80
  #
82
- def decode_nocaptcha(options, proxy = nil)
83
- decode_nocaptcha!(options, proxy)
81
+ def decode_recaptcha_v2(options, proxy = nil)
82
+ decode_recaptcha_v2!(options, proxy)
84
83
  rescue
85
- AntiCaptcha::NoCaptchaSolution.new
84
+ AntiCaptcha::RecaptchaV2Solution.new
86
85
  end
86
+ alias :decode_nocaptcha :decode_recaptcha_v2
87
87
 
88
88
  #
89
- # Decodes a NoCaptcha CAPTCHA.
89
+ # Decodes a reCAPTCHA v2 (NoCaptcha).
90
90
  #
91
91
  # @param [Hash] options Options hash.
92
92
  # @option options [String] :website_url
@@ -103,16 +103,17 @@ module AntiCaptcha
103
103
  # @option proxy [String] :proxy_password
104
104
  # @option proxy [String] :user_agent
105
105
  #
106
- # @return [AntiCaptcha::NoCaptchaSolution] The solution of the NoCaptcha.
106
+ # @return [AntiCaptcha::RecaptchaV2Solution] The solution of the reCAPTCHA v2.
107
107
  #
108
- def decode_nocaptcha!(options, proxy = nil)
109
- task = create_task!('NoCaptchaTask', options, proxy)
108
+ def decode_recaptcha_v2!(options, proxy = nil)
109
+ task = create_task!('RecaptchaV2Task', options, proxy)
110
110
  task_result = get_task_result!(task['taskId'])
111
- AntiCaptcha::NoCaptchaSolution.new(task_result)
111
+ AntiCaptcha::RecaptchaV2Solution.new(task_result)
112
112
  end
113
+ alias :decode_nocaptcha! :decode_recaptcha_v2!
113
114
 
114
115
  #
115
- # Decodes a reCAPTCHA V3.
116
+ # Decodes a reCAPTCHA v3.
116
117
  #
117
118
  # @see `AntiCaptcha::Client#decode_recaptcha_v3!`
118
119
  #
@@ -123,17 +124,18 @@ module AntiCaptcha
123
124
  end
124
125
 
125
126
  #
126
- # Decodes a reCAPTCHA V3. Proxy is not supported.
127
+ # Decodes a reCAPTCHA v3. Proxy is not supported.
127
128
  #
128
129
  # @param [Hash] options Options hash.
129
130
  # @option options [String] :website_url
130
131
  # @option options [String] :website_key
131
132
  # @option options [String] :min_score (one of 0.3, 0,5 or 0.7)
132
133
  # @option options [String] :page_action
134
+ # @option options [String] :is_enterprise
133
135
  # @option options [String] :language_pool
134
136
  #
135
137
  # @return [AntiCaptcha::RecaptchaV3Solution] The solution of
136
- # the reCAPTCHA V3.
138
+ # the reCAPTCHA v3.
137
139
  #
138
140
  def decode_recaptcha_v3!(options)
139
141
  task = create_task!('RecaptchaV3TaskProxyless', options)
@@ -203,6 +205,81 @@ module AntiCaptcha
203
205
  AntiCaptcha::HCaptchaSolution.new(task_result)
204
206
  end
205
207
 
208
+ #
209
+ # Decodes a Geetest CAPTCHA.
210
+ #
211
+ # @see `AntiCaptcha::Client#decode_geetest!`
212
+ #
213
+ def decode_geetest(options, proxy = nil)
214
+ decode_geetest!(options, proxy)
215
+ rescue
216
+ AntiCaptcha::GeetestSolution.new
217
+ end
218
+
219
+ #
220
+ # Decodes a Geetest CAPTCHA.
221
+ #
222
+ # @param [Hash] options Options hash.
223
+ # @option options [String] :website_url
224
+ # @option options [String] :gt
225
+ # @option options [String] :challenge
226
+ # @option options [String] :geetest_api_server_subdomain
227
+ # @option options [String] :geetest_get_lib
228
+ # @option options [String] :version
229
+ # @option options [String] :init_parameters
230
+ #
231
+ # @param [Hash] proxy Not mandatory. A hash with configs of the proxy that
232
+ # has to be used. Defaults to `nil`.
233
+ # @option proxy [String] :proxy_type
234
+ # @option proxy [String] :proxy_address
235
+ # @option proxy [String] :proxy_port
236
+ # @option proxy [String] :proxy_login
237
+ # @option proxy [String] :proxy_login
238
+ # @option proxy [String] :proxy_password
239
+ # @option proxy [String] :user_agent
240
+ #
241
+ # @return [AntiCaptcha::GeetestSolution] The solution of the Geetest.
242
+ #
243
+ def decode_geetest!(options, proxy = nil)
244
+ task = create_task!('GeeTestTask', options, proxy)
245
+ task_result = get_task_result!(task['taskId'])
246
+ AntiCaptcha::GeetestSolution.new(task_result)
247
+ end
248
+
249
+ #
250
+ # Decodes a Turnstile CAPTCHA.
251
+ #
252
+ # @see `AntiCaptcha::Client#decode_turnstile!`
253
+ #
254
+ def decode_turnstile(options, proxy = nil)
255
+ decode_turnstile!(options, proxy)
256
+ rescue
257
+ AntiCaptcha::TurnstileSolution.new
258
+ end
259
+
260
+ #
261
+ # Decodes a Turnstile CAPTCHA.
262
+ #
263
+ # @param [Hash] options Options hash.
264
+ # @option options [String] :website_url
265
+ # @option options [String] :website_key
266
+ #
267
+ # @param [Hash] proxy Not mandatory. A hash with configs of the proxy that
268
+ # has to be used. Defaults to `nil`.
269
+ # @option proxy [String] :proxy_type
270
+ # @option proxy [String] :proxy_address
271
+ # @option proxy [String] :proxy_port
272
+ # @option proxy [String] :proxy_login
273
+ # @option proxy [String] :proxy_password
274
+ #
275
+ # @return [AntiCaptcha::TurnstileSolution] The solution of the Turnstile.
276
+ #
277
+ def decode_turnstile!(options, proxy = nil)
278
+ task = create_task!('TurnstileTask', options, proxy)
279
+ task_result = get_task_result!(task['taskId'])
280
+ AntiCaptcha::TurnstileSolution.new(task_result)
281
+ end
282
+
206
283
  # Creates a task for solving the selected CAPTCHA type.
207
284
  #
208
285
  # @param [String] type The type of the CAPTCHA.
@@ -262,9 +339,9 @@ module AntiCaptcha
262
339
  comment: options[:comment],
263
340
  }
264
341
 
265
- when 'NoCaptchaTask'
342
+ when 'RecaptchaV2Task'
266
343
  args[:task] = {
267
- type: 'NoCaptchaTask',
344
+ type: 'RecaptchaV2Task',
268
345
  websiteURL: options[:website_url],
269
346
  websiteKey: options[:website_key],
270
347
  }
@@ -272,11 +349,13 @@ module AntiCaptcha
272
349
  when 'RecaptchaV3TaskProxyless'
273
350
  args[:task] = {
274
351
  type: 'RecaptchaV3TaskProxyless',
275
- websiteURL: options[:website_url],
276
- websiteKey: options[:website_key],
277
- minScore: options[:min_score].to_f,
278
- pageAction: options[:page_action],
352
+ websiteURL: options[:website_url],
353
+ websiteKey: options[:website_key],
354
+ minScore: (options[:min_score] || 0.3).to_f,
355
+ pageAction: options[:page_action],
279
356
  }
357
+ args[:isEnterprise] = options[:is_enterprise] if [true, false].include?(options[:is_enterprise])
358
+
280
359
 
281
360
  when 'FunCaptchaTask'
282
361
  args[:task] = {
@@ -287,14 +366,32 @@ module AntiCaptcha
287
366
 
288
367
  when 'HCaptchaTask'
289
368
  args[:task] = {
290
- type: 'HCaptchaTask',
369
+ type: 'HCaptchaTask',
370
+ websiteURL: options[:website_url],
371
+ websiteKey: options[:website_key],
372
+ }
373
+
374
+ when 'GeeTestTask'
375
+ args[:task] = {
376
+ type: 'GeeTestTask',
377
+ websiteURL: options[:website_url],
378
+ gt: options[:gt],
379
+ challenge: options[:challenge],
380
+ }
381
+ args[:geetestApiServerSubdomain] = options[:geetest_api_server_subdomain] if !options[:geetest_api_server_subdomain].nil?
382
+ args[:geetestGetLib] = options[:geetest_get_lib] if !options[:geetest_get_lib].nil?
383
+ args[:version] = options[:version] if !options[:version].nil?
384
+ args[:initParameters] = options[:init_parameters] if !options[:init_parameters].nil?
385
+
386
+ when 'TurnstileTask'
387
+ args[:task] = {
388
+ type: 'TurnstileTask',
291
389
  websiteURL: options[:website_url],
292
390
  websiteKey: options[:website_key],
293
391
  }
294
392
 
295
393
  else
296
- message = "Invalid task type: '#{type}'. Allowed types: " +
297
- "#{SUPPORTED_TASKS.join(', ')}"
394
+ message = "Invalid task type: '#{type}'."
298
395
  raise AntiCaptcha::ArgumentError.new(message)
299
396
  end
300
397
 
@@ -365,6 +462,8 @@ module AntiCaptcha
365
462
  # 20 - Recaptcha V3 s0.9
366
463
  # 21 - hCaptcha Proxy-On
367
464
  # 22 - hCaptcha Proxyless
465
+ # 26 - Turnstile Proxy-On
466
+ # 27 - Turnstile Proxyless
368
467
  #
369
468
  # @return [Hash] Information about the queue.
370
469
  #
@@ -0,0 +1,30 @@
1
+ module AntiCaptcha
2
+ class GeetestSolution < AntiCaptcha::Solution
3
+ attr_accessor :v3, :v4
4
+
5
+ def initialize(task_result = nil)
6
+ super
7
+
8
+ if task_result
9
+ solution = task_result.api_result['solution']
10
+
11
+ if solution['pass_token']
12
+ @v4 = {
13
+ 'captcha_id' => solution['captcha_id'],
14
+ 'lot_number' => solution['lot_number'],
15
+ 'pass_token' => solution['pass_token'],
16
+ 'gen_time' => solution['gen_time'],
17
+ 'captcha_output' => solution['captcha_output'],
18
+ }
19
+
20
+ else
21
+ @v3 = {
22
+ 'challenge' => solution['challenge'],
23
+ 'validate' => solution['validate'],
24
+ 'seccode' => solution['seccode'],
25
+ }
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,12 +1,15 @@
1
1
  module AntiCaptcha
2
2
  class HCaptchaSolution < AntiCaptcha::Solution
3
- attr_accessor :g_recaptcha_response
3
+ attr_accessor :g_recaptcha_response # Deprecated
4
+ attr_accessor :token
5
+
4
6
 
5
7
  def initialize(task_result = nil)
6
8
  super
7
9
 
8
10
  if task_result
9
- @g_recaptcha_response = task_result.api_result['solution']['gRecaptchaResponse']
11
+ @token = task_result.api_result['solution']['gRecaptchaResponse']
12
+ @g_recaptcha_response = token
10
13
  end
11
14
  end
12
15
  end
@@ -1,5 +1,5 @@
1
1
  module AntiCaptcha
2
- class NoCaptchaSolution < AntiCaptcha::Solution
2
+ class RecaptchaV2Solution < AntiCaptcha::Solution
3
3
  attr_accessor :g_recaptcha_response, :g_recaptcha_response_md5
4
4
 
5
5
  def initialize(task_result = nil)
@@ -1,7 +1,7 @@
1
1
  module AntiCaptcha
2
2
  class TaskResult < AntiCaptcha::Model
3
3
  attr_accessor :task_id, :error_id, :error_code, :error_description, :status,
4
- :cost, :ip, :create_time, :end_time, :solve_count, :api_result
4
+ :cost, :ip, :create_time, :end_time, :solve_count, :api_result
5
5
 
6
6
  def initialize(api_result, task_id)
7
7
  @task_id = task_id
@@ -0,0 +1,13 @@
1
+ module AntiCaptcha
2
+ class TurnstileSolution < AntiCaptcha::Solution
3
+ attr_accessor :token
4
+
5
+ def initialize(task_result = nil)
6
+ super
7
+
8
+ if task_result
9
+ @token = task_result.api_result['solution']['token']
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,4 +1,4 @@
1
1
  module AntiCaptcha
2
- VERSION = "2.3.0"
2
+ VERSION = "2.5.0"
3
3
  USER_AGENT = "AntiCaptcha/Ruby v#{VERSION}"
4
4
  end
data/lib/anti_captcha.rb CHANGED
@@ -33,10 +33,12 @@ require 'anti_captcha/http'
33
33
  require 'anti_captcha/errors'
34
34
  require 'anti_captcha/models/solution'
35
35
  require 'anti_captcha/models/image_to_text_solution'
36
- require 'anti_captcha/models/no_captcha_solution'
36
+ require 'anti_captcha/models/recaptcha_v2_solution'
37
37
  require 'anti_captcha/models/recaptcha_v3_solution'
38
38
  require 'anti_captcha/models/fun_captcha_solution'
39
39
  require 'anti_captcha/models/h_captcha_solution'
40
+ require 'anti_captcha/models/geetest_solution'
41
+ require 'anti_captcha/models/turnstile_solution'
40
42
  require 'anti_captcha/models/task_result'
41
43
  require 'anti_captcha/client'
42
44
  require 'anti_captcha/version'
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: anti_captcha
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Infosimples
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-08-16 00:00:00.000000000 Z
11
+ date: 2024-08-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.15'
19
+ version: 2.2.33
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.15'
26
+ version: 2.2.33
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -75,12 +75,14 @@ files:
75
75
  - lib/anti_captcha/errors.rb
76
76
  - lib/anti_captcha/http.rb
77
77
  - lib/anti_captcha/models/fun_captcha_solution.rb
78
+ - lib/anti_captcha/models/geetest_solution.rb
78
79
  - lib/anti_captcha/models/h_captcha_solution.rb
79
80
  - lib/anti_captcha/models/image_to_text_solution.rb
80
- - lib/anti_captcha/models/no_captcha_solution.rb
81
+ - lib/anti_captcha/models/recaptcha_v2_solution.rb
81
82
  - lib/anti_captcha/models/recaptcha_v3_solution.rb
82
83
  - lib/anti_captcha/models/solution.rb
83
84
  - lib/anti_captcha/models/task_result.rb
85
+ - lib/anti_captcha/models/turnstile_solution.rb
84
86
  - lib/anti_captcha/version.rb
85
87
  homepage: https://github.com/infosimples/anti_captcha
86
88
  licenses:
@@ -101,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
101
103
  - !ruby/object:Gem::Version
102
104
  version: '0'
103
105
  requirements: []
104
- rubygems_version: 3.0.6
106
+ rubygems_version: 3.5.6
105
107
  signing_key:
106
108
  specification_version: 4
107
109
  summary: Ruby API for Anti Captcha (CAPTCHA Solver as a Service)