Class: TwoCaptcha::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/two_captcha/client.rb

Overview

TwoCaptcha::Client is a client that communicates with the TwoCaptcha API: 2captcha.com/.

Constant Summary collapse

BASE_URL =
'http://2captcha.com/:action.php'

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(key, options = {}) ⇒ TwoCaptcha::Client

Create a TwoCaptcha API client.

Options Hash (options):

  • :timeout (Integer) — default: 60

    Seconds before giving up of a captcha being solved.

  • :polling (Integer) — default: 5

    Seconds before check_answer again



20
21
22
23
24
# File 'lib/two_captcha/client.rb', line 20

def initialize(key, options = {})
  self.key    = key
  self.timeout  = options[:timeout] || 60
  self.polling  = options[:polling] || 5
end

Instance Attribute Details

#keyObject

Returns the value of attribute key.



8
9
10
# File 'lib/two_captcha/client.rb', line 8

def key
  @key
end

#pollingObject

Returns the value of attribute polling.



8
9
10
# File 'lib/two_captcha/client.rb', line 8

def polling
  @polling
end

#timeoutObject

Returns the value of attribute timeout.



8
9
10
# File 'lib/two_captcha/client.rb', line 8

def timeout
  @timeout
end

Instance Method Details

#balanceFloat

Get balance from your account.



191
192
193
# File 'lib/two_captcha/client.rb', line 191

def balance
  request('res', :get, action: 'getbalance').to_f
end

#captcha(captcha_id) ⇒ TwoCaptcha::Captcha

Retrieve information from an uploaded captcha.



163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/two_captcha/client.rb', line 163

def captcha(captcha_id)
  response = request('res', :get, action: 'get', id: captcha_id)

  decoded_captcha = TwoCaptcha::Captcha.new(id: captcha_id)
  decoded_captcha.api_response = response

  if response.match(/\AOK\|/)
    decoded_captcha.text = response.split('|', 2)[1]
  end

  decoded_captcha
end

#decode(options = {}) ⇒ TwoCaptcha::Captcha

Decode the text from an image (i.e. solve a captcha).



33
34
35
36
37
# File 'lib/two_captcha/client.rb', line 33

def decode(options = {})
  decode!(options)
rescue TwoCaptcha::Error => ex
  TwoCaptcha::Captcha.new
end

#decode!(options = {}) ⇒ TwoCaptcha::Captcha

Decode the text from an image (i.e. solve a captcha).

Options Hash (options):

  • :url (String)

    URL of the image to be decoded.

  • :path (String)

    File path of the image to be decoded.

  • :file (File)

    File instance with image to be decoded.

  • :raw (String)

    Binary content of the image to be decoded.

  • :raw64 (String)

    Binary content encoded in base64 of the image to be decoded.

  • :phrase (Integer) — default: 0
  • :regsense (Integer) — default: 0
  • :numeric (Integer) — default: 0
  • :calc (Integer) — default: 0
  • :min_len (Integer) — default: 0
  • :max_len (Integer) — default: 0
  • :language (Integer) — default: 0
  • :header_acao (Integer) — default: 0
  • :id_constructor (Integer) — default: 0

    23 if new reCAPTCHA.

  • :coordinatescaptcha (Integer) — default: 0

    1 if clickable captcha.



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/two_captcha/client.rb', line 63

def decode!(options = {})
  started_at = Time.now

  raw64 = load_captcha(options)
  fail(TwoCaptcha::InvalidCaptcha) if raw64.to_s.empty?

  decoded_captcha = upload(options.merge(raw64: raw64))

  # pool untill the answer is ready
  while decoded_captcha.text.to_s.empty?
    sleep(polling)
    decoded_captcha = captcha(decoded_captcha.id)
    fail TwoCaptcha::Timeout if (Time.now - started_at) > timeout
  end

  decoded_captcha
end

#decode_recaptcha_v2(options = {}) ⇒ TwoCaptcha::Captcha

Solve reCAPTCHA v2.



88
89
90
91
92
# File 'lib/two_captcha/client.rb', line 88

def decode_recaptcha_v2(options = {})
  decode_recaptcha_v2!(options)
rescue TwoCaptcha::Error => ex
  TwoCaptcha::Captcha.new
end

#decode_recaptcha_v2!(options = {}) ⇒ TwoCaptcha::Captcha

Solve reCAPTCHA v2.

Options Hash (options):

  • :googlekey (String)

    The open key of the site in which recaptcha is installed.

  • :pageurl (String)

    The URL of the page where the recaptcha is encountered.



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/two_captcha/client.rb', line 103

def decode_recaptcha_v2!(options = {})
  started_at = Time.now

  fail(TwoCaptcha::GoogleKey) if options[:googlekey].empty?

  payload_in = {
    method: 'userrecaptcha',
    googlekey: options[:googlekey],
    pageurl: options[:pageurl]
  }

  response_in = request('in', :get, payload_in)
  status, captcha_id = response_in.split('|')

  payload_res = {
    action: 'get',
    json: '1',
    id: captcha_id
  }

  response_res = request('res', :get, payload_res)

  while response_res.match(/CAPTCHA_NOT_READY|CAPCHA_NOT_READY/i)
    sleep(polling)
    response_res = request('res', :get, payload_res)
    fail TwoCaptcha::Timeout if (Time.now - started_at) > timeout
  end

  JSON.load(response_res)['request']
end

#loadString

Get current load from 2Captcha.



209
210
211
# File 'lib/two_captcha/client.rb', line 209

def load
  request('load', :get)
end

#report!(captcha_id) ⇒ Boolean

Report incorrectly solved captcha for refund.



182
183
184
185
# File 'lib/two_captcha/client.rb', line 182

def report!(captcha_id)
  response = request('res', :get, action: 'reportbad', id: captcha_id)
  response == 'OK_REPORT_RECORDED'
end

#stats(date) ⇒ String

Get statistics from your account.



201
202
203
# File 'lib/two_captcha/client.rb', line 201

def stats(date)
  request('res', :get, action: 'getstats', date: date.strftime('%Y-%m-%d'))
end

#upload(options = {}) ⇒ TwoCaptcha::Captcha

Upload a captcha to 2Captcha.

This method will not return the solution. It helps on separating concerns.



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/two_captcha/client.rb', line 140

def upload(options = {})
  args = {}
  args[:body]   = options[:raw64]
  args[:method] = 'base64'
  args.merge!(options)
  response = request('in', :multipart, args)

  unless response.match(/\AOK\|/)
    fail(TwoCaptcha::Error, 'Unexpected API Response')
  end

  TwoCaptcha::Captcha.new(
    id: response.split('|', 2)[1],
    api_response: response
  )
end