class Geetest::SDK3

Attributes

captcha_id[RW]
fn_challenge[R]
fn_seccode[R]
fn_validate[R]
private_key[RW]
response_str[R]
session_key[R]

Public Class Methods

new(captcha_id, private_key) click to toggle source
# File lib/geetest/sdk3.rb, line 16
def initialize(captcha_id, private_key)
  @captcha_id   = captcha_id
  @private_key  = private_key
  @response_str = ''

  @session_key  = 'gt_server_status'.freeze
  @fn_challenge = 'geetest_challenge'.freeze
  @fn_validate  = 'geetest_validate'.freeze
  @fn_seccode   = 'geetest_seccode'.freeze
end

Public Instance Methods

failback_validate(challenge = '', validate = '', seccode = '') click to toggle source
# File lib/geetest/sdk3.rb, line 52
def failback_validate(challenge = '', validate = '', seccode = '')
  return 0 if challenge.empty? || validate.empty? || seccode.empty?

  validate_array = validate.split('_')
  encode_ans = validate_array[0]
  encode_fbii = validate_array[1]
  encode_igi = validate_array[2]

  decode_ans = decode_response(challenge, encode_ans)
  decode_fbii = decode_response(challenge, encode_fbii)
  decode_igi = decode_response(challenge, encode_igi)
  validate_fail_image(decode_ans, decode_fbii, decode_igi)
end
pre_process(user_id = nil) click to toggle source
# File lib/geetest/sdk3.rb, line 27
def pre_process(user_id = nil)
  status, challenge = register(user_id)
  @response_str = make_response_format(status, challenge)
  status
end
success_validate(challenge = '', validate = '', seccode = '', user_id = nil, gt = nil, data = '', user_info = '') click to toggle source
# File lib/geetest/sdk3.rb, line 33
def success_validate(challenge = '', validate = '', seccode = '', user_id = nil, gt = nil, data = '', user_info = '')
  return 0 if challenge.empty? || validate.empty? || seccode.empty?
  return 0 unless check_result(challenge, validate)

  validate_url = %(#{API_HOST}#{API_VALIDATE_PATH})
  query = {
    seccode: seccode,
    sdk: %(ruby_#{@sdk_version}),
    user_id: user_id,
    data: data,
    timestamp: Time.now.to_s,
    challenge: challenge,
    userinfo: user_info,
    captchaid: gt
  }
  response = Net::HTTP.post_form(URI(validate_url), query)
  response.body == md5_encode(seccode)
end

Private Instance Methods

check_result(origin, validate) click to toggle source
# File lib/geetest/sdk3.rb, line 104
def check_result(origin, validate)
  validate == md5_encode(@private_key + 'geetest' + origin)
end
decode_rand_base(challenge) click to toggle source
# File lib/geetest/sdk3.rb, line 125
def decode_rand_base(challenge)
  temp_array = challenge[32..-1].chars.map do |char|
    char_ascii = char.ord
    char_ascii - (char_ascii > 57 ? 87 : 48)
  end

  temp_array[0] * 36 + temp_array[1]
end
decode_response(challenge, userresponse) click to toggle source
# File lib/geetest/sdk3.rb, line 108
def decode_response(challenge, userresponse)
  return 0 if !userresponse || userresponse.length > 100

  numbers = [1, 2, 5, 10, 50]
  repeat_numbers = []
  h = {}
  challenge.chars.each_with_index do |char, i|
    continue if repeat_numbers.include?(char)

    h[char] = numbers[i % numbers.length]
    repeat_numbers.push(i)
  end
  res = 0
  userresponse.chars.each { |c| res += h.fetch(c, 0) }
  res - decode_rand_base(challenge)
end
make_fail_challenge() click to toggle source
# File lib/geetest/sdk3.rb, line 92
def make_fail_challenge
  md5_encode(rand(99)) + md5_encode(rand(99))[0..2]
end
make_response_format(success = 1, challenge = nil) click to toggle source
# File lib/geetest/sdk3.rb, line 96
def make_response_format(success = 1, challenge = nil)
  {
    success: success,
    gt: @captcha_id,
    challenge: challenge || make_fail_challenge
  }.to_json
end
md5_encode(value) click to toggle source
# File lib/geetest/sdk3.rb, line 88
def md5_encode(value)
  ::Digest::MD5.hexdigest(value.to_s)
end
register(user_id) click to toggle source
# File lib/geetest/sdk3.rb, line 68
def register(user_id)
  challenge = register_challenge(user_id)
  if challenge.length == 32
    challenge = md5_encode([challenge, private_key].join)
    [1, challenge]
  else
    [0, make_fail_challenge]
  end
end
register_challenge(user_id) click to toggle source
# File lib/geetest/sdk3.rb, line 78
def register_challenge(user_id)
  register_url = %(#{API_HOST}#{API_REGISTER_PATH}?gt=#{captcha_id})
  register_url = %(#{register_url}&user_id=#{user_id}) if user_id

  response = ::Net::HTTP.get_response(URI(register_url))
  response.is_a?(Net::HTTPSuccess) ? response.body : ''
rescue => e
  e.message
end
validate_fail_image(ans, full_bg_index, img_grp_index) click to toggle source
# File lib/geetest/sdk3.rb, line 134
def validate_fail_image(ans, full_bg_index, img_grp_index)
  thread = 3
  full_bg_name = md5_encode(full_bg_index)[0..10]
  bg_name = md5_encode(img_grp_index)[10..20]

  answer_decode = 0.upto(9).map do |i|
    i.even? ? full_bg_name[i] : bg_name[i]
  end.join
  x_decode = answer_decode[4..-1]
  result = x_decode.to_i(16) % 200
  result = 40 if result < 40
  (ans - result).abs < thread
end