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