twitter_images 0.0.4 → 0.1.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 +4 -4
- data/bin/twitter_images +5 -1
- data/lib/twitter_images.rb +1 -0
- data/lib/twitter_images/cli.rb +3 -3
- data/lib/twitter_images/configuration.rb +18 -2
- data/lib/twitter_images/downloader.rb +20 -20
- data/lib/twitter_images/requester.rb +62 -26
- data/lib/twitter_images/version.rb +1 -1
- metadata +30 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 20dbabd1b8ed7d7b58e062c56e3a1912ee07b250
|
4
|
+
data.tar.gz: 8de26899a00b93007b8338a588514fbba231f781
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 62d203269ee201430588c11da10ac95dac38cd514a68ba3e3dd589cff06083d61ec4ff2bc0a3e5b4e46ba324818901f875db37b30e80c1a54c919f4ac2756564
|
7
|
+
data.tar.gz: f91bd4f69ce6bd9fb4e8d33fb151d5a2ef29f21b37b363660d5a8b360b3ec1154fe5525718f8f4d02dc8cdb7118501f210d3518e7a2d2e337ae50bb336581f44
|
data/bin/twitter_images
CHANGED
@@ -3,4 +3,8 @@
|
|
3
3
|
$LOAD_PATH.unshift(File.expand_path("../lib", __FILE__))
|
4
4
|
require "twitter_images"
|
5
5
|
|
6
|
-
TwitterImages::
|
6
|
+
downloader = TwitterImages::Downloader.new
|
7
|
+
requester = TwitterImages::Requester.new(downloader)
|
8
|
+
configuration = TwitterImages::Configuration.new(requester)
|
9
|
+
|
10
|
+
TwitterImages::CLI.new(configuration).run
|
data/lib/twitter_images.rb
CHANGED
data/lib/twitter_images/cli.rb
CHANGED
@@ -1,11 +1,17 @@
|
|
1
1
|
module TwitterImages
|
2
2
|
class Configuration
|
3
|
-
|
3
|
+
attr_reader :requester
|
4
|
+
attr_accessor :search, :directory, :amount
|
5
|
+
|
6
|
+
def initialize(requester)
|
7
|
+
@requester = requester
|
8
|
+
end
|
4
9
|
|
5
10
|
def prepare
|
6
11
|
set_directory
|
7
12
|
get_search
|
8
|
-
|
13
|
+
get_amount
|
14
|
+
start
|
9
15
|
end
|
10
16
|
|
11
17
|
private
|
@@ -30,5 +36,15 @@ module TwitterImages
|
|
30
36
|
@search = gets.chomp.gsub(/\s/, "%20")
|
31
37
|
raise StandardError, "The search string is empty" if @search.empty?
|
32
38
|
end
|
39
|
+
|
40
|
+
def get_amount
|
41
|
+
puts "Please enter the number of images to download: "
|
42
|
+
@amount = gets.chomp.to_i
|
43
|
+
raise StandardError, "The number is too small" if @amount <= 0
|
44
|
+
end
|
45
|
+
|
46
|
+
def start
|
47
|
+
requester.start(@search, @amount)
|
48
|
+
end
|
33
49
|
end
|
34
50
|
end
|
@@ -1,34 +1,34 @@
|
|
1
1
|
module TwitterImages
|
2
2
|
class Downloader
|
3
|
-
attr_accessor :
|
3
|
+
attr_accessor :output, :images
|
4
4
|
|
5
|
-
def
|
6
|
-
|
7
|
-
end
|
8
|
-
|
9
|
-
def download
|
10
|
-
get_output
|
11
|
-
parse_output
|
12
|
-
save_images
|
5
|
+
def download(all_links)
|
6
|
+
save_images(all_links)
|
13
7
|
end
|
14
8
|
|
15
9
|
private
|
16
10
|
|
17
|
-
def
|
18
|
-
|
11
|
+
def write_file(filename, data)
|
12
|
+
file = File.new(File.basename(filename), "wb")
|
13
|
+
file.write(data)
|
14
|
+
file.close
|
19
15
|
end
|
20
16
|
|
21
|
-
def
|
22
|
-
|
23
|
-
|
24
|
-
end
|
17
|
+
def save_images(all_links)
|
18
|
+
progressbar = ProgressBar.create(:total => all_links.count)
|
19
|
+
hydra = Typhoeus::Hydra.new
|
25
20
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
21
|
+
all_links.each do |src|
|
22
|
+
request = Typhoeus::Request.new(src + ":large")
|
23
|
+
request.on_complete do |response|
|
24
|
+
write_file(src, response.body)
|
25
|
+
progressbar.increment
|
26
|
+
end
|
27
|
+
hydra.queue request
|
31
28
|
end
|
29
|
+
hydra.run
|
30
|
+
puts "Downloaded #{all_links.count} pictures!"
|
32
31
|
end
|
33
32
|
end
|
33
|
+
|
34
34
|
end
|
@@ -1,31 +1,46 @@
|
|
1
1
|
module TwitterImages
|
2
2
|
class Requester
|
3
|
-
|
4
|
-
|
3
|
+
attr_reader :consumer_key, :access_token, :downloader, :search
|
4
|
+
attr_accessor :https, :address, :response, :max_id, :all_links
|
5
5
|
|
6
|
-
def initialize(
|
7
|
-
@
|
6
|
+
def initialize(downloader)
|
7
|
+
@downloader = downloader
|
8
|
+
@all_links = []
|
8
9
|
end
|
9
10
|
|
10
|
-
def start
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
def start(search, amount)
|
12
|
+
check_env
|
13
|
+
get_links(search, amount)
|
14
|
+
download
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_links(search, amount)
|
18
|
+
loop do
|
19
|
+
setup_address(search)
|
20
|
+
setup_https
|
21
|
+
issue_request
|
22
|
+
parse_response
|
23
|
+
break if all_links.count > amount
|
24
|
+
end
|
25
|
+
trim_links(amount)
|
17
26
|
end
|
18
27
|
|
19
28
|
private
|
20
29
|
|
21
|
-
def
|
22
|
-
@
|
30
|
+
def setup_address(search)
|
31
|
+
unless @max_id.nil?
|
32
|
+
@address = URI("https://api.twitter.com/1.1/search/tweets.json?q=%23#{search}&result_type=recent&count=100&max_id=#{@max_id}")
|
33
|
+
else
|
34
|
+
@address = URI("https://api.twitter.com/1.1/search/tweets.json?q=%23#{search}&result_type=recent&count=100")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def consumer_key
|
39
|
+
OAuth::Consumer.new(ENV["CONSUMER_KEY"], ENV["CONSUMER_SECRET"])
|
23
40
|
end
|
24
41
|
|
25
|
-
def
|
26
|
-
|
27
|
-
@consumer_key = OAuth::Consumer.new(ENV["CONSUMER_KEY"], ENV["CONSUMER_SECRET"])
|
28
|
-
@access_token = OAuth::Token.new(ENV["ACCESS_TOKEN"], ENV["ACCESS_SECRET"])
|
42
|
+
def access_token
|
43
|
+
OAuth::Token.new(ENV["ACCESS_TOKEN"], ENV["ACCESS_SECRET"])
|
29
44
|
end
|
30
45
|
|
31
46
|
def check_env
|
@@ -40,22 +55,43 @@ module TwitterImages
|
|
40
55
|
end
|
41
56
|
|
42
57
|
def setup_https
|
43
|
-
# Set up Net::HTTP to use SSL, which is required by Twitter.
|
44
58
|
@https = Net::HTTP.new(address.host, address.port)
|
45
59
|
https.use_ssl = true
|
46
|
-
https.verify_mode = OpenSSL::SSL::
|
47
|
-
end
|
48
|
-
|
49
|
-
def build_request
|
50
|
-
# Build the request and authorize it with OAuth.
|
51
|
-
@request = Net::HTTP::Get.new(address.request_uri)
|
52
|
-
request.oauth!(https, consumer_key, access_token)
|
60
|
+
https.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
53
61
|
end
|
54
62
|
|
55
63
|
def issue_request
|
56
|
-
|
64
|
+
request = Net::HTTP::Get.new(address.request_uri)
|
65
|
+
request.oauth!(https, consumer_key, access_token)
|
57
66
|
@https.start
|
58
67
|
@response = https.request(request)
|
59
68
|
end
|
69
|
+
|
70
|
+
def parse_response
|
71
|
+
filtered = JSON.parse(@response.body)
|
72
|
+
get_max_id(filtered)
|
73
|
+
collect_responses(filtered)
|
74
|
+
end
|
75
|
+
|
76
|
+
def get_max_id(filtered)
|
77
|
+
ids = []
|
78
|
+
filtered["statuses"].each do |tweet|
|
79
|
+
ids << tweet["id"]
|
80
|
+
end
|
81
|
+
@max_id = ids.min - 1
|
82
|
+
end
|
83
|
+
|
84
|
+
def collect_responses(filtered)
|
85
|
+
@all_links += filtered.inspect.scan(/https:\/\/pbs.twimg.com\/media\/\w+\.(?:jpg|png|gif)/)
|
86
|
+
@all_links.uniq!
|
87
|
+
end
|
88
|
+
|
89
|
+
def trim_links(amount)
|
90
|
+
@all_links = @all_links.slice!(0...amount)
|
91
|
+
end
|
92
|
+
|
93
|
+
def download
|
94
|
+
downloader.download(@all_links)
|
95
|
+
end
|
60
96
|
end
|
61
97
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twitter_images
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexey Zabelin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fileutils
|
@@ -84,6 +84,20 @@ dependencies:
|
|
84
84
|
- - ">="
|
85
85
|
- !ruby/object:Gem::Version
|
86
86
|
version: 1.7.5
|
87
|
+
- !ruby/object:Gem::Dependency
|
88
|
+
name: typhoeus
|
89
|
+
requirement: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - "~>"
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '1.0'
|
94
|
+
type: :runtime
|
95
|
+
prerelease: false
|
96
|
+
version_requirements: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - "~>"
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '1.0'
|
87
101
|
- !ruby/object:Gem::Dependency
|
88
102
|
name: bundler
|
89
103
|
requirement: !ruby/object:Gem::Requirement
|
@@ -154,6 +168,20 @@ dependencies:
|
|
154
168
|
- - '='
|
155
169
|
- !ruby/object:Gem::Version
|
156
170
|
version: 0.2.2
|
171
|
+
- !ruby/object:Gem::Dependency
|
172
|
+
name: webmock
|
173
|
+
requirement: !ruby/object:Gem::Requirement
|
174
|
+
requirements:
|
175
|
+
- - '='
|
176
|
+
- !ruby/object:Gem::Version
|
177
|
+
version: 1.22.6
|
178
|
+
type: :development
|
179
|
+
prerelease: false
|
180
|
+
version_requirements: !ruby/object:Gem::Requirement
|
181
|
+
requirements:
|
182
|
+
- - '='
|
183
|
+
- !ruby/object:Gem::Version
|
184
|
+
version: 1.22.6
|
157
185
|
description: |-
|
158
186
|
A CLI tool that downloads the most recent images from twitter based on the search terms provided. Please remember that you need to provide your own
|
159
187
|
consumer key and consumer secret as well as the access token and access token secret. You
|