anti_captcha 2.2.2 → 2.4.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 +4 -4
- data/README.md +228 -119
- data/anti_captcha.gemspec +1 -1
- data/lib/anti_captcha/client.rb +131 -27
- data/lib/anti_captcha/models/geetest_solution.rb +30 -0
- data/lib/anti_captcha/models/h_captcha_solution.rb +16 -0
- data/lib/anti_captcha/models/{no_captcha_solution.rb → recaptcha_v2_solution.rb} +1 -1
- data/lib/anti_captcha/models/task_result.rb +1 -1
- data/lib/anti_captcha/version.rb +1 -1
- data/lib/anti_captcha.rb +3 -1
- metadata +13 -11
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c007c351a8655684c2f4680ead884429b8bea0ebd1fb33568119b15b477fcc76
|
|
4
|
+
data.tar.gz: 38267b78fb266cbb281a3d28db9cf32633398798a270bdc9e2bbd4f87cc2d84a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6bd0a5e3759806d4d88285d819a2d18738a47d560d2a4a25ab6497d1a7d12b3e07a34f0e7c2d1ac5755a1b7238a975fc45b49594019076f0fd53584dee67e085
|
|
7
|
+
data.tar.gz: 43a55d65f865c263b0fa732984a085b92ae5936530f8d6f6cc5a7e619e261629a3c4991907a85838b76968e73827270d3e580938c9adea23280a27a52e000ab4
|
data/README.md
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
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)
|
|
4
|
+
|
|
5
|
+
> We suggest you to also check the recommended CAPTCHA provider DeathByCaptcha.
|
|
6
|
+
> The gem for this provider is available at https://github.com/infosimples/deathbycaptcha.
|
|
6
7
|
|
|
7
8
|
## Installation
|
|
8
9
|
|
|
@@ -14,185 +15,293 @@ gem 'anti_captcha'
|
|
|
14
15
|
|
|
15
16
|
And then execute:
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
```bash
|
|
19
|
+
$ bundle
|
|
20
|
+
````
|
|
18
21
|
|
|
19
22
|
Or install it yourself as:
|
|
20
23
|
|
|
21
|
-
|
|
24
|
+
```bash
|
|
25
|
+
$ gem install anti_captcha
|
|
26
|
+
````
|
|
22
27
|
|
|
23
28
|
## Usage
|
|
24
29
|
|
|
25
|
-
1.
|
|
26
|
-
|
|
27
|
-
```ruby
|
|
28
|
-
# Create a client
|
|
29
|
-
client = AntiCaptcha.new('my_key')
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
2. **Solve Image CAPTCHA**
|
|
30
|
+
### 1. Create a client
|
|
33
31
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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.
|
|
32
|
+
```ruby
|
|
33
|
+
client = AntiCaptcha.new('my_key')
|
|
34
|
+
```
|
|
40
35
|
|
|
41
|
-
|
|
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
|
-
```
|
|
36
|
+
### 2. Solve a CAPTCHA
|
|
47
37
|
|
|
48
|
-
|
|
38
|
+
There are two types of methods available: `decode_*` and `decode_*!`:
|
|
49
39
|
|
|
50
|
-
|
|
51
|
-
|
|
40
|
+
- `decode_*` does not raise exceptions.
|
|
41
|
+
- `decode_*!` may raise a `AntiCaptcha::Error` if something goes wrong.
|
|
52
42
|
|
|
53
|
-
|
|
43
|
+
If the solution is not available, an empty solution object will be returned.
|
|
54
44
|
|
|
55
|
-
|
|
56
|
-
|
|
45
|
+
```ruby
|
|
46
|
+
solution = client.decode_image!(path: 'path/to/my/captcha/file')
|
|
47
|
+
solution.text # CAPTCHA solution
|
|
48
|
+
solution.url # Image URL
|
|
49
|
+
solution.task_result.task_id # The task ID
|
|
50
|
+
```
|
|
57
51
|
|
|
58
|
-
|
|
52
|
+
#### Image CAPTCHA
|
|
59
53
|
|
|
60
|
-
|
|
54
|
+
You can specify `file`, `body` or `body64` when decoding an image.
|
|
61
55
|
|
|
62
|
-
|
|
56
|
+
```ruby
|
|
57
|
+
client.decode_image!(file: File.open('path/to/my/captcha/file', 'rb'))
|
|
58
|
+
client.decode_image!(body: File.open('path/to/my/captcha/file', 'rb').read)
|
|
59
|
+
client.decode_image!(body64: Base64.encode64(File.open('path/to/my/captcha/file', 'rb').read))
|
|
60
|
+
```
|
|
63
61
|
|
|
64
|
-
|
|
65
|
-
client.report_incorrect_image_catpcha!(task_id)
|
|
66
|
-
```
|
|
62
|
+
#### reCAPTCHA v2
|
|
67
63
|
|
|
68
|
-
|
|
64
|
+
```ruby
|
|
65
|
+
solution = client.decode_recaptcha_v2!(
|
|
66
|
+
website_key: 'xyz',
|
|
67
|
+
website_url: 'http://example.com/example=1',
|
|
68
|
+
# proxy_type: 'http', # OPTIONAL
|
|
69
|
+
# proxy_address: '127.0.0.1', # OPTIONAL
|
|
70
|
+
# proxy_port: '8080', # OPTIONAL
|
|
71
|
+
# proxy_login: 'proxyLoginHere', # OPTIONAL
|
|
72
|
+
# proxy_password: 'proxyPasswordHere', # OPTIONAL
|
|
73
|
+
# user_agent: 'MODERN_USER_AGENT_HERE', # OPTIONAL
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
solution.g_recaptcha_response
|
|
77
|
+
"03AOPBWq_RPO2vLzyk0h8gH0cA2X4v3tpYCPZR6Y4yxKy1s3Eo7CHZRQntxrd..."
|
|
78
|
+
```
|
|
69
79
|
|
|
70
|
-
|
|
71
|
-
client.get_balance!
|
|
72
|
-
```
|
|
80
|
+
*Parameters:*
|
|
73
81
|
|
|
74
|
-
|
|
82
|
+
- `website_key`: the Google website key for the reCAPTCHA.
|
|
83
|
+
- `website_url`: the URL of the page with the reCAPTCHA challenge.
|
|
84
|
+
- `proxy_type`: optional parameter. Proxy connection protocol.
|
|
85
|
+
- `proxy_address`: optional parameter. The proxy address.
|
|
86
|
+
- `proxy_port`: optional parameter. The proxy port.
|
|
87
|
+
- `proxy_login`: optional parameter. The proxy login.
|
|
88
|
+
- `proxy_password`: optional parameter. The proxy password.
|
|
89
|
+
- `user_agent`: optional parameter. The user agent.
|
|
75
90
|
|
|
76
|
-
|
|
77
|
-
- `1` Standart ImageToText, English language.
|
|
78
|
-
- `2` Standart ImageToText, Russian language.
|
|
79
|
-
- `5` Recaptcha NoCaptcha tasks.
|
|
80
|
-
- `6` Recaptcha Proxyless task.
|
|
91
|
+
#### reCAPTCHA v3
|
|
81
92
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
93
|
+
```ruby
|
|
94
|
+
solution = client.decode_recaptcha_v3!(
|
|
95
|
+
website_key: 'xyz',
|
|
96
|
+
website_url: 'http://example.com/example=1',
|
|
97
|
+
min_score: 0.3,
|
|
98
|
+
page_action: 'myverify',
|
|
99
|
+
# is_enterprise: false, # OPTIONAL
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
solution.g_recaptcha_response
|
|
103
|
+
"03AOPBWq_RPO2vLzyk0h8gH0cA2X4v3tpYCPZR6Y4yxKy1s3Eo7CHZRQntxrd..."
|
|
104
|
+
```
|
|
85
105
|
|
|
86
|
-
|
|
106
|
+
*Parameters:*
|
|
87
107
|
|
|
88
|
-
|
|
89
|
-
|
|
108
|
+
- `website_key`: the Google website key for the reCAPTCHA.
|
|
109
|
+
- `website_url`: the URL of the page with the reCAPTCHA challenge.
|
|
110
|
+
- `action`: the action name used by the CAPTCHA.
|
|
111
|
+
- `min_score`: optional parameter. The minimal score needed for the CAPTCHA resolution. Defaults to `0.3`.
|
|
112
|
+
- `is_enterprise`: optional parameter. Set to `true` if you are solving a reCAPTCHA v3 Enterprise. Defaults to `false`.
|
|
90
113
|
|
|
91
|
-
|
|
114
|
+
> About the `action` parameter: in order to find out what this is, you need to inspect the JavaScript
|
|
115
|
+
> code of the website looking for a call to the `grecaptcha.execute` function.
|
|
116
|
+
>
|
|
117
|
+
> ```javascript
|
|
118
|
+
> // Example
|
|
119
|
+
> grecaptcha.execute('6Lc2fhwTAAAAAGatXTzFYfvlQMI2T7B6ji8UVV_f', { action: "examples/v3scores" })
|
|
120
|
+
> ````
|
|
92
121
|
|
|
93
|
-
|
|
94
|
-
|
|
122
|
+
> About the `min_score` parameter: it's strongly recommended to use a minimum score of `0.3` as higher
|
|
123
|
+
> scores are rare.
|
|
95
124
|
|
|
96
|
-
|
|
125
|
+
#### hCaptcha
|
|
97
126
|
|
|
98
|
-
|
|
99
|
-
|
|
127
|
+
```ruby
|
|
128
|
+
solution = client.decode_h_captcha!(
|
|
129
|
+
website_key: 'xyz',
|
|
130
|
+
website_url: 'http://example.com/example=1',
|
|
131
|
+
# proxy_type: 'http', # OPTIONAL
|
|
132
|
+
# proxy_address: '127.0.0.1', # OPTIONAL
|
|
133
|
+
# proxy_port: '8080', # OPTIONAL
|
|
134
|
+
# proxy_login: 'proxyLoginHere', # OPTIONAL
|
|
135
|
+
# proxy_password: 'proxyPasswordHere', # OPTIONAL
|
|
136
|
+
# user_agent: 'MODERN_USER_AGENT_HERE', # OPTIONAL
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
solution.token
|
|
140
|
+
"P0_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXNza2V5IjoiNnpWV..."
|
|
141
|
+
|
|
142
|
+
# Or
|
|
143
|
+
|
|
144
|
+
solution.g_recaptcha_response # Deprecated
|
|
145
|
+
"P0_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXNza2V5IjoiNnpWV..."
|
|
146
|
+
```
|
|
100
147
|
|
|
101
|
-
|
|
102
|
-
options = {
|
|
103
|
-
website_key: 'xyz',
|
|
104
|
-
website_url: 'http://example.com/example=1'
|
|
105
|
-
}
|
|
148
|
+
*Parameters:*
|
|
106
149
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
150
|
+
- `website_key`: the site key for the hCatpcha.
|
|
151
|
+
- `website_url`: the URL of the page with the hCaptcha challenge.
|
|
152
|
+
- `proxy_type`: optional parameter. Proxy connection protocol.
|
|
153
|
+
- `proxy_address`: optional parameter. The proxy address.
|
|
154
|
+
- `proxy_port`: optional parameter. The proxy port.
|
|
155
|
+
- `proxy_login`: optional parameter. The proxy login.
|
|
156
|
+
- `proxy_password`: optional parameter. The proxy password.
|
|
157
|
+
- `user_agent`: optional parameter. The user agent.
|
|
110
158
|
|
|
111
|
-
|
|
112
|
-
the form, like the following:
|
|
159
|
+
#### FunCaptcha
|
|
113
160
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
161
|
+
```ruby
|
|
162
|
+
solution = client.decode_fun_captcha!(
|
|
163
|
+
website_public_key: 'xyz',
|
|
164
|
+
website_url: 'http://example.com/example=1',
|
|
165
|
+
# proxy_type: 'http', # OPTIONAL
|
|
166
|
+
# proxy_address: '127.0.0.1', # OPTIONAL
|
|
167
|
+
# proxy_port: '8080', # OPTIONAL
|
|
168
|
+
# proxy_login: 'proxyLoginHere', # OPTIONAL
|
|
169
|
+
# proxy_password: 'proxyPasswordHere', # OPTIONAL
|
|
170
|
+
# user_agent: 'MODERN_USER_AGENT_HERE', # OPTIONAL
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
solution.token
|
|
174
|
+
"380633616d817f2b8.2351188603|r=ap-southeast-2|met..."
|
|
175
|
+
```
|
|
117
176
|
|
|
118
|
-
|
|
177
|
+
*Parameters:*
|
|
119
178
|
|
|
120
|
-
|
|
179
|
+
- `website_key`: the site key for the hCatpcha.
|
|
180
|
+
- `website_url`: the URL of the page with the hCaptcha challenge.
|
|
181
|
+
- `proxy_type`: optional parameter. Proxy connection protocol.
|
|
182
|
+
- `proxy_address`: optional parameter. The proxy address.
|
|
183
|
+
- `proxy_port`: optional parameter. The proxy port.
|
|
184
|
+
- `proxy_login`: optional parameter. The proxy login.
|
|
185
|
+
- `proxy_password`: optional parameter. The proxy password.
|
|
186
|
+
- `user_agent`: optional parameter. The user agent.
|
|
121
187
|
|
|
122
|
-
|
|
188
|
+
#### Geetest
|
|
123
189
|
|
|
124
|
-
|
|
125
|
-
|
|
190
|
+
```ruby
|
|
191
|
+
solution = client.decode_geetest!(
|
|
192
|
+
website_url: 'http://mywebsite.com/geetest/test.php',
|
|
193
|
+
gt: '874703612e5cac182812a00e273aad0d',
|
|
194
|
+
challenge: 'a559b82bca2c500101a1c8a4f4204742',
|
|
195
|
+
# proxy_type: 'http', # OPTIONAL
|
|
196
|
+
# proxy_address: '127.0.0.1', # OPTIONAL
|
|
197
|
+
# proxy_port: '8080', # OPTIONAL
|
|
198
|
+
# proxy_login: 'proxyLoginHere', # OPTIONAL
|
|
199
|
+
# proxy_password: 'proxyPasswordHere', # OPTIONAL
|
|
200
|
+
# user_agent: 'MODERN_USER_AGENT_HERE', # OPTIONAL
|
|
201
|
+
)
|
|
126
202
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
website_public_key: 'xyz',
|
|
130
|
-
website_url: 'http://example.com/example=1',
|
|
131
|
-
language_pool: '...'
|
|
132
|
-
}
|
|
203
|
+
solution.v3['challenge']
|
|
204
|
+
"3c1c5153aa48011e92883aed820069f3hj"
|
|
133
205
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
```
|
|
206
|
+
solution.v3['validate']
|
|
207
|
+
"47ad5a0a6eb98a95b2bcd9e9eecc8272"
|
|
137
208
|
|
|
138
|
-
|
|
209
|
+
solution.v3['seccode']
|
|
210
|
+
"83fa4f2d23005fc91c3a015a1613f803|jordan"
|
|
139
211
|
|
|
140
|
-
|
|
212
|
+
# Or
|
|
141
213
|
|
|
142
|
-
|
|
214
|
+
solution.v4['captcha_id']
|
|
215
|
+
"fcd636b4514bf7ac4143922550b3008b"
|
|
143
216
|
|
|
144
|
-
|
|
145
|
-
|
|
217
|
+
solution.v4['lot_number']
|
|
218
|
+
"354ab6dd4e594fdc903074c4d8d37b24"
|
|
146
219
|
|
|
147
|
-
|
|
220
|
+
solution.v4['pass_token']
|
|
221
|
+
"b645946a654e60218c7922b74b3b5ee8e8717e8fd3cd51..."
|
|
148
222
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
desire.
|
|
223
|
+
solution.v4['gen_time']
|
|
224
|
+
"1649921519"
|
|
152
225
|
|
|
153
|
-
|
|
226
|
+
solution.v4['captcha_output']
|
|
227
|
+
"cFPIALDXSop8Ri2mPABbRWzNBs86N8D4vNUTuVa7wN7E..."
|
|
228
|
+
```
|
|
229
|
+
*Parameters:*
|
|
230
|
+
|
|
231
|
+
- `website_url`: URL of a target web page. It can be located anywhere on the web site, even in a member's area.
|
|
232
|
+
- `gt`: the domain's public key.
|
|
233
|
+
- `challenge`: changing token key. Make sure you grab a fresh one for each captcha.
|
|
234
|
+
- `geetest_api_server_subdomain`: optional parameter. API subdomain. May be required for some implementations.
|
|
235
|
+
- `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.
|
|
236
|
+
- `version`: optional parameter. Version number. Default version is 3. Supported versions: 3 and 4.
|
|
237
|
+
- `init_parameters`: optional parameter. Additional initialization parameters for version 4.
|
|
238
|
+
- `proxy_type`: optional parameter. Proxy connection protocol.
|
|
239
|
+
- `proxy_address`: optional parameter. The proxy address.
|
|
240
|
+
- `proxy_port`: optional parameter. The proxy port.
|
|
241
|
+
- `proxy_login`: optional parameter. The proxy login.
|
|
242
|
+
- `proxy_password`: optional parameter. The proxy password.
|
|
243
|
+
- `user_agent`: optional parameter. The user agent.
|
|
244
|
+
|
|
245
|
+
### 3. Report an incorrectly solved image CAPTCHA for a refund
|
|
246
|
+
|
|
247
|
+
It is only possible to report incorrectly solved image CAPTCHAs.
|
|
154
248
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
website_url: 'http://example.com/example=1',
|
|
159
|
-
min_score: 0.3,
|
|
160
|
-
page_action: 'myverify'
|
|
161
|
-
}
|
|
249
|
+
```ruby
|
|
250
|
+
client.report_incorrect_image_catpcha!(task_id)
|
|
251
|
+
```
|
|
162
252
|
|
|
163
|
-
|
|
164
|
-
solution.g_recaptcha_response # Solution of the captcha
|
|
165
|
-
```
|
|
253
|
+
### 4. Get your account balance
|
|
166
254
|
|
|
167
|
-
|
|
168
|
-
|
|
255
|
+
```ruby
|
|
256
|
+
client.get_balance!
|
|
257
|
+
```
|
|
169
258
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
259
|
+
### 5. Get current stats of a queue.
|
|
260
|
+
|
|
261
|
+
Queue IDs:
|
|
262
|
+
|
|
263
|
+
- `1` Standart ImageToText, English language
|
|
264
|
+
- `2` Standart ImageToText, Russian language
|
|
265
|
+
- `5` Recaptcha NoCaptcha tasks
|
|
266
|
+
- `6` Recaptcha Proxyless task
|
|
267
|
+
- `7` Funcaptcha task
|
|
268
|
+
- `10` Funcaptcha Proxyless task
|
|
269
|
+
- `12` GeeTest with proxy
|
|
270
|
+
- `13` GeeTest without proxy
|
|
271
|
+
- `18` Recaptcha V3 s0.3
|
|
272
|
+
- `19` Recaptcha V3 s0.7
|
|
273
|
+
- `20` Recaptcha V3 s0.9
|
|
274
|
+
- `21` hCaptcha with proxy
|
|
275
|
+
- `22` hCaptcha without proxy
|
|
276
|
+
- `23` Recaptcha Enterprise V2 with proxy
|
|
277
|
+
- `24` Recaptcha Enterprise V2 without proxy
|
|
278
|
+
- `25` AntiGateTask
|
|
173
279
|
|
|
280
|
+
```ruby
|
|
281
|
+
client.get_queue_stats!(queue_id)
|
|
282
|
+
```
|
|
174
283
|
|
|
175
284
|
## Notes
|
|
176
285
|
|
|
177
|
-
|
|
286
|
+
### Ruby dependencies
|
|
178
287
|
|
|
179
288
|
AntiCaptcha doesn't require specific dependencies. That saves you memory and
|
|
180
289
|
avoid conflicts with other gems.
|
|
181
290
|
|
|
182
|
-
|
|
291
|
+
### Input image format
|
|
183
292
|
|
|
184
|
-
Any format you use in the
|
|
185
|
-
be converted to a body64
|
|
186
|
-
already have this format
|
|
187
|
-
|
|
293
|
+
Any format you use in the `decode_image!` method (`file`, `path`, `body`, `body64`)
|
|
294
|
+
will always be converted to a `body64`, which is a base64-encoded binary string.
|
|
295
|
+
So, if you already have this format on your end, there is no need for convertions
|
|
296
|
+
before calling the API.
|
|
188
297
|
|
|
189
298
|
> Our recomendation is to never convert your image format, unless needed. Let
|
|
190
299
|
> the gem convert internally. It may save you resources (CPU, memory and IO).
|
|
191
300
|
|
|
192
|
-
|
|
301
|
+
### Versioning
|
|
193
302
|
|
|
194
303
|
AntiCaptcha gem uses [Semantic Versioning](http://semver.org/).
|
|
195
304
|
|
|
196
305
|
# License
|
|
197
306
|
|
|
198
|
-
MIT License. Copyright (C) 2011-
|
|
307
|
+
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", "
|
|
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
|
data/lib/anti_captcha/client.rb
CHANGED
|
@@ -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(
|
|
8
|
-
SUPPORTED_TASKS = %w(ImageToTextTask NoCaptchaTask FunCaptchaTask)
|
|
7
|
+
PROXYABLE_TASKS = %w(RecaptchaV2Task FunCaptchaTask HCaptchaTask GeeTestTask)
|
|
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 (
|
|
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] ||
|
|
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
|
|
77
|
+
# Decodes a reCAPTCHA v2 (NoCaptcha).
|
|
79
78
|
#
|
|
80
|
-
# @see `AntiCaptcha::Client#
|
|
79
|
+
# @see `AntiCaptcha::Client#decode_recaptcha_v2!`
|
|
81
80
|
#
|
|
82
|
-
def
|
|
83
|
-
|
|
81
|
+
def decode_recaptcha_v2(options, proxy = nil)
|
|
82
|
+
decode_recaptcha_v2!(options, proxy)
|
|
84
83
|
rescue
|
|
85
|
-
AntiCaptcha::
|
|
84
|
+
AntiCaptcha::RecaptchaV2Solution.new
|
|
86
85
|
end
|
|
86
|
+
alias :decode_nocaptcha :decode_recaptcha_v2
|
|
87
87
|
|
|
88
88
|
#
|
|
89
|
-
# Decodes a NoCaptcha
|
|
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::
|
|
106
|
+
# @return [AntiCaptcha::RecaptchaV2Solution] The solution of the reCAPTCHA v2.
|
|
107
107
|
#
|
|
108
|
-
def
|
|
109
|
-
task = create_task!('
|
|
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::
|
|
111
|
+
AntiCaptcha::RecaptchaV2Solution.new(task_result)
|
|
112
112
|
end
|
|
113
|
+
alias :decode_nocaptcha! :decode_recaptcha_v2!
|
|
113
114
|
|
|
114
115
|
#
|
|
115
|
-
# Decodes a reCAPTCHA
|
|
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
|
|
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
|
|
138
|
+
# the reCAPTCHA v3.
|
|
137
139
|
#
|
|
138
140
|
def decode_recaptcha_v3!(options)
|
|
139
141
|
task = create_task!('RecaptchaV3TaskProxyless', options)
|
|
@@ -167,6 +169,83 @@ module AntiCaptcha
|
|
|
167
169
|
AntiCaptcha::FunCaptchaSolution.new(task_result)
|
|
168
170
|
end
|
|
169
171
|
|
|
172
|
+
#
|
|
173
|
+
# Decodes a HCaptcha CAPTCHA.
|
|
174
|
+
#
|
|
175
|
+
# @see `AntiCaptcha::Client#decode_h_captcha!`
|
|
176
|
+
#
|
|
177
|
+
def decode_h_captcha(options, proxy = nil)
|
|
178
|
+
decode_h_captcha!(options, proxy)
|
|
179
|
+
rescue
|
|
180
|
+
AntiCaptcha::HCaptchaSolution.new
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
#
|
|
184
|
+
# Decodes a HCaptcha CAPTCHA.
|
|
185
|
+
#
|
|
186
|
+
# @param [Hash] options Options hash.
|
|
187
|
+
# @option options [String] :website_url
|
|
188
|
+
# @option options [String] :website_key
|
|
189
|
+
#
|
|
190
|
+
# @param [Hash] proxy Not mandatory. A hash with configs of the proxy that
|
|
191
|
+
# has to be used. Defaults to `nil`.
|
|
192
|
+
# @option proxy [String] :proxy_type
|
|
193
|
+
# @option proxy [String] :proxy_address
|
|
194
|
+
# @option proxy [String] :proxy_port
|
|
195
|
+
# @option proxy [String] :proxy_login
|
|
196
|
+
# @option proxy [String] :proxy_login
|
|
197
|
+
# @option proxy [String] :proxy_password
|
|
198
|
+
# @option proxy [String] :user_agent
|
|
199
|
+
#
|
|
200
|
+
# @return [AntiCaptcha::HCaptchaSolution] The solution of the HCaptcha.
|
|
201
|
+
#
|
|
202
|
+
def decode_h_captcha!(options, proxy = nil)
|
|
203
|
+
task = create_task!('HCaptchaTask', options, proxy)
|
|
204
|
+
task_result = get_task_result!(task['taskId'])
|
|
205
|
+
AntiCaptcha::HCaptchaSolution.new(task_result)
|
|
206
|
+
end
|
|
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
|
+
|
|
170
249
|
# Creates a task for solving the selected CAPTCHA type.
|
|
171
250
|
#
|
|
172
251
|
# @param [String] type The type of the CAPTCHA.
|
|
@@ -226,9 +305,9 @@ module AntiCaptcha
|
|
|
226
305
|
comment: options[:comment],
|
|
227
306
|
}
|
|
228
307
|
|
|
229
|
-
when '
|
|
308
|
+
when 'RecaptchaV2Task'
|
|
230
309
|
args[:task] = {
|
|
231
|
-
type: '
|
|
310
|
+
type: 'RecaptchaV2Task',
|
|
232
311
|
websiteURL: options[:website_url],
|
|
233
312
|
websiteKey: options[:website_key],
|
|
234
313
|
}
|
|
@@ -236,11 +315,13 @@ module AntiCaptcha
|
|
|
236
315
|
when 'RecaptchaV3TaskProxyless'
|
|
237
316
|
args[:task] = {
|
|
238
317
|
type: 'RecaptchaV3TaskProxyless',
|
|
239
|
-
websiteURL:
|
|
240
|
-
websiteKey:
|
|
241
|
-
minScore:
|
|
242
|
-
pageAction:
|
|
318
|
+
websiteURL: options[:website_url],
|
|
319
|
+
websiteKey: options[:website_key],
|
|
320
|
+
minScore: (options[:min_score] || 0.3).to_f,
|
|
321
|
+
pageAction: options[:page_action],
|
|
243
322
|
}
|
|
323
|
+
args[:isEnterprise] = options[:is_enterprise] if [true, false].include?(options[:is_enterprise])
|
|
324
|
+
|
|
244
325
|
|
|
245
326
|
when 'FunCaptchaTask'
|
|
246
327
|
args[:task] = {
|
|
@@ -249,10 +330,28 @@ module AntiCaptcha
|
|
|
249
330
|
websitePublicKey: options[:website_public_key],
|
|
250
331
|
}
|
|
251
332
|
|
|
333
|
+
when 'HCaptchaTask'
|
|
334
|
+
args[:task] = {
|
|
335
|
+
type: 'HCaptchaTask',
|
|
336
|
+
websiteURL: options[:website_url],
|
|
337
|
+
websiteKey: options[:website_key],
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
when 'GeeTestTask'
|
|
341
|
+
args[:task] = {
|
|
342
|
+
type: 'GeeTestTask',
|
|
343
|
+
websiteURL: options[:website_url],
|
|
344
|
+
gt: options[:gt],
|
|
345
|
+
challenge: options[:challenge],
|
|
346
|
+
}
|
|
347
|
+
args[:geetestApiServerSubdomain] = options[:geetest_api_server_subdomain] if !options[:geetest_api_server_subdomain].nil?
|
|
348
|
+
args[:geetestGetLib] = options[:geetest_get_lib] if !options[:geetest_get_lib].nil?
|
|
349
|
+
args[:version] = options[:version] if !options[:version].nil?
|
|
350
|
+
args[:initParameters] = options[:init_parameters] if !options[:init_parameters].nil?
|
|
351
|
+
|
|
252
352
|
else
|
|
253
|
-
message = "Invalid task type: '#{type}'.
|
|
254
|
-
|
|
255
|
-
raise AntiCaptcha.raise_error(message)
|
|
353
|
+
message = "Invalid task type: '#{type}'."
|
|
354
|
+
raise AntiCaptcha::ArgumentError.new(message)
|
|
256
355
|
end
|
|
257
356
|
|
|
258
357
|
if PROXYABLE_TASKS.include?(type)
|
|
@@ -281,7 +380,7 @@ module AntiCaptcha
|
|
|
281
380
|
# @return [Hash] Information about the task.
|
|
282
381
|
#
|
|
283
382
|
def get_task_result!(task_id)
|
|
284
|
-
raise AntiCaptcha.
|
|
383
|
+
raise AntiCaptcha::Error.new('taskId not received from Anti Captcha.') unless task_id
|
|
285
384
|
|
|
286
385
|
started_at = Time.now
|
|
287
386
|
|
|
@@ -317,6 +416,11 @@ module AntiCaptcha
|
|
|
317
416
|
# 6 - Recaptcha Proxyless task.
|
|
318
417
|
# 7 - Funcaptcha task.
|
|
319
418
|
# 10 - Funcaptcha Proxyless task.
|
|
419
|
+
# 18 - Recaptcha V3 s0.3
|
|
420
|
+
# 19 - Recaptcha V3 s0.7
|
|
421
|
+
# 20 - Recaptcha V3 s0.9
|
|
422
|
+
# 21 - hCaptcha Proxy-On
|
|
423
|
+
# 22 - hCaptcha Proxyless
|
|
320
424
|
#
|
|
321
425
|
# @return [Hash] Information about the queue.
|
|
322
426
|
#
|
|
@@ -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
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module AntiCaptcha
|
|
2
|
+
class HCaptchaSolution < AntiCaptcha::Solution
|
|
3
|
+
attr_accessor :g_recaptcha_response # Deprecated
|
|
4
|
+
attr_accessor :token
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def initialize(task_result = nil)
|
|
8
|
+
super
|
|
9
|
+
|
|
10
|
+
if task_result
|
|
11
|
+
@token = task_result.api_result['solution']['gRecaptchaResponse']
|
|
12
|
+
@g_recaptcha_response = token
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -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
|
-
|
|
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
|
data/lib/anti_captcha/version.rb
CHANGED
data/lib/anti_captcha.rb
CHANGED
|
@@ -33,9 +33,11 @@ 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/
|
|
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
|
+
require 'anti_captcha/models/h_captcha_solution'
|
|
40
|
+
require 'anti_captcha/models/geetest_solution'
|
|
39
41
|
require 'anti_captcha/models/task_result'
|
|
40
42
|
require 'anti_captcha/client'
|
|
41
43
|
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.
|
|
4
|
+
version: 2.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Infosimples
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-09-30 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:
|
|
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:
|
|
26
|
+
version: 2.2.33
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: rake
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -75,8 +75,10 @@ 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
|
|
79
|
+
- lib/anti_captcha/models/h_captcha_solution.rb
|
|
78
80
|
- lib/anti_captcha/models/image_to_text_solution.rb
|
|
79
|
-
- lib/anti_captcha/models/
|
|
81
|
+
- lib/anti_captcha/models/recaptcha_v2_solution.rb
|
|
80
82
|
- lib/anti_captcha/models/recaptcha_v3_solution.rb
|
|
81
83
|
- lib/anti_captcha/models/solution.rb
|
|
82
84
|
- lib/anti_captcha/models/task_result.rb
|
|
@@ -85,7 +87,7 @@ homepage: https://github.com/infosimples/anti_captcha
|
|
|
85
87
|
licenses:
|
|
86
88
|
- MIT
|
|
87
89
|
metadata: {}
|
|
88
|
-
post_install_message:
|
|
90
|
+
post_install_message:
|
|
89
91
|
rdoc_options: []
|
|
90
92
|
require_paths:
|
|
91
93
|
- lib
|
|
@@ -100,8 +102,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
100
102
|
- !ruby/object:Gem::Version
|
|
101
103
|
version: '0'
|
|
102
104
|
requirements: []
|
|
103
|
-
rubygems_version: 3.
|
|
104
|
-
signing_key:
|
|
105
|
+
rubygems_version: 3.1.4
|
|
106
|
+
signing_key:
|
|
105
107
|
specification_version: 4
|
|
106
108
|
summary: Ruby API for Anti Captcha (CAPTCHA Solver as a Service)
|
|
107
109
|
test_files: []
|