hidemyass 0.1.3 → 0.1.4
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.
- data/README.md +4 -5
- data/hidemyass.gemspec +3 -3
- data/lib/hidemyass.rb +63 -37
- data/lib/hidemyass/http.rb +12 -3
- data/lib/hidemyass/ip.rb +24 -9
- data/lib/hidemyass/version.rb +1 -1
- metadata +6 -6
data/README.md
CHANGED
@@ -31,8 +31,8 @@ Or install it yourself as:
|
|
31
31
|
response
|
32
32
|
=> #<Net::HTTPOK 200 OK readbody=true>
|
33
33
|
|
34
|
-
This method
|
35
|
-
If you want more control to follow redirections
|
34
|
+
This method will try successive proxies until one returns HTTPSuccess (2xx).
|
35
|
+
If you want more control (e.g. to follow redirections), you can retrieve the proxies list and connect manually
|
36
36
|
|
37
37
|
HideMyAss.proxies.each do |proxy|
|
38
38
|
response = Net::HTTP::Proxy(proxy[:host], proxy[:port]).start(@uri.host, @uri.port) do |http|
|
@@ -58,15 +58,14 @@ or simply run:
|
|
58
58
|
|
59
59
|
## Roadmap
|
60
60
|
|
61
|
-
*
|
62
|
-
* Get proxies from other pages
|
61
|
+
* Get proxies from all pages
|
63
62
|
* Improve tests suite
|
64
63
|
* Clean code and refactor
|
65
64
|
|
66
65
|
## Contributing
|
67
66
|
|
68
67
|
1. Fork it
|
69
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
68
|
+
2. Create your feature branch (`git checkout -b my-new-feature`), and make sure to include specs
|
70
69
|
3. Commit your changes (`git commit -am 'Added some feature'`)
|
71
70
|
4. Push to the branch (`git push origin my-new-feature`)
|
72
71
|
5. Create new Pull Request
|
data/hidemyass.gemspec
CHANGED
@@ -14,7 +14,7 @@ Gem::Specification.new do |gem|
|
|
14
14
|
gem.name = "hidemyass"
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = HideMyAss::VERSION
|
17
|
-
|
18
|
-
gem.add_dependency "nokogiri", "~> 1.5.
|
19
|
-
gem.add_development_dependency "rspec", "~> 2.
|
17
|
+
|
18
|
+
gem.add_dependency "nokogiri", "~> 1.5.6"
|
19
|
+
gem.add_development_dependency "rspec", "~> 2.13.0"
|
20
20
|
end
|
data/lib/hidemyass.rb
CHANGED
@@ -15,53 +15,74 @@ module HideMyAss
|
|
15
15
|
ENDPOINT = "http://hidemyass.com/proxy-list/".freeze
|
16
16
|
|
17
17
|
LOG_PREFIX = '** [hidemyass] '
|
18
|
-
|
19
|
-
HTTP_ERRORS = [Timeout::Error,
|
20
|
-
Errno::EINVAL,
|
21
|
-
Errno::ECONNRESET,
|
22
|
-
Errno::ECONNREFUSED,
|
23
|
-
Errno::ETIMEDOUT,
|
24
|
-
EOFError,
|
25
|
-
Net::HTTPBadResponse,
|
26
|
-
Net::HTTPHeaderSyntaxError,
|
27
|
-
Net::ProtocolError]
|
28
|
-
|
29
|
-
def self.options
|
30
|
-
@options ||= {
|
31
|
-
:log => true,
|
32
|
-
:local => false,
|
33
|
-
:clear_cache => false
|
34
|
-
}
|
35
|
-
end
|
36
18
|
|
19
|
+
HTTP_ERRORS = [
|
20
|
+
Timeout::Error,
|
21
|
+
Errno::EINVAL,
|
22
|
+
Errno::ECONNRESET,
|
23
|
+
Errno::ECONNREFUSED,
|
24
|
+
Errno::ETIMEDOUT,
|
25
|
+
EOFError,
|
26
|
+
Net::HTTPBadResponse,
|
27
|
+
Net::HTTPHeaderSyntaxError,
|
28
|
+
Net::ProtocolError
|
29
|
+
]
|
30
|
+
|
31
|
+
def self.options
|
32
|
+
@options ||= {
|
33
|
+
:log => true,
|
34
|
+
:local => false,
|
35
|
+
:clear_cache => false
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
# Clears cached proxies.
|
40
|
+
def self.clear_cache
|
41
|
+
@proxies = nil
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns HMA proxies.
|
37
45
|
def self.proxies
|
38
46
|
clear_cache if options[:clear_cache]
|
39
47
|
|
40
|
-
|
48
|
+
@proxies ||= begin
|
41
49
|
html = get_hma_body
|
42
|
-
end
|
43
50
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
+
html.xpath('//table[@id="listtable"]/tr').collect do |node|
|
52
|
+
ip = HideMyAss::IP.new(node.at_xpath('td[2]/span'))
|
53
|
+
next unless ip.valid?
|
54
|
+
{
|
55
|
+
host: ip.address,
|
56
|
+
port: node.at_xpath('td[3]').content.strip
|
57
|
+
}
|
58
|
+
end
|
51
59
|
end
|
52
60
|
end
|
53
|
-
|
54
|
-
def self.clear_cache
|
55
|
-
@proxies = nil
|
56
|
-
end
|
57
61
|
|
58
|
-
|
62
|
+
# Sets form data to support custom searches.
|
63
|
+
def self.form_data=(data)
|
64
|
+
@form_data = data if data
|
65
|
+
end
|
59
66
|
|
60
|
-
|
61
|
-
|
62
|
-
|
67
|
+
# Set form data for HMA search
|
68
|
+
#
|
69
|
+
# c[] - Countries
|
70
|
+
# p - Port. Defaults to all ports.
|
71
|
+
# pr[] - Protocol. 0..2 = HTTP, HTTPS, socks4/5
|
72
|
+
# a[] - Anonymity level. 0..4 = None, Low, Medium, High, High +KA
|
73
|
+
# sp[] - Speed. 0..2 = Slow, Medium, Fast.
|
74
|
+
# ct[] - Connection time. 0..2 = Slow, Medium, Fast
|
75
|
+
# s - Sort. 0..3 = Response time, Connection time, Country A-Z.
|
76
|
+
# o - Order. 0, 1 = DESC, ASC.
|
77
|
+
# pp - Per Page. 0..3 = 10, 25, 50, 100.
|
78
|
+
# sortBy - Sort by. Defaults to date.
|
79
|
+
#
|
80
|
+
# Returns form data hash.
|
81
|
+
def self.form_data
|
82
|
+
@form_data ||= {
|
83
|
+
"c[]" => ["Brazil", "Mexico", "United States"],
|
63
84
|
"p" => nil,
|
64
|
-
"pr[]" => [0,1
|
85
|
+
"pr[]" => [0,1],
|
65
86
|
"a[]" => [0,1,2,3],
|
66
87
|
"sp[]" => [2,3],
|
67
88
|
"ct[]" => [2,3],
|
@@ -70,8 +91,13 @@ module HideMyAss
|
|
70
91
|
"pp" => 2,
|
71
92
|
"sortBy" => "date"
|
72
93
|
}
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
73
97
|
|
74
|
-
|
98
|
+
# Returns HMA body as a Nokogiri HTML Document.
|
99
|
+
def self.get_hma_body
|
100
|
+
res = Net::HTTP.post_form(URI(ENDPOINT), form_data)
|
75
101
|
|
76
102
|
body = case res
|
77
103
|
when Net::HTTPSuccess then
|
data/lib/hidemyass/http.rb
CHANGED
@@ -1,13 +1,19 @@
|
|
1
|
+
# TODO: Hijack HTTP calls automatically
|
2
|
+
|
1
3
|
module HideMyAss
|
2
4
|
module HTTP
|
5
|
+
|
3
6
|
def HTTP.start(address, *arg, &block)
|
4
7
|
HideMyAss.log 'Connecting to ' + address + ' through:'
|
5
8
|
response = nil
|
6
|
-
|
9
|
+
|
7
10
|
if HideMyAss.options[:local]
|
8
11
|
begin
|
9
12
|
HideMyAss.log 'localhost...'
|
10
13
|
response = Net::HTTP.start(address, *arg, &block)
|
14
|
+
|
15
|
+
HideMyAss.log response.class.to_s
|
16
|
+
|
11
17
|
if response.class.ancestors.include?(Net::HTTPSuccess)
|
12
18
|
return response
|
13
19
|
end
|
@@ -15,12 +21,15 @@ module HideMyAss
|
|
15
21
|
HideMyAss.log error
|
16
22
|
end
|
17
23
|
end
|
18
|
-
|
24
|
+
|
19
25
|
HideMyAss.proxies.each do |proxy|
|
20
26
|
begin
|
21
27
|
HideMyAss.log proxy[:host] + ':' + proxy[:port]
|
22
|
-
response = Net::HTTP::Proxy(proxy[:host],
|
28
|
+
response = Net::HTTP::Proxy(proxy[:host],
|
29
|
+
proxy[:port]).start(address, *arg, &block)
|
30
|
+
|
23
31
|
HideMyAss.log response.class.to_s
|
32
|
+
|
24
33
|
if response.class.ancestors.include?(Net::HTTPSuccess)
|
25
34
|
return response
|
26
35
|
end
|
data/lib/hidemyass/ip.rb
CHANGED
@@ -1,19 +1,33 @@
|
|
1
|
+
# HideMyAss masks real IPs with CSS classes
|
2
|
+
# in order to prevent crawlers from grabbing them.
|
3
|
+
#
|
4
|
+
# Here we emulate what our browser does
|
5
|
+
# so we can get the real IP addresses.
|
6
|
+
|
1
7
|
module HideMyAss
|
2
8
|
class IP
|
3
|
-
|
4
9
|
attr_accessor :decoys, :address
|
5
|
-
|
10
|
+
|
6
11
|
VALID_TAGS = %w(span div text).freeze
|
7
|
-
|
12
|
+
|
8
13
|
def initialize(encoded_address)
|
9
|
-
|
14
|
+
# Select decoy CSS classes: those which result in a hidden element
|
15
|
+
@decoys = encoded_address.css("style").text.split("\n").
|
16
|
+
select {|style| style =~ /none/}
|
17
|
+
|
18
|
+
# Find enclosing IP elements
|
10
19
|
elements = encoded_address.children
|
20
|
+
|
21
|
+
# Process elements and get rid of those with decoy classes
|
11
22
|
decode(elements)
|
23
|
+
|
24
|
+
# Finally grab enclosing elements content, which is the real IP
|
12
25
|
@address = elements.map(&:content).join
|
13
|
-
|
14
26
|
self
|
15
27
|
end
|
16
|
-
|
28
|
+
|
29
|
+
# Receives an array of elements
|
30
|
+
# and removes those that are invisible.
|
17
31
|
def decode(elements)
|
18
32
|
elements.each do |element|
|
19
33
|
if !VALID_TAGS.include?(element.name) || (element["style"] && element["style"] =~ /none/)
|
@@ -23,14 +37,15 @@ module HideMyAss
|
|
23
37
|
end
|
24
38
|
end
|
25
39
|
end
|
26
|
-
|
40
|
+
|
41
|
+
# Make sure the IP has a valid format.
|
27
42
|
def valid?
|
28
43
|
address.split(".").reject(&:empty?).size == 4
|
29
44
|
end
|
30
|
-
|
45
|
+
|
31
46
|
def inspect
|
32
47
|
"#<#{self.class}> @address=#{address}>"
|
33
48
|
end
|
34
|
-
|
49
|
+
|
35
50
|
end # IP
|
36
51
|
end # HideMyAss
|
data/lib/hidemyass/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hidemyass
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-02-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 1.5.
|
21
|
+
version: 1.5.6
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 1.5.
|
29
|
+
version: 1.5.6
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: rspec
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -34,7 +34,7 @@ dependencies:
|
|
34
34
|
requirements:
|
35
35
|
- - ~>
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: 2.
|
37
|
+
version: 2.13.0
|
38
38
|
type: :development
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -42,7 +42,7 @@ dependencies:
|
|
42
42
|
requirements:
|
43
43
|
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: 2.
|
45
|
+
version: 2.13.0
|
46
46
|
description: Hide My Ass! fetches and connects to proxies at www.hidemyass.com
|
47
47
|
email:
|
48
48
|
- javier@tractical.com
|