twitter_images 0.0.4 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|