proxy_pool 0.1.3 → 0.2.0

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: 91b8f68f49e945f8138a4b44898cabec2e0c547d266c8f1fa3bee4f812834123
4
- data.tar.gz: a140daaf608931a1f02c003ff95c2a39b634a1bd90e23d0f785c9dd51a8a5f43
3
+ metadata.gz: b683e7a0cfd44068402a78d7944ebd8753c74ca3e513ef800ab764a4d5f8612e
4
+ data.tar.gz: 4fbe67c2a42da997920db4f4e8d908a2f37f5d6be33e7e68b53e025a18d6584d
5
5
  SHA512:
6
- metadata.gz: 85e6ddfacd502eebf0b9c75538e621342f447f222e13915228bfc073aa0a5cced67d0aeac4ad2ed3799c3c5b892bdb19f0907ee4ef6aef259ff8e29413b4932b
7
- data.tar.gz: cbc1f7cd40f2d368bb0eeab63a9749ae896fa1895d8f09ffa0c01dbea570b4ebc774f384d39d0016717bb7bdfabb39baac9db9974f9979ad3adbb7e5202ef2ba
6
+ metadata.gz: ee5a0612c6f1833115dfa06ac3ea58d66452b305c07fa317e29fbbe134727da3415cc06e99ea200188f72ffca8f3e1391d67574e33a4ef456febdd33d0120c05
7
+ data.tar.gz: 6282dfc302b006c8e2454e04d7bedf7bf715be3c4bfdc2398ec81f2cb446f5e8090a3da98a92651f42b54928bf6aa057fbcc4aee215ed768232f543d90a01f57
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-2.6.3
1
+ ruby-2.7.0
data/Gemfile CHANGED
@@ -1,4 +1,6 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in proxy_pool.gemspec
4
6
  gemspec
data/Gemfile.lock CHANGED
@@ -1,31 +1,36 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- proxy_pool (0.1.0)
5
- http (~> 4.1, >= 4.1.1)
4
+ proxy_pool (0.2.0)
5
+ http (~> 4.4, >= 4.4.1)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- addressable (2.6.0)
11
- public_suffix (>= 2.0.2, < 4.0)
10
+ addressable (2.7.0)
11
+ public_suffix (>= 2.0.2, < 5.0)
12
12
  domain_name (0.5.20190701)
13
13
  unf (>= 0.0.5, < 1.0.0)
14
- http (4.1.1)
14
+ ffi (1.12.2)
15
+ ffi-compiler (1.0.1)
16
+ ffi (>= 1.0.0)
17
+ rake
18
+ http (4.4.1)
15
19
  addressable (~> 2.3)
16
20
  http-cookie (~> 1.0)
17
- http-form_data (~> 2.0)
18
- http_parser.rb (~> 0.6.0)
21
+ http-form_data (~> 2.2)
22
+ http-parser (~> 1.2.0)
19
23
  http-cookie (1.0.3)
20
24
  domain_name (~> 0.5)
21
- http-form_data (2.1.1)
22
- http_parser.rb (0.6.0)
23
- minitest (5.11.3)
24
- public_suffix (3.1.1)
25
- rake (13.0.1)
25
+ http-form_data (2.3.0)
26
+ http-parser (1.2.1)
27
+ ffi-compiler (>= 1.0, < 2.0)
28
+ minitest (5.14.1)
29
+ public_suffix (4.0.5)
30
+ rake (10.5.0)
26
31
  unf (0.1.4)
27
32
  unf_ext
28
- unf_ext (0.0.7.6)
33
+ unf_ext (0.0.7.7)
29
34
 
30
35
  PLATFORMS
31
36
  ruby
@@ -34,7 +39,7 @@ DEPENDENCIES
34
39
  bundler (~> 2.0)
35
40
  minitest (~> 5.0)
36
41
  proxy_pool!
37
- rake (~> 13.0)
42
+ rake (~> 10.0)
38
43
 
39
44
  BUNDLED WITH
40
- 2.0.2
45
+ 2.1.4
data/Rakefile CHANGED
@@ -1,10 +1,12 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rake/testtask'
3
5
 
4
6
  Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
6
- t.libs << "lib"
7
- t.test_files = FileList["test/**/*_test.rb"]
7
+ t.libs << 'test'
8
+ t.libs << 'lib'
9
+ t.test_files = FileList['test/**/*_test.rb']
8
10
  end
9
11
 
10
- task :default => :test
12
+ task default: :test
data/bin/console CHANGED
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- require "bundler/setup"
4
- require "proxy_pool"
4
+ require 'bundler/setup'
5
+ require 'proxy_pool'
5
6
 
6
7
  # You can add fixtures and/or initialization code here to make experimenting
7
8
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +11,5 @@ require "proxy_pool"
10
11
  # require "pry"
11
12
  # Pry.start
12
13
 
13
- require "irb"
14
+ require 'irb'
14
15
  IRB.start(__FILE__)
