rest-tor 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +2 -1
- data/README.md +104 -77
- data/lib/rest-tor.rb +13 -1
- data/lib/rest_tor/configuration.rb +24 -0
- data/lib/rest_tor/dispatcher.rb +1 -1
- data/lib/rest_tor/instance.rb +12 -11
- data/lib/rest_tor/strategy/restart.rb +1 -1
- data/lib/rest_tor/tor.rb +22 -26
- data/lib/rest_tor/utils.rb +2 -2
- data/lib/rest_tor/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a66c1d52d12d7e095cfd1c06e8c275468d93272
|
4
|
+
data.tar.gz: 03a50fdc74e6a84cfdf110005ede9eae7da3b9ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f4ac758c7cf4f12df10741936f0a2d069e5b1d926652473aae3fde612c21676a47b8f41b3b3d7a30becd56c2c8f40620cbbdfae530ea569a05e181711ebcd1a6
|
7
|
+
data.tar.gz: aa2b087b9e731387f816535c59b9a8f9f8350d77667ba13efb8260d1776362bc8bde93db44af12468f219f30cd499338bf7d552d76eb733dbf9fe6cb17901740
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -35,90 +35,117 @@ Or install it yourself as:
|
|
35
35
|
|
36
36
|
## Usage
|
37
37
|
|
38
|
+
#### SETUP
|
39
|
+
|
38
40
|
```ruby
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
end
|
62
|
-
Tor.request(url: '...', mode: :custom)
|
63
|
-
|
64
|
-
# show all instances
|
65
|
-
Tor.store.all
|
66
|
-
=> {"9001"=>#<Tor::Instance:0x007fb7798d2498 @port="9001", @ip="64.113.32.29", @using=nil, @counter=#<Counter success: 5, fail: 1, succss_at: 2017-12-15 19:52:44 +0800, fail_at:2017-12-15 19:52:26 +0800>>}
|
67
|
-
# Clear instances
|
68
|
-
Tor.clear
|
69
|
-
# Stop instance
|
70
|
-
Tor.stop(port)
|
71
|
-
|
72
|
-
# proxy default is true
|
73
|
-
Tor.request(url: 'http://ip.plusor.cn',raw: false, proxy: false)
|
74
|
-
[2017-12-16 16:19:34.545] [95646-70129455200740] Started GET "http://ip.plusor.cn" (port:rest-client | mode:default)
|
75
|
-
[2017-12-16 16:19:34.785] [95646-70129455200740] Completed 200 OK in 0.2s (Size: 15 Bytes)
|
76
|
-
=> "172.104.89.163\n"
|
77
|
-
|
78
|
-
# Initialize tors
|
79
|
-
Tor.init
|
80
|
-
I, [2017-12-15T20:40:36.189835 #60422] INFO -- : Open tor with port:9001
|
81
|
-
I, [2017-12-15T20:40:41.242452 #60422] INFO -- : Testing tor 9001
|
82
|
-
I, [2017-12-15T20:40:42.881857 #60422] INFO -- : IP: 163.172.67.180
|
83
|
-
I, [2017-12-15T20:40:42.882737 #60422] INFO -- : Open tor with port:9002
|
84
|
-
I, [2017-12-15T20:40:47.931555 #60422] INFO -- : Testing tor 9002
|
85
|
-
I, [2017-12-15T20:41:18.924004 #60422] INFO -- : IP: 155.4.230.97
|
86
|
-
I, [2017-12-15T20:41:18.925154 #60422] INFO -- : Open tor with port:9003
|
87
|
-
I, [2017-12-15T20:41:23.971647 #60422] INFO -- : Testing tor 9003
|
88
|
-
I, [2017-12-15T20:41:46.111952 #60422] INFO -- : IP: 46.17.97.112
|
89
|
-
I, [2017-12-15T20:41:46.112896 #60422] INFO -- : Open tor with port:9004
|
90
|
-
I, [2017-12-15T20:41:51.164009 #60422] INFO -- : Testing tor 9004
|
91
|
-
I, [2017-12-15T20:42:20.096998 #60422] INFO -- : IP: 109.201.133.100
|
92
|
-
I, [2017-12-15T20:42:20.097992 #60422] INFO -- : Open tor with port:9005
|
93
|
-
I, [2017-12-15T20:42:25.148808 #60422] INFO -- : Testing tor 9005
|
94
|
-
I, [2017-12-15T20:43:01.699053 #60422] INFO -- : IP: 62.210.129.246
|
95
|
-
I, [2017-12-15T20:43:01.700151 #60422] INFO -- : Open tor with port:9006
|
96
|
-
I, [2017-12-15T20:43:06.756239 #60422] INFO -- : Testing tor 9006
|
97
|
-
I, [2017-12-15T20:43:39.118469 #60422] INFO -- : IP: 163.172.160.182
|
98
|
-
I, [2017-12-15T20:43:39.119310 #60422] INFO -- : Open tor with port:9007
|
99
|
-
I, [2017-12-15T20:43:44.194975 #60422] INFO -- : Testing tor 9007
|
100
|
-
I, [2017-12-15T20:44:23.526274 #60422] INFO -- : IP: 89.144.12.14
|
101
|
-
I, [2017-12-15T20:44:23.527287 #60422] INFO -- : Open tor with port:9008
|
102
|
-
I, [2017-12-15T20:44:28.575018 #60422] INFO -- : Testing tor 9008
|
103
|
-
I, [2017-12-15T20:44:51.746405 #60422] INFO -- : IP: 195.22.126.147
|
104
|
-
I, [2017-12-15T20:44:51.747258 #60422] INFO -- : Open tor with port:9009
|
105
|
-
I, [2017-12-15T20:44:56.793446 #60422] INFO -- : Testing tor 9009
|
106
|
-
I, [2017-12-15T20:45:32.469774 #60422] INFO -- : IP: 62.210.129.246
|
107
|
-
I, [2017-12-15T20:45:32.470560 #60422] INFO -- : Open tor with port:9010
|
108
|
-
I, [2017-12-15T20:45:37.528114 #60422] INFO -- : Testing tor 9010
|
109
|
-
I, [2017-12-15T20:46:37.533066 #60422] INFO -- : Stop tor port:9010
|
110
|
-
I, [2017-12-15T20:46:37.533927 #60422] INFO -- : RestClient::Exceptions::OpenTimeout:Timed out connecting to server
|
111
|
-
I, [2017-12-15T20:46:37.534015 #60422] INFO -- : Open tor with port:9010
|
112
|
-
I, [2017-12-15T20:46:42.588824 #60422] INFO -- : Testing tor 9010
|
113
|
-
I, [2017-12-15T20:47:02.179464 #60422] INFO -- : IP: 173.254.216.66
|
41
|
+
# Default setup
|
42
|
+
Tor.setup do
|
43
|
+
config.count = 10, # Init count
|
44
|
+
config.port = 9000, # Listen port start with 9000
|
45
|
+
config.dir = Pathname.new('/tmp/tor'), #
|
46
|
+
config.ipApi = 'http://ip.plusor.cn/', # get tor ip
|
47
|
+
config.ipParser = -> (body) { body[/\d{,3}\.\d{,3}\.\d{,3}\.\d{,3}/] }, # get tor ip
|
48
|
+
config.command = -> (port) { "tor --RunAsDaemon 1 --CookieAuthentication 0 --HashedControlPassword \"\" --ControlPort auto --PidFile #{Tor.dir(port)}/tor.pid --SocksPort #{port} --DataDirectory #{Tor.dir(port)} --CircuitBuildTimeout 5 --KeepalivePeriod 60 --NewCircuitPeriod 15 --NumEntryGuards 8 --quiet" }
|
49
|
+
end
|
50
|
+
```
|
51
|
+
|
52
|
+
#### Tor.request Options
|
53
|
+
- `method` | Default get
|
54
|
+
- `url`. Request url
|
55
|
+
- `payload`. Request data
|
56
|
+
- `header` or `headers`. Default: `Tor::USER_AGENT`)
|
57
|
+
- `mobile`. Default is false. If true, use the Mobile-side User-Agent
|
58
|
+
- `proxy` Default use tor proxy. IF false, do not use proxy. You can specify proxy as `host:port`.
|
59
|
+
- `raw` Default true. The result is Nokogiri::HTML(req.body). If false, then req.body
|
60
|
+
- `format`. Default `html`. Avaliable formats: `html`, `json`, `string`.
|
61
|
+
- `mode` Default is `:default`.
|
62
|
+
- `timeout` Request timeout
|
114
63
|
|
64
|
+
|
65
|
+
```ruby
|
66
|
+
Tor.request(url: 'http://ip.plusor.cn/')
|
67
|
+
=> #<Nokogiri::HTML::Document:0x3fcd64ec6eb0 name="document" children=[#<Nokogiri::XML::DTD:0x3fcd64ec6af0 name="html">, #<Nokogiri::XML::Element:0x3fcd64ec67f8 name="html" children=[#<Nokogiri::XML::Element:0x3fcd64ec6618 name="body" children=[#<Nokogiri::XML::Element:0x3fcd64ec6438 name="p" children=[#<Nokogiri::XML::Text:0x3fcd64ec6258 "185.100.85.101\n">]>]>]>]>
|
68
|
+
|
69
|
+
Tor.request(url: 'http://ip.plusor.cn/', raw: false)
|
70
|
+
"64.113.32.29\n"
|
71
|
+
|
72
|
+
Tor.request(url: 'http://ip.plusor.cn/', mobile: true) # ..."User-Agent"=>"ANDROID_KFZ_COM_2.0.9_M6 Note_7.1.2"
|
73
|
+
Tor.request(url: 'http://ip.plusor.cn/') # ..."User-Agent"=>"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko)
|
74
|
+
|
75
|
+
Tor.request(method: :post, url: '...', format: :json, mobile: true)
|
76
|
+
=> {'hello' => 'world'}
|
77
|
+
|
78
|
+
Tor.request(url: '...', timeout: 10)
|
79
|
+
|
80
|
+
Tor.request(url: '...', mode: :default) # Priority to use the highest number of successes, default is :default
|
81
|
+
Tor.request(url: '...', mode: :order) # in order
|
82
|
+
|
83
|
+
# Customize an mode
|
84
|
+
Tor::Dispatcher.register :custom do
|
85
|
+
Tor.store.all.sort_by do |(port, tor)|
|
86
|
+
tor.c_success
|
87
|
+
end
|
88
|
+
end
|
89
|
+
Tor.request(url: '...', mode: :custom)
|
90
|
+
|
91
|
+
# show all instances
|
92
|
+
Tor.store.all
|
93
|
+
=> {"9001"=>#<Tor::Instance:0x007fb7798d2498 @port="9001", @ip="64.113.32.29", @using=nil, @counter=#<Counter success: 5, fail: 1, succss_at: 2017-12-15 19:52:44 +0800, fail_at:2017-12-15 19:52:26 +0800>>}
|
94
|
+
# Clear instances
|
95
|
+
Tor.clear
|
96
|
+
# Stop instance
|
97
|
+
Tor.stop(port)
|
98
|
+
|
99
|
+
# proxy default is true
|
100
|
+
Tor.request(url: 'http://ip.plusor.cn',raw: false, proxy: false)
|
101
|
+
[2017-12-16 16:19:34.545] [95646-70129455200740] Started GET "http://ip.plusor.cn" (port:rest-client | mode:default)
|
102
|
+
[2017-12-16 16:19:34.785] [95646-70129455200740] Completed 200 OK in 0.2s (Size: 15 Bytes)
|
103
|
+
=> "172.104.89.163\n"
|
104
|
+
|
105
|
+
# Initialize tors
|
106
|
+
Tor.init
|
107
|
+
I, [2017-12-15T20:40:36.189835 #60422] INFO -- : Open tor with port:9001
|
108
|
+
I, [2017-12-15T20:40:41.242452 #60422] INFO -- : Testing tor 9001
|
109
|
+
I, [2017-12-15T20:40:42.881857 #60422] INFO -- : IP: 163.172.67.180
|
110
|
+
I, [2017-12-15T20:40:42.882737 #60422] INFO -- : Open tor with port:9002
|
111
|
+
I, [2017-12-15T20:40:47.931555 #60422] INFO -- : Testing tor 9002
|
112
|
+
I, [2017-12-15T20:41:18.924004 #60422] INFO -- : IP: 155.4.230.97
|
113
|
+
I, [2017-12-15T20:41:18.925154 #60422] INFO -- : Open tor with port:9003
|
114
|
+
I, [2017-12-15T20:41:23.971647 #60422] INFO -- : Testing tor 9003
|
115
|
+
I, [2017-12-15T20:41:46.111952 #60422] INFO -- : IP: 46.17.97.112
|
116
|
+
I, [2017-12-15T20:41:46.112896 #60422] INFO -- : Open tor with port:9004
|
117
|
+
I, [2017-12-15T20:41:51.164009 #60422] INFO -- : Testing tor 9004
|
118
|
+
I, [2017-12-15T20:42:20.096998 #60422] INFO -- : IP: 109.201.133.100
|
119
|
+
I, [2017-12-15T20:42:20.097992 #60422] INFO -- : Open tor with port:9005
|
120
|
+
I, [2017-12-15T20:42:25.148808 #60422] INFO -- : Testing tor 9005
|
121
|
+
I, [2017-12-15T20:43:01.699053 #60422] INFO -- : IP: 62.210.129.246
|
122
|
+
I, [2017-12-15T20:43:01.700151 #60422] INFO -- : Open tor with port:9006
|
123
|
+
I, [2017-12-15T20:43:06.756239 #60422] INFO -- : Testing tor 9006
|
124
|
+
I, [2017-12-15T20:43:39.118469 #60422] INFO -- : IP: 163.172.160.182
|
125
|
+
I, [2017-12-15T20:43:39.119310 #60422] INFO -- : Open tor with port:9007
|
126
|
+
I, [2017-12-15T20:43:44.194975 #60422] INFO -- : Testing tor 9007
|
127
|
+
I, [2017-12-15T20:44:23.526274 #60422] INFO -- : IP: 89.144.12.14
|
128
|
+
I, [2017-12-15T20:44:23.527287 #60422] INFO -- : Open tor with port:9008
|
129
|
+
I, [2017-12-15T20:44:28.575018 #60422] INFO -- : Testing tor 9008
|
130
|
+
I, [2017-12-15T20:44:51.746405 #60422] INFO -- : IP: 195.22.126.147
|
131
|
+
I, [2017-12-15T20:44:51.747258 #60422] INFO -- : Open tor with port:9009
|
132
|
+
I, [2017-12-15T20:44:56.793446 #60422] INFO -- : Testing tor 9009
|
133
|
+
I, [2017-12-15T20:45:32.469774 #60422] INFO -- : IP: 62.210.129.246
|
134
|
+
I, [2017-12-15T20:45:32.470560 #60422] INFO -- : Open tor with port:9010
|
135
|
+
I, [2017-12-15T20:45:37.528114 #60422] INFO -- : Testing tor 9010
|
136
|
+
I, [2017-12-15T20:46:37.533066 #60422] INFO -- : Stop tor port:9010
|
137
|
+
I, [2017-12-15T20:46:37.533927 #60422] INFO -- : RestClient::Exceptions::OpenTimeout:Timed out connecting to server
|
138
|
+
I, [2017-12-15T20:46:37.534015 #60422] INFO -- : Open tor with port:9010
|
139
|
+
I, [2017-12-15T20:46:42.588824 #60422] INFO -- : Testing tor 9010
|
140
|
+
I, [2017-12-15T20:47:02.179464 #60422] INFO -- : IP: 173.254.216.66
|
115
141
|
```
|
116
142
|
|
117
143
|
## TODO
|
118
144
|
|
119
145
|
- Test
|
120
146
|
- Optimization code
|
121
|
-
-
|
147
|
+
- Configurable http client
|
148
|
+
- Add chrome headless
|
122
149
|
- Configurable restart strategy
|
123
150
|
|
124
151
|
## Development
|
@@ -129,7 +156,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
129
156
|
|
130
157
|
## Contributing
|
131
158
|
|
132
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
159
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/plusor/rest-tor. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
133
160
|
|
134
161
|
|
135
162
|
## License
|
data/lib/rest-tor.rb
CHANGED
@@ -7,10 +7,22 @@ Dir.glob(File.expand_path('../rest_tor/**/*.rb', __FILE__)).each { |file| requir
|
|
7
7
|
|
8
8
|
module Tor
|
9
9
|
def self.logger
|
10
|
-
Logger.new(STDOUT).tap do |log|
|
10
|
+
@logger ||= Logger.new(STDOUT).tap do |log|
|
11
11
|
log.formatter = proc do |severity, datetime, progname, msg|
|
12
12
|
"[#{datetime.strftime('%Y-%m-%d %H:%M:%S.%3N')}] [#{Process.pid}-#{Thread.current.object_id}] #{msg}\n"
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
16
|
+
|
17
|
+
def self.logger=(log)
|
18
|
+
@logger = log
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.setup(&block)
|
22
|
+
instance_exec(&block)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.config
|
26
|
+
@config ||= Configuration.new
|
27
|
+
end
|
16
28
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Tor
|
2
|
+
class Configuration
|
3
|
+
def initialize
|
4
|
+
@config = {
|
5
|
+
count: 10, # Init count
|
6
|
+
port: 9000, # Listen port start with 9000
|
7
|
+
dir: Pathname.new('/tmp/tor'), #
|
8
|
+
ipApi: 'http://ip.plusor.cn/',
|
9
|
+
ipParser: ->(body) { body[/\d{,3}\.\d{,3}\.\d{,3}\.\d{,3}/] },
|
10
|
+
command: -> (port) { "tor --RunAsDaemon 1 --CookieAuthentication 0 --HashedControlPassword \"\" --ControlPort auto --PidFile #{Tor.dir(port)}/tor.pid --SocksPort #{port} --DataDirectory #{Tor.dir(port)} --CircuitBuildTimeout 5 --KeepalivePeriod 60 --NewCircuitPeriod 15 --NumEntryGuards 8 --quiet" }
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
def method_missing(method_id, *args, &block)
|
15
|
+
if /(?<name>.*?)=$/ =~ method_id.to_s
|
16
|
+
@config[:"#{name}"] = args.first
|
17
|
+
elsif @config.key?(:"#{method_id}")
|
18
|
+
@config[:"#{method_id}"]
|
19
|
+
else
|
20
|
+
super
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/rest_tor/dispatcher.rb
CHANGED
@@ -12,7 +12,7 @@ module Tor
|
|
12
12
|
Tor.lock("tor:pick", expires: 10) do
|
13
13
|
port, tor = run(mode)
|
14
14
|
if port.blank? || tor.blank?
|
15
|
-
port, _ = Tor.store.max {|a,b | a[0] <=> b[0] } || Tor
|
15
|
+
port, _ = Tor.store.max {|a,b | a[0] <=> b[0] } || Tor.config.port
|
16
16
|
tor = Tor.listen(port=port.next)
|
17
17
|
end
|
18
18
|
return [port, tor]
|
data/lib/rest_tor/instance.rb
CHANGED
@@ -6,7 +6,7 @@ module Tor
|
|
6
6
|
include Strategy::Restart
|
7
7
|
extend Forwardable
|
8
8
|
|
9
|
-
ATTRS = %i(ip port using counter)
|
9
|
+
ATTRS = %i(ip port using counter created_at)
|
10
10
|
|
11
11
|
attr_accessor *ATTRS
|
12
12
|
|
@@ -14,22 +14,23 @@ module Tor
|
|
14
14
|
def_delegator :@counter, :success, :c_success
|
15
15
|
def_delegator :@counter, :fail, :c_fail
|
16
16
|
|
17
|
-
def initialize(port, ip: nil, using: nil, counter: nil)
|
18
|
-
@port
|
19
|
-
@ip
|
20
|
-
@using
|
21
|
-
@counter= Counter.new(self, counter || {})
|
17
|
+
def initialize(port, ip: nil, using: nil, counter: nil, created_at: Time.now)
|
18
|
+
@port = port
|
19
|
+
@ip = ip
|
20
|
+
@using = using
|
21
|
+
@counter = Counter.new(self, counter || {})
|
22
|
+
@created_at = created_at
|
22
23
|
end
|
23
24
|
|
24
25
|
def pid
|
25
|
-
path = Tor
|
26
|
+
path = Tor.config.dir.join("#{port}/tor.pid")
|
26
27
|
if File.exists?(path)
|
27
28
|
File.read(path).chomp.to_i
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
31
32
|
def attributes
|
32
|
-
{ ip: @ip, port: @port, using: @using, counter: @counter.to_h }
|
33
|
+
{ ip: @ip, port: @port, using: @using, counter: @counter.to_h, created_at: @created_at }
|
33
34
|
end
|
34
35
|
|
35
36
|
ATTRS.each do |name|
|
@@ -48,7 +49,7 @@ module Tor
|
|
48
49
|
self.using = nil
|
49
50
|
|
50
51
|
if Tor.locked?("#{port}:restart")
|
51
|
-
logger.info "The tor(#{port}) already processing!"
|
52
|
+
Tor.logger.info "The tor(#{port}) already processing!"
|
52
53
|
else
|
53
54
|
if error=died?
|
54
55
|
restart!("Died(#{error})")
|
@@ -58,7 +59,7 @@ module Tor
|
|
58
59
|
end
|
59
60
|
|
60
61
|
def restart!(message="")
|
61
|
-
logger.info "#{message} Restart => #{ip}:#{port}"
|
62
|
+
Tor.logger.info "#{message} Restart => #{ip}:#{port}"
|
62
63
|
Tor.restart(port)
|
63
64
|
end
|
64
65
|
|
@@ -79,7 +80,7 @@ module Tor
|
|
79
80
|
def apply(&block)
|
80
81
|
Tor.lock("tor:#{port}:update", expires: 1.minutes) do
|
81
82
|
if not Tor.store.has_key?(port)
|
82
|
-
logger.info "Has been destroyed"
|
83
|
+
Tor.logger.info "Has been destroyed"
|
83
84
|
return
|
84
85
|
end
|
85
86
|
if block_given?
|
data/lib/rest_tor/tor.rb
CHANGED
@@ -8,14 +8,11 @@ module Tor extend self
|
|
8
8
|
class InvalidFormat < Error; end
|
9
9
|
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
|
10
10
|
MOBILE_AGENT = 'ANDROID_KFZ_COM_2.0.9_M6 Note_7.1.2'
|
11
|
-
TOR_COUNT = 10
|
12
|
-
TOR_PORT_START_WITH = 9000
|
13
|
-
TOR_DIR = Pathname.new('/tmp/tor')
|
14
11
|
|
15
12
|
def init
|
16
13
|
lock("tor:init", expires: 1.minutes) do
|
17
14
|
threads = []
|
18
|
-
|
15
|
+
config.count.times { |i| threads << Thread.new { listen(config.port + i + 1) } }
|
19
16
|
threads.map(&:join)
|
20
17
|
end
|
21
18
|
end
|
@@ -46,6 +43,7 @@ module Tor extend self
|
|
46
43
|
url = options[:url]
|
47
44
|
mobile = options[:mobile]
|
48
45
|
proxy = options[:proxy]
|
46
|
+
proxy = nil if proxy == true
|
49
47
|
raw = options[:raw].nil? ? true : false
|
50
48
|
mode = options[:mode] || :default
|
51
49
|
method = options[:method] || :get
|
@@ -55,9 +53,10 @@ module Tor extend self
|
|
55
53
|
headers = options[:headers] || options[:header] || {}
|
56
54
|
default_header = { 'User-Agent' => mobile ? MOBILE_AGENT : USER_AGENT }
|
57
55
|
time, body = Time.now, nil
|
58
|
-
rest = proxy
|
56
|
+
rest = proxy != nil
|
59
57
|
|
60
58
|
hold_tor(mode: mode, rest: rest) do |port, tor|
|
59
|
+
Thread.current[:tor] = tor if tor.present?
|
61
60
|
|
62
61
|
proxy ||= "socks5://127.0.0.1:#{port}" if not rest
|
63
62
|
|
@@ -74,15 +73,19 @@ module Tor extend self
|
|
74
73
|
|
75
74
|
begin
|
76
75
|
response = RestClient::Request.execute(params) do |res, req, headers|
|
77
|
-
|
78
|
-
|
76
|
+
if res.code == 302
|
77
|
+
res.follow_redirection
|
78
|
+
else
|
79
|
+
yield(res, req, headers ) if block_given?
|
80
|
+
res
|
81
|
+
end
|
79
82
|
end
|
80
83
|
tor&.success!
|
81
84
|
body = response.body
|
82
|
-
logger.info "Completed #{response.try(:code)} OK in #{(Time.now-time).round(1)}s (
|
85
|
+
logger.info "Completed #{response.try(:code)} OK in #{(Time.now-time).round(1)}s (size: #{Utils.number_to_human_size(body.bytesize)})"
|
83
86
|
rescue Exception => e
|
84
|
-
tor.fail!(e)
|
85
87
|
if tor
|
88
|
+
tor.fail!(e)
|
86
89
|
logger.info "#{e.class}: #{e.message}, <Tor#(success: #{tor.counter.success}, fail: #{tor.counter.fail}, port: #{tor.port})>"
|
87
90
|
end
|
88
91
|
raise e
|
@@ -103,7 +106,7 @@ module Tor extend self
|
|
103
106
|
if instance && instance.pid
|
104
107
|
Process.kill("KILL", instance.pid)
|
105
108
|
end
|
106
|
-
FileUtils.rm_rf(
|
109
|
+
FileUtils.rm_rf dir(port)
|
107
110
|
rescue Exception
|
108
111
|
|
109
112
|
ensure
|
@@ -115,13 +118,8 @@ module Tor extend self
|
|
115
118
|
|
116
119
|
logger.info "Open tor with port:#{port}"
|
117
120
|
|
118
|
-
|
121
|
+
system config.command.call(port)
|
119
122
|
|
120
|
-
tor = 'tor --RunAsDaemon 1 --CookieAuthentication 0 --HashedControlPassword ""'
|
121
|
-
tor+= " --ControlPort #{ control_port } --PidFile tor.pid --SocksPort #{port} --DataDirectory #{dir(port)}"
|
122
|
-
tor+= " --CircuitBuildTimeout 5 --KeepalivePeriod 60 --NewCircuitPeriod 15 --NumEntryGuards 8"# make tor faster
|
123
|
-
tor+= " --quiet" # unless Rails.env.production?
|
124
|
-
system tor
|
125
123
|
if ip=test(port)
|
126
124
|
store.insert(port, ip)
|
127
125
|
else
|
@@ -143,7 +141,7 @@ module Tor extend self
|
|
143
141
|
end
|
144
142
|
|
145
143
|
def dir(port)
|
146
|
-
|
144
|
+
config.dir.join("#{port}").tap do |dir|
|
147
145
|
FileUtils.mkpath(dir) if not Dir.exists?(dir)
|
148
146
|
end
|
149
147
|
end
|
@@ -151,11 +149,9 @@ module Tor extend self
|
|
151
149
|
def test(port)
|
152
150
|
logger.info "Testing tor #{port}"
|
153
151
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
req.body.chomp.tap do |body|
|
158
|
-
logger.info " IP: #{body} "
|
152
|
+
req = RestClient::Request.execute({method: :get, url: config.ipApi, proxy: "socks5://127.0.0.1:#{port}"})
|
153
|
+
config.ipParser.call(req.body).tap do |ip|
|
154
|
+
logger.info " IP: #{ip} "
|
159
155
|
end
|
160
156
|
rescue Net::OpenTimeout, Net::ReadTimeout, Errno::ECONNREFUSED, SOCKSError, SOCKSError::TTLExpired, Errno::ECONNRESET => e
|
161
157
|
logger.error "#{e.class}: #{e.message}"
|
@@ -163,20 +159,20 @@ module Tor extend self
|
|
163
159
|
end
|
164
160
|
|
165
161
|
def clear
|
166
|
-
Dir.glob(
|
162
|
+
Dir.glob(config.dir.join("**/*.pid")).each do |path|
|
167
163
|
begin
|
168
164
|
Process.kill("KILL", File.read(path).chomp.to_i)
|
169
165
|
rescue Errno::ESRCH
|
170
166
|
end
|
171
167
|
end
|
172
|
-
FileUtils.rm_rf(
|
168
|
+
FileUtils.rm_rf(config.dir)
|
173
169
|
true
|
174
170
|
ensure
|
175
171
|
store.clear
|
176
172
|
end
|
177
173
|
|
178
174
|
def count
|
179
|
-
Dir.glob(
|
175
|
+
Dir.glob(config.dir.join("*")).count
|
180
176
|
end
|
181
177
|
|
182
178
|
def unused
|
@@ -202,7 +198,7 @@ module Tor extend self
|
|
202
198
|
private
|
203
199
|
def safe_value(value)
|
204
200
|
counter = value.try(:[], :counter) || {}
|
205
|
-
value.slice(*[:ip, :using]).merge({
|
201
|
+
value.slice(*[:ip, :using, :created_at]).merge({
|
206
202
|
counter: counter.slice(*[:success, :fail, :success_at, :fail_at, :errors])
|
207
203
|
})
|
208
204
|
rescue NoMethodError => e
|
data/lib/rest_tor/utils.rb
CHANGED
@@ -3,7 +3,7 @@ module Tor
|
|
3
3
|
def to_json(body)
|
4
4
|
JSON.parse(body)
|
5
5
|
rescue Exception => e
|
6
|
-
logger.info "#{e.class}:#{e.message}"
|
6
|
+
Tor.logger.info "#{e.class}:#{e.message} (Tor.request)"
|
7
7
|
{}
|
8
8
|
end
|
9
9
|
|
@@ -18,7 +18,7 @@ module Tor
|
|
18
18
|
begin
|
19
19
|
body = body.dup.force_encoding(encode).encode("utf-8", invalid: :replace, under: :replace)
|
20
20
|
rescue Exception => e
|
21
|
-
logger.info "#{e.class}:#{e.message}(Tor.request)"
|
21
|
+
Tor.logger.info "#{e.class}:#{e.message} (Tor.request)"
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
data/lib/rest_tor/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rest-tor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- plusor
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-02-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -140,6 +140,7 @@ files:
|
|
140
140
|
- bin/console
|
141
141
|
- bin/setup
|
142
142
|
- lib/rest-tor.rb
|
143
|
+
- lib/rest_tor/configuration.rb
|
143
144
|
- lib/rest_tor/dispatcher.rb
|
144
145
|
- lib/rest_tor/instance.rb
|
145
146
|
- lib/rest_tor/lock.rb
|