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.



140
141
142
# File 'lib/two_captcha/client.rb', line 140

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

#captcha(captcha_id) ⇒ TwoCaptcha::Captcha

Retrieve information from an uploaded captcha.



112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/two_captcha/client.rb', line 112

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.



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

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 DeathByCaptcha::Timeout if (Time.now - started_at) > timeout
  end

  decoded_captcha
end

#loadString

Get current load from 2Captcha.



158
159
160
# File 'lib/two_captcha/client.rb', line 158

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

#report!(captcha_id) ⇒ Boolean

Report incorrectly solved captcha for refund.



131
132
133
134
# File 'lib/two_captcha/client.rb', line 131

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.



150
151
152
# File 'lib/two_captcha/client.rb', line 150

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.



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/two_captcha/client.rb', line 86

def upload(options = {})
  args = {}
  args[:body]   = options[:raw64]
  args[:method] = 'base64'
  [:phrase, :regsense, :numeric, :calc, :min_len, :max_len, :language,
   :header_acao, :id_constructor].each do |key|
    args[key] = options[key] if options[key]
  end
  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