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.

Parameters:

  • Captcha (String)

    key of the TwoCaptcha account.

  • options (Hash) (defaults to: {})

    Options hash.

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.

Returns:

  • (Float)

    Balance in USD.



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.

Parameters:

  • captcha_id (Integer)

    Numeric ID of the captcha.

Returns:



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).

Parameters:

  • options (Hash) (defaults to: {})

    Options hash. Check docs for the method decode!.

Returns:

  • (TwoCaptcha::Captcha)

    The captcha (with solution) or an empty captcha instance if something goes wrong.



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).

Parameters:

  • options (Hash) (defaults to: {})

    Options hash.

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.

Returns:



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.

Returns:

  • (String)

    Load in an XML string.



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.

Parameters:

  • id (Integer)

    Numeric ID of the captcha.

Returns:

  • (Boolean)

    true if correctly reported



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.

Parameters:

  • date (Date)

    Date when the statistics were collected.

Returns:

  • (String)

    Statistics from date in an XML string.



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.

Returns:



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