captchatrader 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,3 @@
1
+ == 0.0.1 (2011-06-29)
2
+
3
+ * First working release of credits, submit and respond actions
@@ -0,0 +1,65 @@
1
+ captchatrader
2
+ =============
3
+
4
+ Ruby bindings for the captchatrader.com API. Submit captcha images and retrieve the text as a string.
5
+
6
+
7
+ Features
8
+ --------
9
+
10
+ * Submit capture images and retrieve the text
11
+ * Notify server if text is correct to prevent charging credits on incorrectly detected captchas
12
+ * Retrieve amount of credits left
13
+
14
+ Usage
15
+ --------
16
+
17
+ Captchatrader::API.username = "your-username"
18
+ Captchatrader::API.password = "your-password-or-passkey"
19
+ Captchatrader::API.api_key = "your-applications-api-key"
20
+
21
+ # Submit a capture image to retrieve the text
22
+ captcha = Captchatrader::API.submit("http://example.com/link-to-image.jpg", :url)
23
+ puts captcha.value # => "capture text"
24
+
25
+ # Tell the server that this captcha has been detected incorrectly (prevent charging credits)
26
+ Captchatrader::API.respond(captcha.ticket, false) # true
27
+
28
+ # Credits left for this username
29
+ Captchatrader::API.credits # => 90
30
+
31
+ Install
32
+ -------
33
+
34
+ gem install capturetrader
35
+
36
+ Requirements
37
+ ------------
38
+
39
+ * None (only Mocha for running tests)
40
+
41
+ License
42
+ -------
43
+
44
+ The MIT License
45
+
46
+ Copyright (c) 2011 Dennis Theisen
47
+
48
+ Permission is hereby granted, free of charge, to any person obtaining
49
+ a copy of this software and associated documentation files (the
50
+ 'Software'), to deal in the Software without restriction, including
51
+ without limitation the rights to use, copy, modify, merge, publish,
52
+ distribute, sublicense, and/or sell copies of the Software, and to
53
+ permit persons to whom the Software is furnished to do so, subject to
54
+ the following conditions:
55
+
56
+ The above copyright notice and this permission notice shall be
57
+ included in all copies or substantial portions of the Software.
58
+
59
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
60
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
61
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
62
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
63
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
64
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
65
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,11 @@
1
+ require 'net/http'
2
+
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + "/captchatrader")
4
+
5
+ require 'error'
6
+ require 'submission'
7
+ require 'api'
8
+
9
+ module Captchatrader
10
+ VERSION = File.read(File.dirname(__FILE__) + "/../version.txt")
11
+ end
@@ -0,0 +1,79 @@
1
+ module Captchatrader
2
+ module API
3
+ extend self
4
+
5
+ BASE_URL = "http://api.captchatrader.com"
6
+ SUBMIT_TYPES = [:url, :file]
7
+
8
+ attr_accessor :username, :password, :api_key
9
+
10
+ def submit(image, type, match = nil)
11
+ raise ArgumentError, "type must be one of #{SUBMIT_TYPES.join(', ')}" unless SUBMIT_TYPES.include?(type.to_sym)
12
+
13
+ params = {
14
+ :value => image,
15
+ :type => type,
16
+ :api_key => API.api_key,
17
+ :username => API.username,
18
+ :password => API.password
19
+ }
20
+ params[:match] = match if match
21
+
22
+ response = post("#{BASE_URL}/submit", params)
23
+ parse_response(response, :submit, :image => image)
24
+ end
25
+
26
+ def respond(ticket, correct)
27
+ params = {
28
+ :ticket => ticket,
29
+ :is_correct => correct,
30
+ :username => API.username,
31
+ :password => API.password
32
+ }
33
+ response = post("#{BASE_URL}/respond", params)
34
+ parse_response(response, :respond)
35
+ end
36
+
37
+ def credits
38
+ response = get("#{BASE_URL}/get_credits/username:#{API.username}/password:#{API.password}/")
39
+ parse_response(response, :credits)
40
+ end
41
+
42
+
43
+ private
44
+
45
+ def get(url)
46
+ url = URI.parse(url)
47
+ response = Net::HTTP.start(url.host, url.port) do |http|
48
+ http.get(url.request_uri)
49
+ end
50
+ response.body
51
+ end
52
+
53
+ def post(url, params)
54
+ url = URI.parse(url)
55
+ post = Net::HTTP::Post.new(url.request_uri)
56
+ post.set_form_data(params)
57
+ response = Net::HTTP.start(url.host, url.port) do |http|
58
+ http.request(post)
59
+ end
60
+ response.body
61
+ end
62
+
63
+ def parse_response(response, type, options = {})
64
+ raise API::Error, "Unexpected response from captchatrader: #{response}" unless response =~ /\A\[.+\]\z/
65
+
66
+ code, details = response[1..-2].split(/ *, */)
67
+ raise API::Error, details.to_s[1..-2] if code.to_i == -1
68
+
69
+ case type
70
+ when :credits
71
+ details.to_i
72
+ when :submit
73
+ Submission.new(details.to_s[1..-2], code.to_i, options[:image])
74
+ when :respond
75
+ code.to_i == 0
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,23 @@
1
+ module Captchatrader
2
+ module API
3
+
4
+ class Error < StandardError
5
+ # submit
6
+ API_KEY_DISABLED = "The API key has been disabled, likely because it is not responding to CAPTCHAs correctly or is submitting too quickly"
7
+ INSUFFICIENT_CREDITS = "The account provided does not have enough credits to complete the request"
8
+ INTERNAL_ERROR = "The server encountered an unexpected situation and the request was aborted"
9
+ INVALID_API_KEY = "The API key provided was not registered"
10
+ INVALID_PARAMETERS = "The request was not submitted correctly"
11
+ INVALID_TYPE = "The type argument was invalid"
12
+ INVALID_USER = "The username/password combination was incorrect"
13
+ USER_NOT_VALIDATED = "The user has not been validated or is banned"
14
+ NOT_AN_IMAGE = "The file or url uploaded was not detected to be a valid image"
15
+ SUBMISSION_ERROR = "An error occurred in the file upload"
16
+
17
+ # respond
18
+ INCORRECT_REPORTS = "Too many negative responses were submitted in a short time frame"
19
+ INVALID_TICKET = "The type argument was invalid"
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,12 @@
1
+ module Captchatrader
2
+ module API
3
+
4
+ # Holds responses for captcha submissions
5
+ class Submission < Struct.new(:value, :ticket, :image)
6
+ def to_s
7
+ value
8
+ end
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1 @@
1
+ 0.1.0
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: captchatrader
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Dennis Theisen
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-06-29 00:00:00 -04:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description: Submit captcha images and retrieve the text as a string.
23
+ email: soleone@gmail.com
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files: []
29
+
30
+ files:
31
+ - Changelog.md
32
+ - README.md
33
+ - version.txt
34
+ - lib/captchatrader/api.rb
35
+ - lib/captchatrader/error.rb
36
+ - lib/captchatrader/submission.rb
37
+ - lib/captchatrader.rb
38
+ has_rdoc: true
39
+ homepage: http://github.com/Soleone/captchatrader
40
+ licenses: []
41
+
42
+ post_install_message:
43
+ rdoc_options: []
44
+
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ hash: 3
53
+ segments:
54
+ - 0
55
+ version: "0"
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ hash: 3
62
+ segments:
63
+ - 0
64
+ version: "0"
65
+ requirements: []
66
+
67
+ rubyforge_project:
68
+ rubygems_version: 1.3.7
69
+ signing_key:
70
+ specification_version: 3
71
+ summary: Ruby bindings for the captchatrader.com API.
72
+ test_files: []
73
+