動機
「このツイートの画像、いいな!」と思ってお気に入り登録したツイートの添付画像を、一括でダウンロードしたい!・・・その一心で作りました。
ソースコード
twitterのgemを利用します。コンシューマキーなどは、自分のものを利用してください。
Twitterクライアントのfavoritesメソッドでお気に入りに登録されているツイートを取得していきながら、画像をダウンロードしていきます。favoritesメソッドを呼ぶときに、pageを指定すると、過去にお気に入り登録したツイートを取得できます。指定するpageの値を大きくしていきながら、お気に入りのツイートを遡っていきます。
twitter_client.rb
require 'twitter'
class TwitterClient
def initialize
@client = Twitter::REST::Client.new do |config|
config.consumer_key = ""
config.consumer_secret = ""
config.access_token = ""
config.access_token_secret = ""
end
end
def favorite(num=20,page=1)
# pageを指定すると、より過去のお気に入りツイートが見れる
begin
@client.favorites({count: num, page: page})
rescue Twitter::Error::TooManyRequests => error
STDERR.puts "Twitter::Error::TooManyRequests while getting favorite tweets."
sleep error.rate_limit.reset_in # APIの規制が解除されるまでsleep
retry
end
end
end
get_favorite_tweet_picture.rb
#!/usr/bin/env ruby
require './twitter_client.rb'
require 'open-uri'
def fetch(url)
p url
html = open(url)
body = html.read
mime = html.content_type
return body, mime
end
client = TwitterClient.new
picture_counter = 1 #画像の名前をつけるための、暫定的なカウンター
page = 1
until (favorites = client.favorite(20,page)).nil? do
favorites.each do |tweet|
p tweet.text
unless tweet.media.empty?
picture_dir = 'favorite_picture/'
Dir.mkdir(picture_dir) unless File.exist?(picture_dir)
media_urls = tweet.media.map{|media| media.media_url.to_s}
media_urls.each do |url|
img,mime = fetch url
next if mime.nil? or img.nil?
ext = ''
if mime.include?('jpeg')
ext = '.jpg'
elsif mime.include?('png')
ext = '.png'
elsif mime.include?('gif')
ext = '.gif'
else
next
end
result_file_name = picture_dir + picture_counter.to_s + ext
picture_counter += 1
File.open(result_file_name, 'w') do |file|
file.puts(img)
end
end
end
end
page += 1
end