two_captcha 1.3.0 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 29bc40bcdecf08c3315a97224e2dbc0b7308f737
4
- data.tar.gz: f16d6172e691101d63534746c83da27d109abdb0
2
+ SHA256:
3
+ metadata.gz: 85dec926f62d43f6629fea1232276b55950cac27c107e64d064f6374f571c6b6
4
+ data.tar.gz: 9e962be8d8d1dd76f6cfe7644003a042b3bcccf216aa5d820fd057c95d930c22
5
5
  SHA512:
6
- metadata.gz: 36c9c2bd793aba1dda0b4ce7414ab2b56ae5193c314714f6b2b33f22cec13ecc8ffbf29ac0fb997b866890079b3131b316a26c5a05274bc300e55d93072f6573
7
- data.tar.gz: 0d7d9a545bdfa066e551031a824129635ca4b4f2639de54204bb2d7d2beeb8a9fc40b93e51bc1eba051836534b68ead71a595dff9be271300b1b6aa327710de3
6
+ metadata.gz: 11dc25d38866f051f13963f460c9b8d5b813d0960b4f1ce8fa3b0c589555d368021cae3994cd1e9d0e6f730940a6921fa91173a70e48a29ec25b7a3903ac814e
7
+ data.tar.gz: 762fd992e1b9fa35cfc91baf729d280d123298a46f92b75a6dc03e3b42294184d3a4c84cfc449b5d6d44615f54434c5a1d9c0b565ce1ab7d310cf907996b0d50
@@ -0,0 +1,9 @@
1
+ # TwoCaptcha Changes
2
+
3
+ ### 1.4.0
4
+
5
+ * **breaking changes:**
6
+ * The method "decode_recaptcha_v2" now always return a TwoCaptcha::Captcha
7
+ object. It was returning a string when successful.
8
+ * enhancements:
9
+ * Add tests to solve RecaptchaV2 with the preferred method.
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- Developed by [Infosimples](https://infosimples.com), a [big data company](https://infosimples.com/en/data-engineering).
1
+ Developed by [Infosimples](https://infosimples.com).
2
2
 
3
3
  # TwoCaptcha
4
4
 
@@ -66,10 +66,13 @@ Or install it yourself as:
66
66
  captcha = client.captcha('130920620') # with 130920620 as the captcha id
67
67
  ```
68
68
 
69
- 4. **Report incorrectly solved captcha for refund**
69
+ 4. **Report incorrectly (for refund) or correctly (useful for reCAPTCHA v3) solved captcha**
70
70
 
71
71
  ```ruby
72
- client.report!('130920620') # with 130920620 as the captcha id
72
+ client.report!('130920620', 'reportbad') # with 130920620 as the captcha id
73
+ # return true if successfully reported
74
+
75
+ client.report!('256892751', 'reportgood') # with 256892751 as the captcha id
73
76
  # return true if successfully reported
74
77
  ```
75
78
 
@@ -96,17 +99,18 @@ Or install it yourself as:
96
99
  # return an XML string with the current service load.
97
100
  ```
98
101
 
99
- ## Clickable CAPTCHAs (e.g. "No CAPTCHA reCAPTCHA")
102
+ ## reCAPTCHA v2 (e.g. "No CAPTCHA reCAPTCHA")
100
103
 
101
104
  There are two ways of solving captchas similar to
102
105
  [reCAPTCHA v2](https://support.google.com/recaptcha/?hl=en#6262736).
103
106
 
104
107
  ### (Prefered) Sending the `googlekey` and `pageurl` parameters
105
108
 
106
- This method requires no browser emulation. You can send two parameters that identify website in which the captcha is found.
109
+ This method requires no browser emulation. You can send two parameters that
110
+ identify the website in which the captcha is found.
107
111
 
108
- Please read the oficial documentation at https://2captcha.com/newapi-recaptcha-en for
109
- more information.
112
+ Please read the [oficial documentation](https://2captcha.com/newapi-recaptcha-en)
113
+ for more information.
110
114
 
111
115
  ```ruby
112
116
  options = {
@@ -114,13 +118,16 @@ more information.
114
118
  pageurl: 'http://example.com/example=1'
115
119
  }
116
120
 
117
- client.decode_recaptcha_v2(options)
121
+ captcha = client.decode_recaptcha_v2(options)
122
+ captcha.text # Solution of the captcha
123
+ captcha.id # Numeric ID of the captcha solved by TwoCaptcha
118
124
  ```
119
125
 
120
- The response will be a code that validates the form, like the following:
126
+ The solution (`captcha.text`) will be a code that validates the form, like the
127
+ following:
121
128
 
122
129
  ```ruby
123
- "03AHJ_VuuHAqJKxcTH6sbTsqw-L1Sm4gD57PTeaEr9-MaETG1vfu2H5zlcw0u2KqgjHPiXWwlulOw0Ef82tH6SOSbXdelgkvdDl8HreKFug05zfadw2n-A2HoTgYteVA53Q46VatEcZofa5eKfaWgvrPS-IP1DpV4bnUEG69-VbWAx7fJ-p4rHSxq-ZYesBkk9yYFrAiT_70uSz8lg3iqRImfRW91RIkEq8A5UBn4vABUQvlDV4eoKpeNUKDmHOABHkdsV8_1KEgCbabIwsIuIkN1_hw-Mkg0NRdWuXgNtOWen0Zv65yl6D31yhyLV2s0h3ygQwrpxJpBWs7o_rG2TaVfi0y9S5cYr-YlMTHszvMQCVllf5WAiNAgV28JuAnFH5WqRHqT56Tz6ZVNigIToEzq1tnfuewgmJuyyP_woy_MGRoZoHxx6V9yUDw8Ig-hYD8kakmSnnjNQd50w_Y_tI3aDLp-s_7ZmhH6pcaoWWsid5hdtMXyvrP9DscDuCLBf7etLle8caPWSaYCpAq9DOTtj5NpSg6-OeCJdGdgIPT9Xdbo_dm4pLGZ0CNd5WQcjil_kZN_uErRssv9r8j5SC6tsIPBneQLqqqsg8Hyt9kjIh0N10d6-sFeV3QWw-OuzCrPSNYc-_AxvwaB0GUAOmHDDbj8kKz1oqfdBwJienRm246cbstqdc7uAHHuLWLpt1A5W-56PEbb3Zs-HNo3kcjvlJcfrOVJKW68-G3S635EJ9SBm9GFKzFojEu4-TF9CvYNJKaXY9dDev_TVbBaWpWN2Ctx5hHKRbtD1_g2LsGUTDkpo7wrf4pbAyP34zeMRBI1wrrV12PBKnuafaMjy2KIFLt0LM91uWiBzEC61AiSKKEwP2nydRIyIFGwbLFUMeGeqmje87wSajcjmdjl_w4XZBY2zy8fUH6XoAGZ6AeCTulIljBQDObQynKDd-rutPvKNxZw3sra3yRt9ziDVKKDk-LbhTfw508g1lu9io6jnvm3kbAdnkfZ0x0PkGiUMHU7hnuoW6bXo2Yn_Zt5tDWL7N7wFtY6B0k7cTy73f8er508zReOuoyz2NqL8smDCmcJu05kr5R6OVHfeUszn5OiYeVh8Q_gTMsEf4wdaOsQWGZhWQIS8Vi_6IYzwQsnOtYdI6T8q4IDrQh-9eemVn0gNI6gdyknStQ7DoujdPGt20qzpURMwHaw"
130
+ "1JJHJ_VuuHAqJKxcaasbTsqw-L1Sm4gD57PTeaEr9-MaETG1vfu2H5zlcwkjsRoZoHxx6V9yUDw8Ig-hYD8kakmSnnjNQd50w_Y_tI3aDLp-s_7ZmhH6pcaoWWsid5hdtMXyvrP9DscDuCLBf7etLle8caPWSaYCpAq9DOTtj5NpSg6-OeCJdGdkjsakFUMeGeqmje87wSajcjmdjl_w4XZBY2zy8fUH6XoAGZ6AeCTulIljBQDObQynKDd-rutPvKNxZasDk-LbhTfw508g1lu9io6jnvm3kbAdnkfZ0x0PkGiUMHU7hnuoW6bXo2Yn_Zt5tDWL7N7wFtY6B0k7cTy73f8er508zReOuoyz2NqL8smDCmcJu05ajkPGt20qzpURMwHaw"
124
131
  ```
125
132
 
126
133
  ### Sending the challenge image
@@ -161,6 +168,61 @@ The response will be a simple text:
161
168
  '61267'
162
169
  ```
163
170
 
171
+ ## reCAPTCHA v3
172
+
173
+ This method requires no browser emulation. You can send four parameters that
174
+ identify the website in which the CAPTCHA is found and the minimum score
175
+ (0.3, 0.5 or 0.7) you desire.
176
+
177
+ **It's strongly recommended to use a minimum score of 0.3 as higher scores are extremely rare.**
178
+
179
+ Please read the [oficial documentation](https://2captcha.com/2captcha-api#solving_recaptchav3)
180
+ for more information.
181
+
182
+ ```ruby
183
+ options = {
184
+ googlekey: 'xyz',
185
+ pageurl: 'http://example.com/example=1',
186
+ action: 'verify',
187
+ min_score: 0.3
188
+ }
189
+
190
+ captcha = client.decode_recaptcha_v3(options)
191
+ captcha.text # Solution of the captcha
192
+ captcha.id # Numeric ID of the captcha solved by TwoCaptcha
193
+ ```
194
+
195
+ The solution (`captcha.text`) will be a code that validates the form, like the
196
+ following:
197
+
198
+ ```ruby
199
+ "1JJHJ_VuuHAqJKxcaasbTsqw-L1Sm4gD57PTeaEr9-MaETG1vfu2H5zlcwkjsRoZoHxx6V9yUDw8Ig-hYD8kakmSnnjNQd50w_Y_tI3aDLp-s_7ZmhH6pcaoWWsid5hdtMXyvrP9DscDuCLBf7etLle8caPWSaYCpAq9DOTtj5NpSg6-OeCJdGdkjsakFUMeGeqmje87wSajcjmdjl_w4XZBY2zy8fUH6XoAGZ6AeCTulIljBQDObQynKDd-rutPvKNxZasDk-LbhTfw508g1lu9io6jnvm3kbAdnkfZ0x0PkGiUMHU7hnuoW6bXo2Yn_Zt5tDWL7N7wFtY6B0k7cTy73f8er508zReOuoyz2NqL8smDCmcJu05ajkPGt20qzpURMwHaw"
200
+ ```
201
+
202
+ ## hCaptcha
203
+
204
+ This method allows you to solve hCaptcha.
205
+
206
+ There are two methods available:
207
+
208
+ - `decode_hcaptcha`: solves hCaptcha CAPTCHAs. It doesn't raise exceptions.
209
+ - `decode_hcaptcha!`: solves hCaptcha CAPTCHAs. It may raise an error if something goes wrong.
210
+
211
+ **Send the `sitekey` and `pageurl` parameters**
212
+
213
+ This method requires no browser emulation. You can send two parameters that
214
+ identify the website in which the CAPTCHA is found.
215
+
216
+ ```ruby
217
+ options = {
218
+ sitekey: 'xyz',
219
+ pageurl: 'http://example.com/example=1'
220
+ }
221
+
222
+ captcha = client.decode_hcaptcha!(options)
223
+ captcha.text # Solution of the captcha
224
+ ```
225
+
164
226
  ## Notes
165
227
 
166
228
  #### Thread-safety
@@ -105,32 +105,114 @@ module TwoCaptcha
105
105
 
106
106
  fail(TwoCaptcha::GoogleKey) if options[:googlekey].empty?
107
107
 
108
- payload_in = {
108
+ upload_options = {
109
109
  method: 'userrecaptcha',
110
110
  googlekey: options[:googlekey],
111
111
  pageurl: options[:pageurl]
112
112
  }
113
+ decoded_captcha = upload(upload_options)
113
114
 
114
- response_in = request('in', :get, payload_in)
115
- status, captcha_id = response_in.split('|')
115
+ # pool untill the answer is ready
116
+ while decoded_captcha.text.to_s.empty?
117
+ sleep([polling, 10].max) # sleep at least 10 seconds
118
+ decoded_captcha = captcha(decoded_captcha.id)
119
+ fail TwoCaptcha::Timeout if (Time.now - started_at) > timeout
120
+ end
116
121
 
117
- payload_res = {
118
- action: 'get',
119
- json: '1',
120
- id: captcha_id
122
+ decoded_captcha
123
+ end
124
+
125
+ #
126
+ # Solve reCAPTCHA v3.
127
+ #
128
+ # @param [Hash] options Options hash. Check docs for the method decode!.
129
+ #
130
+ # @return [TwoCaptcha::Captcha] The solution of the given captcha.
131
+ #
132
+ def decode_recaptcha_v3(options = {})
133
+ decode_recaptcha_v3!(options)
134
+ rescue TwoCaptcha::Error => ex
135
+ TwoCaptcha::Captcha.new
136
+ end
137
+
138
+ #
139
+ # Solve reCAPTCHA v3.
140
+ #
141
+ # @param [Hash] options Options hash.
142
+ # @option options [String] :googlekey The open key of the site in which recaptcha is installed.
143
+ # @option options [String] :pageurl The URL of the page where the recaptcha is encountered.
144
+ # @option options [String] :action The action paramenter present on the page that uses recaptcha.
145
+ # @option options [String] :min_score The minimum score necessary to pass the challenge.
146
+ #
147
+ # @return [TwoCaptcha::Captcha] The solution of the given captcha.
148
+ #
149
+ def decode_recaptcha_v3!(options = {})
150
+ started_at = Time.now
151
+
152
+ fail(TwoCaptcha::GoogleKey) if options[:googlekey].empty?
153
+
154
+ upload_options = {
155
+ method: 'userrecaptcha',
156
+ version: 'v3',
157
+ googlekey: options[:googlekey],
158
+ pageurl: options[:pageurl],
159
+ action: options[:action],
160
+ min_score: options[:min_score]
121
161
  }
162
+ decoded_captcha = upload(upload_options)
122
163
 
123
- response_res = request('res', :get, payload_res)
124
- result = JSON.load(response_res)
164
+ # pool untill the answer is ready
165
+ while decoded_captcha.text.to_s.empty?
166
+ sleep([polling, 10].max) # sleep at least 10 seconds
167
+ decoded_captcha = captcha(decoded_captcha.id)
168
+ fail TwoCaptcha::Timeout if (Time.now - started_at) > timeout
169
+ end
125
170
 
126
- while ['CAPCHA_NOT_READY', 'CAPTCHA_NOT_READY'].include? result['request']
127
- sleep(polling)
128
- response_res = request('res', :get, payload_res)
129
- result = JSON.load(response_res)
171
+ decoded_captcha
172
+ end
173
+
174
+ #
175
+ # Solve hCaptcha.
176
+ #
177
+ # @param [Hash] options Options hash. Check docs for the method decode_hcaptcha!.
178
+ #
179
+ # @return [TwoCaptcha::Captcha] The solution of the given captcha.
180
+ #
181
+ def decode_hcaptcha(options = {})
182
+ decode_hcaptcha!(options)
183
+ rescue TwoCaptcha::Error => ex
184
+ TwoCaptcha::Captcha.new
185
+ end
186
+
187
+ #
188
+ # Solve hCaptcha.
189
+ #
190
+ # @param [Hash] options Options hash.
191
+ # @option options [String] :sitekey The key of the site in which hCaptcha is installed.
192
+ # @option options [String] :pageurl The URL of the page where the recaptcha is encountered.
193
+ #
194
+ # @return [TwoCaptcha::Captcha] The solution of the given captcha.
195
+ #
196
+ def decode_hcaptcha!(options = {})
197
+ started_at = Time.now
198
+
199
+ fail(TwoCaptcha::GoogleKey) if options[:sitekey].empty?
200
+
201
+ upload_options = {
202
+ method: 'hcaptcha',
203
+ sitekey: options[:sitekey],
204
+ pageurl: options[:pageurl]
205
+ }
206
+ decoded_captcha = upload(upload_options)
207
+
208
+ # pool untill the answer is ready
209
+ while decoded_captcha.text.to_s.empty?
210
+ sleep([polling, 10].max) # sleep at least 10 seconds
211
+ decoded_captcha = captcha(decoded_captcha.id)
130
212
  fail TwoCaptcha::Timeout if (Time.now - started_at) > timeout
131
213
  end
132
214
 
133
- result['request']
215
+ decoded_captcha
134
216
  end
135
217
 
136
218
  # Upload a captcha to 2Captcha.
@@ -141,8 +223,8 @@ module TwoCaptcha
141
223
  #
142
224
  def upload(options = {})
143
225
  args = {}
144
- args[:body] = options[:raw64]
145
- args[:method] = 'base64'
226
+ args[:body] = options[:raw64] if options[:raw64]
227
+ args[:method] = options[:method] || 'base64'
146
228
  args.merge!(options)
147
229
  response = request('in', :multipart, args)
148
230
 
@@ -178,11 +260,12 @@ module TwoCaptcha
178
260
  # Report incorrectly solved captcha for refund.
179
261
  #
180
262
  # @param [Integer] id Numeric ID of the captcha.
263
+ # @param [Integer] action 'reportbad' (default) or 'reportgood'.
181
264
  #
182
265
  # @return [Boolean] true if correctly reported
183
266
  #
184
- def report!(captcha_id)
185
- response = request('res', :get, action: 'reportbad', id: captcha_id)
267
+ def report!(captcha_id, action = 'reportbad')
268
+ response = request('res', :get, action: action, id: captcha_id)
186
269
  response == 'OK_REPORT_RECORDED'
187
270
  end
188
271
 
@@ -14,6 +14,24 @@ module TwoCaptcha
14
14
  end
15
15
  end
16
16
 
17
+ class Timeout < Error
18
+ def initialize
19
+ super('The captcha was not solved in the expected time')
20
+ end
21
+ end
22
+
23
+ class GoogleKey < Error
24
+ def initialize
25
+ super('Missing googlekey parameter')
26
+ end
27
+ end
28
+
29
+ class SiteKey < Error
30
+ def initialize
31
+ super('Missing sitekey parameter')
32
+ end
33
+ end
34
+
17
35
  class WrongUserKey < Error
18
36
  def initialize
19
37
  super('Wrong “key” parameter format, it should contain 32 symbols')
@@ -92,15 +110,27 @@ module TwoCaptcha
92
110
  end
93
111
  end
94
112
 
95
- class Timeout < Error
113
+ class CaptchaImageBlocked < Error
96
114
  def initialize
97
- super('The captcha was not solved in the expected time')
115
+ super('You have sent an image, that is unrecognizable and which is saved in our database as such. Usually this happens when the site where you get the captcha from has stopped sending you captcha and started giving you a “deny access” cap.')
98
116
  end
99
117
  end
100
118
 
101
- class GoogleKey < Error
119
+ class WrongCaptchaId < Error
102
120
  def initialize
103
- super('Missing googlekey parameter')
121
+ super('You are trying to get the answer or complain a captcha that was submitted more than 15 minutes ago.')
122
+ end
123
+ end
124
+
125
+ class BadDuplicates < Error
126
+ def initialize
127
+ super('Error is returned when 100% accuracy feature is enabled. The error means that max numbers of tries is reached but min number of matches not found.')
128
+ end
129
+ end
130
+
131
+ class ReportNotRecorded < Error
132
+ def initialize
133
+ super('Error is returned to your complain request (reportbad) if you already complained lots of correctly solved captchas.')
104
134
  end
105
135
  end
106
136
 
@@ -118,6 +148,10 @@ module TwoCaptcha
118
148
  'ERROR_WRONG_ID_FORMAT' => TwoCaptcha::WrongIdFormat,
119
149
  'ERROR_CAPTCHA_UNSOLVABLE' => TwoCaptcha::CaptchaUnsolvable,
120
150
  'ERROR_EMPTY_ACTION' => TwoCaptcha::EmptyAction,
121
- 'ERROR_GOOGLEKEY' => TwoCaptcha::GoogleKey
151
+ 'ERROR_GOOGLEKEY' => TwoCaptcha::GoogleKey,
152
+ 'ERROR_CAPTCHAIMAGE_BLOCKED' => TwoCaptcha::CaptchaImageBlocked,
153
+ 'ERROR_WRONG_CAPTCHA_ID' => TwoCaptcha::WrongCaptchaId,
154
+ 'ERROR_BAD_DUPLICATES' => TwoCaptcha::BadDuplicates,
155
+ 'REPORT_NOT_RECORDED' => TwoCaptcha::ReportNotRecorded,
122
156
  }
123
157
  end
@@ -1,4 +1,4 @@
1
1
  module TwoCaptcha
2
- VERSION = '1.3.0'
2
+ VERSION = '1.6.0'
3
3
  USER_AGENT = "TwoCaptcha/Ruby v#{VERSION}"
4
4
  end
@@ -92,4 +92,22 @@ describe TwoCaptcha::Client do
92
92
  it { expect(@captcha.id).to match(/[0-9]{9}/) }
93
93
  end
94
94
  end
95
+
96
+ context 'image reCAPTCHA v2' do
97
+ before(:all) { @client = TwoCaptcha.new(key) }
98
+
99
+ describe '#decode_recaptcha_v2!' do
100
+ before(:all) do
101
+ options = {
102
+ googlekey: '6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-',
103
+ pageurl: 'https://www.google.com/recaptcha/api2/demo'
104
+ }
105
+ @captcha = @client.decode_recaptcha_v2!(options)
106
+ end
107
+
108
+ it { expect(@captcha).to be_a(TwoCaptcha::Captcha) }
109
+ it { expect(@captcha.text.size).to be > 50 } # not perfect, I know
110
+ it { expect(@captcha.id).to match(/[0-9]{9}/) }
111
+ end
112
+ end
95
113
  end
@@ -6,7 +6,7 @@ require 'two_captcha/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "two_captcha"
8
8
  spec.version = TwoCaptcha::VERSION
9
- spec.authors = ["Marcelo Mita", "Rafael Barbolo"]
9
+ spec.authors = ["Rafael Barbolo", "Rafael Ivan Garcia"]
10
10
  spec.email = ["team@infosimples.com.br"]
11
11
  spec.summary = %q{Ruby API for 2Captcha (Captcha Solver as a Service)}
12
12
  spec.description = %q{TwoCaptcha allows you to solve captchas with manual labor}
@@ -14,7 +14,11 @@ Gem::Specification.new do |spec|
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
17
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+
18
+ # Since our currently binstubs are used only during the gem's development, we
19
+ # are ignoring them in the gem specification.
20
+ # spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
21
+
18
22
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
23
  spec.require_paths = ["lib"]
20
24
 
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: two_captcha
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
- - Marcelo Mita
8
7
  - Rafael Barbolo
9
- autorequire:
8
+ - Rafael Ivan Garcia
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-01-18 00:00:00.000000000 Z
12
+ date: 2021-01-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -56,9 +56,7 @@ dependencies:
56
56
  description: TwoCaptcha allows you to solve captchas with manual labor
57
57
  email:
58
58
  - team@infosimples.com.br
59
- executables:
60
- - console
61
- - setup
59
+ executables: []
62
60
  extensions: []
63
61
  extra_rdoc_files: []
64
62
  files:
@@ -66,6 +64,7 @@ files:
66
64
  - ".rspec"
67
65
  - ".travis.yml"
68
66
  - CODE_OF_CONDUCT.md
67
+ - Changelog.md
69
68
  - Gemfile
70
69
  - LICENSE.txt
71
70
  - README.md
@@ -89,7 +88,7 @@ homepage: https://github.com/infosimples/two_captcha
89
88
  licenses:
90
89
  - MIT
91
90
  metadata: {}
92
- post_install_message:
91
+ post_install_message:
93
92
  rdoc_options: []
94
93
  require_paths:
95
94
  - lib
@@ -104,9 +103,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
103
  - !ruby/object:Gem::Version
105
104
  version: '0'
106
105
  requirements: []
107
- rubyforge_project:
108
- rubygems_version: 2.5.1
109
- signing_key:
106
+ rubygems_version: 3.0.6
107
+ signing_key:
110
108
  specification_version: 4
111
109
  summary: Ruby API for 2Captcha (Captcha Solver as a Service)
112
110
  test_files: