drophunter 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.rubocop.yml +15 -0
- data/CODE_OF_CONDUCT.md +2 -10
- data/Gemfile +1 -1
- data/README.md +4 -1
- data/Rakefile +1 -1
- data/bin/drophunter +2 -2
- data/drophunter.gemspec +6 -4
- data/lib/drophunter.rb +1 -1
- data/lib/drophunter/file_types/image.rb +23 -0
- data/lib/drophunter/page.rb +31 -0
- data/lib/drophunter/version.rb +1 -1
- data/lib/drophunter/worker.rb +36 -0
- metadata +30 -13
- data/lib/drophunter/drop.rb +0 -51
- data/lib/drophunter/hunter.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9b3ca7dd5c29382c1d37894b5dacc1de5065a35
|
4
|
+
data.tar.gz: 5644b665b3abcff059a014ea00fc0dfc9a436729
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 91e00cd35089483cf5af170501abdb2d8273867eef91ba8db670bc3b2b3cd007abea5ce2fc27883a032f7f88cfb10b174456fd4de3a728910df5fddeb6a21d5e
|
7
|
+
data.tar.gz: b06dd8a1fb2216ab9865a975533159e2cb98fdd7287c45821af90ccbc97eed2b8a65108f41787ba22881a4a8b77b3feeee09dbac55b670dc5590f3b8b1a71a73
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
data/CODE_OF_CONDUCT.md
CHANGED
@@ -1,13 +1,5 @@
|
|
1
1
|
# Contributor Code of Conduct
|
2
2
|
|
3
|
-
|
3
|
+
This project adheres to No Code of Conduct. We are all adults. We accept anyone's contributions. Nothing else matters.
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
|
8
|
-
|
9
|
-
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
|
10
|
-
|
11
|
-
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
|
12
|
-
|
13
|
-
This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
|
5
|
+
For more information please visit the [No Code of Conduct](https://github.com/domgetter/NCoC) homepage.
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -22,7 +22,10 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
-
|
25
|
+
Type of the following commands in your console:
|
26
|
+
|
27
|
+
`drophunter` will try all possible IDs (i.e. aaaa, aaab, aaac and so on)
|
28
|
+
`drophunter random` will try IDs in random order
|
26
29
|
|
27
30
|
## Development
|
28
31
|
|
data/Rakefile
CHANGED
data/bin/drophunter
CHANGED
data/drophunter.gemspec
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
lib = File.expand_path(
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
4
|
+
require "drophunter/version"
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "drophunter"
|
8
|
+
spec.description = "Drophunter is a tool which downloads every public image it can find on https://droplr.com."
|
8
9
|
spec.version = Drophunter::VERSION
|
9
10
|
spec.authors = ["Airat Shigapov"]
|
10
11
|
spec.email = ["contact@airatshigapov.com"]
|
@@ -17,8 +18,9 @@ Gem::Specification.new do |spec|
|
|
17
18
|
spec.executables = ["drophunter"]
|
18
19
|
spec.require_paths = ["lib"]
|
19
20
|
|
20
|
-
spec.add_dependency "nokogiri"
|
21
|
+
spec.add_dependency "nokogiri", "~> 1.6"
|
21
22
|
spec.add_development_dependency "bundler", "~> 1.10"
|
22
23
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
-
spec.add_development_dependency "rspec"
|
24
|
+
spec.add_development_dependency "rspec", "~> 3.3"
|
25
|
+
spec.add_development_dependency "rubocop", "~> 0.31"
|
24
26
|
end
|
data/lib/drophunter.rb
CHANGED
@@ -0,0 +1,23 @@
|
|
1
|
+
module Drophunter
|
2
|
+
module FileTypes
|
3
|
+
class Image < Struct.new(:content, :id)
|
4
|
+
def find_and_save
|
5
|
+
if image_element
|
6
|
+
puts "#{id} is OK"
|
7
|
+
|
8
|
+
open("#{id}.png", "wb") do |file|
|
9
|
+
file << open(image_element.attr("src")).read
|
10
|
+
end
|
11
|
+
else
|
12
|
+
puts "#{id} is not a Droplr image"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def image_element
|
19
|
+
@image_element ||= content.at_css("body.image-drop .image img")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Drophunter
|
2
|
+
class Page < Struct.new(:id)
|
3
|
+
BASE_URL = "http://d.pr/i/"
|
4
|
+
|
5
|
+
def save(something)
|
6
|
+
puts "Downloading #{url}"
|
7
|
+
|
8
|
+
begin
|
9
|
+
something.new(Nokogiri::HTML(open(url)), id).find_and_save
|
10
|
+
rescue *error_messages.keys => error
|
11
|
+
puts error_messages[error.class]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def error_messages
|
18
|
+
{
|
19
|
+
OpenURI::HTTPError => "#{id} doesn't exist on Droplr",
|
20
|
+
RuntimeError => "#{id} caused an error (redirect?)",
|
21
|
+
SocketError => "#{id} caused an error (redirect with missing page?)",
|
22
|
+
Errno::ECONNRESET => "#{id} caused an error (and I have no idea why)",
|
23
|
+
Errno::ETIMEDOUT => "#{id} caused an error (timed out)"
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def url
|
28
|
+
BASE_URL + id
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/drophunter/version.rb
CHANGED
@@ -0,0 +1,36 @@
|
|
1
|
+
require "open-uri"
|
2
|
+
require "nokogiri"
|
3
|
+
require "drophunter/page"
|
4
|
+
require "drophunter/file_types/image"
|
5
|
+
|
6
|
+
module Drophunter
|
7
|
+
class Worker < Struct.new(:strategy)
|
8
|
+
ALLOWED_CHARS = [*"a".."z", *"A".."Z"]
|
9
|
+
|
10
|
+
def run
|
11
|
+
send("#{strategy || :default}_strategy")
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def save_file(id)
|
17
|
+
Drophunter::Page.new(id).save(Drophunter::FileTypes::Image)
|
18
|
+
end
|
19
|
+
|
20
|
+
def default_strategy
|
21
|
+
ALLOWED_CHARS.repeated_permutation(4).each do |id_as_array|
|
22
|
+
save_file(id_as_array.join)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def random_strategy
|
27
|
+
Enumerator.new do |enumerator|
|
28
|
+
loop do
|
29
|
+
enumerator.yield(4.times.map { ALLOWED_CHARS[Random.rand(0..ALLOWED_CHARS.length)] }.join)
|
30
|
+
end
|
31
|
+
end.each do |id|
|
32
|
+
save_file(id)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: drophunter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Airat Shigapov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '1.6'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '1.6'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -56,17 +56,32 @@ dependencies:
|
|
56
56
|
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '3.3'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.3'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.31'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
67
81
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
description:
|
82
|
+
version: '0.31'
|
83
|
+
description: Drophunter is a tool which downloads every public image it can find on
|
84
|
+
https://droplr.com.
|
70
85
|
email:
|
71
86
|
- contact@airatshigapov.com
|
72
87
|
executables:
|
@@ -76,6 +91,7 @@ extra_rdoc_files: []
|
|
76
91
|
files:
|
77
92
|
- ".gitignore"
|
78
93
|
- ".rspec"
|
94
|
+
- ".rubocop.yml"
|
79
95
|
- ".travis.yml"
|
80
96
|
- CODE_OF_CONDUCT.md
|
81
97
|
- Gemfile
|
@@ -87,9 +103,10 @@ files:
|
|
87
103
|
- bin/setup
|
88
104
|
- drophunter.gemspec
|
89
105
|
- lib/drophunter.rb
|
90
|
-
- lib/drophunter/
|
91
|
-
- lib/drophunter/
|
106
|
+
- lib/drophunter/file_types/image.rb
|
107
|
+
- lib/drophunter/page.rb
|
92
108
|
- lib/drophunter/version.rb
|
109
|
+
- lib/drophunter/worker.rb
|
93
110
|
homepage: http://github.com/airatshigapov/drophunter
|
94
111
|
licenses:
|
95
112
|
- MIT
|
data/lib/drophunter/drop.rb
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
require "nokogiri"
|
2
|
-
|
3
|
-
module Drophunter
|
4
|
-
class Drop < Struct.new(:id)
|
5
|
-
BASE_URL = "http://d.pr/i/"
|
6
|
-
|
7
|
-
def find
|
8
|
-
url = BASE_URL + id
|
9
|
-
|
10
|
-
puts "Downloading #{url}"
|
11
|
-
|
12
|
-
begin
|
13
|
-
page = Nokogiri::HTML(open(url))
|
14
|
-
rescue OpenURI::HTTPError
|
15
|
-
puts "#{id} doesn't exist on Droplr"
|
16
|
-
return false
|
17
|
-
rescue RuntimeError
|
18
|
-
puts "#{id} caused an error (redirect?)"
|
19
|
-
return false
|
20
|
-
rescue SocketError
|
21
|
-
puts "#{id} caused an error (redirect with missing page?)"
|
22
|
-
return false
|
23
|
-
rescue Errno::ECONNRESET
|
24
|
-
puts "#{id} caused an error (and I have no idea why)"
|
25
|
-
return false
|
26
|
-
rescue Errno::ETIMEDOUT
|
27
|
-
puts "#{id} caused an error (timed out)"
|
28
|
-
return false
|
29
|
-
end
|
30
|
-
|
31
|
-
if page.at_css(".image img")
|
32
|
-
puts "Something like image found for #{id}"
|
33
|
-
|
34
|
-
if img = page.at_css("body.image-drop .image img")
|
35
|
-
puts "#{id} is OK"
|
36
|
-
image_url = img.attr("src")
|
37
|
-
else
|
38
|
-
puts "#{id} is not a Droplr image"
|
39
|
-
return false
|
40
|
-
end
|
41
|
-
else
|
42
|
-
puts "#{id} is not an image"
|
43
|
-
return false
|
44
|
-
end
|
45
|
-
|
46
|
-
open("#{id}.png", "wb") do |file|
|
47
|
-
file << open(image_url).read
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
data/lib/drophunter/hunter.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
require 'open-uri'
|
2
|
-
require "drophunter/drop"
|
3
|
-
|
4
|
-
module Drophunter
|
5
|
-
class Hunter
|
6
|
-
ALLOWED_CHARS = [*'a'..'z', *'A'..'Z']
|
7
|
-
|
8
|
-
def self.run
|
9
|
-
ALLOWED_CHARS.repeated_permutation(4).each do |generated_droplr_id|
|
10
|
-
Drop.new(generated_droplr_id.join).find
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|