rest-tor 0.1.6 → 0.1.7
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 +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
|