data/lib/proxy_pool.rb CHANGED
@@ -1,47 +1,60 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ProxyPool
2
4
  #
3
5
  # Errors
4
6
  #
5
7
 
6
8
  # Base error
7
- class Error < StandardError;
9
+ class Error < StandardError
8
10
  end
9
11
 
10
12
  require 'proxy_pool/version'
11
13
  require 'proxy_pool/dealer'
12
14
 
13
15
  class << self
14
- # Get anonymous proxy from pool randomly
16
+ # Get a proxy from proxy pool
15
17
  #
16
- # @param filter [Hash] Filter
17
18
  # @return [Hash] Proxy
18
- def get_anonymous_proxy(filter={})
19
- ProxyPool::Dealer.instance.get(true, filter)
19
+ def get(&block)
20
+ ProxyPool::Dealer.instance.get(&block)
20
21
  end
21
22
 
22
- # Update and get anonymous proxy from pool randomly
23
+ # Get high anonymous proxy
23
24
  #
24
- # @param filter [Hash] Filter
25
25
  # @return [Hash] Proxy
26
- def get_anonymous_proxy!(filter={})
27
- ProxyPool::Dealer.instance.get(true, filter, true)
26
+ def get_high_anonymous_proxy
27
+ get { |proxy| proxy['anonymity'] == 'high_anonymous' }
28
28
  end
29
29
 
30
- # Get transparent proxy from pool randomly
30
+ # Get proxy by country
31
31
  #
32
- # @param filter [Hash] Filter
32
+ # @param cn [String] Country code
33
33
  # @return [Hash] Proxy
34
- def get_transparent_proxy(filter={})
35
- ProxyPool::Dealer.instance.get(false, filter)
34
+ def get_by_country(cn)
35
+ get { |proxy| proxy['country'].downcase == cn.downcase }
36
36
  end
37
37
 
38
- # Update and get transparent proxy from pool randomly
38
+ # Get http proxy
39
39
  #
40
- # @param filter [Hash] Filter
41
40
  # @return [Hash] Proxy
42
- def get_transparent_proxy!(filter={})
43
- ProxyPool::Dealer.instance.get(false, filter, true)
41
+ def get_http_proxy
42
+ get { |proxy| proxy['type'] == 'http' }
44
43
  end
45
- end
46
44
 
45
+ # Get https proxy
46
+ #
47
+ # @return [Hash] Proxy
48
+ def get_https_proxy
49
+ get { |proxy| proxy['type'] == 'https' }
50
+ end
51
+
52
+ # Remove this proxy from pool
53
+ #
54
+ # @param proxy [Hash] Proxy
55
+ # @return [nil]
56
+ def remove(proxy)
57
+ ProxyPool::Dealer.instance.remove(proxy)
58
+ end
59
+ end
47
60
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Standard library
3
5
  #
@@ -17,72 +19,77 @@ module ProxyPool
17
19
  include Singleton
18
20
 
19
21
  # HTTP error
20
- class HTTPError < Error;
22
+ class HTTPError < Error
21
23
  end
22
24
 
23
25
  # Parse error
24
- class ParseError < Error;
25
- end
26
-
27
- # Filter error
28
- class FilterError < Error;
26
+ class ParseError < Error
29
27
  end
30
28
 
31
- attr_reader :transparent_pools, :anonymous_pools
29
+ attr_reader :pools
32
30
 
33
31
  # Update to latest proxy list from fate0/proxylist
34
32
  #
35
33
  def update
36
- @transparent_pools = []
37
- @anonymous_pools = []
34
+ @pools = []
38
35
 
39
36
  res = HTTP.get 'https://raw.githubusercontent.com/fate0/proxylist/master/proxy.list'
40
37
  raise HTTPError, "invalid http code #{res.code}" if res.code != 200
41
38
 
42
- res.body.to_s.split("\n").each {|line| _pool_parse(line)}
39
+ @updated_at = Time.now
40
+
41
+ res.body.to_s.split("\n").each { |line| _pool_parse(line) }
43
42
  end
44
43
 
45
44
  # Get a random proxy
46
45
  #
47
- # @param anonymous [Boolean] Return high anonymous proxy if true
48
- # @param filter [Hash] Filter
49
- # @param force_update [Boolean] Update pool before select proxy server
50
46
  # @return [Hash] Proxy
51
- def get(anonymous=true, filter={}, force_update=false)
52
- update if force_update || (@transparent_pools.nil? && @anonymous_pools.nil?)
47
+ def get
48
+ update if _need_update?
53
49
 
54
- target_pools = if anonymous
55
- @anonymous_pools
50
+ target_pools = if block_given?
51
+ @pools.select { |proxy| yield proxy }
56
52
  else
57
- @transparent_pools
53
+ @pools
58
54
  end
