captcha_solver 0.0.0 → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e743c791b57afa3177c397002fbfa68dba8444db82cbbb367293b33c14860e5
4
- data.tar.gz: fbd39e1a8353457b6096d325cc99de5608e3756a8b9c4c59a0061b1056d04658
3
+ metadata.gz: c68a176a0bea62b9ed9ad44216fbb01742fe840231ae43ae6cae8fe2ee4fa79a
4
+ data.tar.gz: 7734c4328709d80aa40926ba093d152abb376ff9daa3d09f0bbaf339fad653fd
5
5
  SHA512:
6
- metadata.gz: f626b3caaf01e09647a3f39090570f91005eb58ac9eeba3532ce7e1bf8a544aedb4884fd340955a0791ad47d3a51841e254381d0b04140307dcb993f5056aeef
7
- data.tar.gz: f3e501431399bf8d8f624cffc5dba4662ea943ba988111981fd872a15b798ea77fe4358434e7baea09de2f0df83e6485a54464867726a1e62ce58183106b94dd
6
+ metadata.gz: 39bf770938486d5c7d3078fe0f483755cf62d3349ff81f7f8bcccbf65c836987a760109aed5aa790af9a58b640e8022d0109a20fd00daab07f41a3287fa21771
7
+ data.tar.gz: dd6786cb112b2c7f005ca4cf895b87d92af779c92ffc9281d6a355ef4d42245f4282b4ab76370ae0dcc68a7ad9b5f1c02956772f78bd2d6ddad42a734c9ab4af
@@ -1,2 +1,4 @@
1
+ require 'captcha_solver/base'
2
+
1
3
  module CaptchaSolver
2
4
  end
@@ -0,0 +1,129 @@
1
+ require 'json'
2
+
3
+ module CaptchaSolver
4
+ class Base
5
+ class NotStartedError < StandardError; end
6
+ class FailedError < StandardError; end
7
+ class NotSolvedError < StandardError; end
8
+
9
+ TIMEOUTS_BETWEEN_ATTEMPTS = [40, 40, 40, 40, 40]
10
+
11
+ attr_reader :rucaptcha_api_key, :proxy_address,
12
+ :start_response, :complete_response
13
+
14
+ def initialize(args)
15
+ @rucaptcha_api_key = ENV['rucaptcha_api_key']
16
+ @proxy_address = args[:proxy_address]
17
+ end
18
+
19
+ # 1. Makes a in.php request in order to get the rucaptcha id.
20
+ # 2. Waits for 40 seconds, so the captcha can be solved by that time.
21
+ # 3. Makes a res.php request in order to get the solved captcha.
22
+ # 4. If captcha is not solved, it tries to do the same 4 more times.
23
+ def solve
24
+ start
25
+ raise NotStartedError.new(start_response&.body) unless started?
26
+
27
+ TIMEOUTS_BETWEEN_ATTEMPTS.each do |seconds|
28
+ wait_for(seconds)
29
+
30
+ complete
31
+
32
+ raise FailedError.new(complete_response&.body) if failed?
33
+ return solved_captcha if solved?
34
+ end
35
+
36
+ raise NotSolvedError.new(complete_response&.body)
37
+ end
38
+
39
+ # Returns solved captcha
40
+ def solved_captcha
41
+ return nil unless solved?
42
+ captcha_value
43
+ end
44
+
45
+ private
46
+
47
+ # Headers that have to be passed in each request. Use it in the child class
48
+ def default_request_headers
49
+ { 'Accept' => 'application/json', 'Content-Type' => 'application/x-www-form-urlencoded' }
50
+ end
51
+
52
+ # Params that have to be passed in each request. Use it in the child class
53
+ def default_request_params
54
+ { key: rucaptcha_api_key, json: 1 }
55
+ end
56
+
57
+ # Makes a in.php request. Response must be returned as JSON
58
+ def make_start_request
59
+ raise NotImplementedError.new('#make_start_request method must be implemented')
60
+ end
61
+
62
+ # Calls #make_start_request and saves the result in @start_response
63
+ def start
64
+ @start_response = make_start_request
65
+ end
66
+
67
+ # Parses response from in.php request and returns rucaptcha id
68
+ def rucaptcha_id
69
+ return nil if start_response.blank?
70
+ JSON.parse(start_response.body)['request']
71
+ end
72
+
73
+ # Checks if a in.php request is successful
74
+ def started?
75
+ return false if start_response.blank?
76
+ return false if errors_regexp.match?(start_response.body)
77
+ rucaptcha_id.present?
78
+ end
79
+
80
+ # Makes a res.php request. Response must be returned as JSON
81
+ def make_complete_request
82
+ raise NotImplementedError.new('#make_complete_request method must be implemented')
83
+ end
84
+
85
+ # Calls #make_complete_request and saves the result in @complete_response
86
+ def complete
87
+ return nil unless started?
88
+ @complete_response = make_complete_request
89
+ end
90
+
91
+ # Checks if captcha solving is failed
92
+ def failed?
93
+ return false if complete_response.blank?
94
+ errors_regexp.match? complete_response.body
95
+ end
96
+
97
+ # Checks if captcha is solved
98
+ def solved?
99
+ return false if complete_response.blank?
100
+ return false if failed?
101
+ !not_ready_regexp.match?(complete_response.body) && captcha_value.present?
102
+ end
103
+
104
+ # Parses response from res.php request and returns captcha value
105
+ def captcha_value
106
+ JSON.parse(complete_response.body)['request']
107
+ end
108
+
109
+ # The error that is returned by res.php request if captcha is not solved yet
110
+ def not_ready_regexp
111
+ /CAPCHA_NOT_READY/i
112
+ end
113
+
114
+ # Any error that might be returned by in.php or res.php request
115
+ def errors_regexp
116
+ /(ERROR|BANNED|MAX_USER_TURN|REPORT_NOT_RECORDED)/i
117
+ end
118
+
119
+ # Makes a delay between requests
120
+ def wait_for(seconds)
121
+ puts "Waiting for #{seconds} seconds"
122
+ seconds.times do |i|
123
+ sleep(1)
124
+ print '.'
125
+ end
126
+ puts
127
+ end
128
+ end
129
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: captcha_solver
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Randi Korhonen
@@ -17,7 +17,8 @@ extensions: []
17
17
  extra_rdoc_files: []
18
18
  files:
19
19
  - lib/captcha_solver.rb
20
- homepage: http://rubygems.org/gems/captcha_solver
20
+ - lib/captcha_solver/base.rb
21
+ homepage: https://github.com/randikorhonen/captcha_solver
21
22
  licenses:
22
23
  - MIT
23
24
  metadata: {}