59
- filter.each_pair { |k, v| target_pools = _pool_filter(target_pools, k.to_s, v) }
60
-
61
55
  target_pools.sample
62
56
  end
63
57
 
58
+ # Remove this proxy from pool
59
+ #
60
+ # @param proxy [Hash] Proxy
61
+ # @return [nil]
62
+ def remove(proxy)
63
+ @pools.delete(proxy)
64
+
65
+ nil
66
+ end
67
+
64
68
  private
65
69
 
70
+ # Return true if we need to update proxy list
71
+ #
72
+ # @return [Boolean]
73
+ def _need_update?
74
+ return true if @updated_at.nil?
75
+
76
+ # Re-update after 10 min
77
+ delta = Time.now - @updated_at
78
+ delta > 600
79
+ end
80
+
81
+ # Parse proxy list
82
+ #
83
+ # @param line [String]
66
84
  def _pool_parse(line)
67
85
  proxy = JSON.parse(line)
68
- raise ParseError, "no anonymity field: #{line}" unless proxy.key?('anonymity')
69
-
70
- case proxy['anonymity']
71
- when 'high_anonymous'
72
- @anonymous_pools << proxy
73
- else
74
- @transparent_pools << proxy
86
+ unless proxy.key?('anonymity')
87
+ raise ParseError, "no anonymity field: #{line}"
75
88
  end
89
+
90
+ @pools << proxy
76
91
  rescue JSON::ParserError
77
92
  raise ParseError, "JSON parser error when parsing #{line}"
78
93
  end
79
-
80
- def _pool_filter(proxy_pools, key, value)
81
- proxy_pools.select do |proxy|
82
- raise FilterError, "invalid filter: #{key}" unless proxy.key?(key)
83
- proxy[key] == value
84
- end
85
- end
86
-
87
94
  end
88
- end
95
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ProxyPool
2
- VERSION = "0.1.3".freeze
4
+ VERSION = '0.2.0'
3
5
  end
data/proxy_pool.gemspec CHANGED
@@ -1,35 +1,37 @@
1
- lib = File.expand_path("lib", __dir__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require "proxy_pool/version"
5
+ require 'proxy_pool/version'
4
6
 
5
7
  Gem::Specification.new do |spec|
6
- spec.name = "proxy_pool"
8
+ spec.name = 'proxy_pool'
7
9
  spec.version = ProxyPool::VERSION
8
- spec.authors = ["hi_ztz"]
9
- spec.email = ["hi_ztz@protonmail.com"]
10
+ spec.authors = ['hi_ztz']
11
+ spec.email = ['hi_ztz@protonmail.com']
10
12
 
11
- spec.summary = %q{select a ip from proxy list randomly}
12
- spec.description = %q{proxy_pool can give you free and random proxy ip}
13
- spec.homepage = "https://github.com/zt2/proxy_pool"
14
- spec.license = "MIT"
13
+ spec.summary = 'select a ip from proxy list randomly'
14
+ spec.description = 'proxy_pool can give you free and random proxy ip'
15
+ spec.homepage = 'https://github.com/zt2/proxy_pool'
16
+ spec.license = 'MIT'
15
17
 
16
- spec.metadata["allowed_push_host"] = "https://rubygems.org"
18
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
17
19
 
18
- spec.metadata["homepage_uri"] = spec.homepage
19
- spec.metadata["source_code_uri"] = spec.homepage
20
+ spec.metadata['homepage_uri'] = spec.homepage
21
+ spec.metadata['source_code_uri'] = spec.homepage
20
22
 
21
23
  # Specify which files should be added to the gem when it is released.
22
24
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
25
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
24
26
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
27
  end
26
- spec.bindir = "exe"
28
+ spec.bindir = 'exe'
27
29
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
- spec.require_paths = ["lib"]
30
+ spec.require_paths = ['lib']
29
31
 
30
- spec.add_development_dependency "bundler", "~> 2.0"
31
- spec.add_development_dependency "rake", "~> 13.0"
32
- spec.add_development_dependency "minitest", "~> 5.0"
32
+ spec.add_development_dependency 'bundler', '~> 2.0'
33
+ spec.add_development_dependency 'minitest', '~> 5.0'
34
+ spec.add_development_dependency 'rake', '~> 10.0'
33
35
 
34
36
  spec.add_runtime_dependency 'http', '~> 4.4', '>= 4.4.1'
35
37
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: proxy_pool
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - hi_ztz
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-20 00:00:00.000000000 Z
11
+ date: 2020-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -25,33 +25,33 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '13.0'
33
+ version: '5.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '13.0'
40
+ version: '5.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: minitest
42
+ name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '5.0'
47
+ version: '10.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '5.0'
54
+ version: '10.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: http
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -116,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
118
  requirements: []
119
- rubygems_version: 3.0.8
119
+ rubygems_version: 3.1.2
120
120
  signing_key:
121
121
  specification_version: 4
122
122
  summary: select a ip from proxy list randomly