2012/09/11 複数画像が添付されている時にうまく保存されてなかったので修正しました
友達に勧められて始めたTumblrが楽しいです。
楽しいというか、自分でネットしてたら出会わなかっただろうなぁという
コンテンツに出会えるのがとてもいい!
Tumblr無かったら僕が杏ちゃんに出会うことも無かったでしょう(
もっとも、権利的なアレがいろいろ大丈夫か?という感じですが……
で、僕のTumblrの使い方としては、気に入った画像を『スキ』しておいて、
あとでそのサイト(Pixivとか)に行って、ウフフするんですが、
どうせなら、『スキ』した画像をまるごと保存したいなーと思いまして!
後でやろう、後でやろうと思って、時すでにおすし。
さすがに1000件とかなったらもう無理です! このペースで増えたら手動は無理です!
そんなわけで、TumblrのAPIを使って一気に保存しちゃおう with Ruby☆
ホントはtumblife for rubyってライブラリ使おうとしたんですが、
なんか僕の使い方がおかしいのか、うまく動いてくれない……><
まぁ、やること大したことじゃないので今回はOAuthのライブラリだけで行っちゃいましょう!
動作環境はUbuntu11.10+Ruby 1.9.2です!
# coding: utf-8 require 'oauth' require 'json' require 'open-uri' # TumblrAPIのキー(自分のを入れる) CONSUMER_KEY = 'ヽ(・x・)ノ' CONSUMER_SECRET = 'ヽ(・x・)ノ' ACCESS_TOKEN = 'ヽ(・x・)ノ' ACCESS_TOKEN_SECRET = 'ヽ(・x・)ノ' # 画像の保存ディレクトリ PHOTO_SAVE_DIR = "./photos" # 設定ファイルの保存先 SETTING_DATA = "./photos/save.dat" #----------------------------------------------------------- LIKE_API_URL = 'http://api.tumblr.com/v2/user/likes' # 画像のダウンロード def download(url, filename) open(url) do |src| ext = '' case src.content_type when 'image/jpeg' ext << '.jpg' when 'image/png', 'image/x-png' ext << '.png' when 'image/gif' ext << '.gif' end open("#{filename}#{ext}", 'wb') do |file| file.print src.read end end end # 前回の情報を読み込み settings = nil begin File.open(SETTING_DATA, 'rb') do |file| settings = Marshal.load(file) end rescue => e puts "Settings open Error. Create New Settings." settings = { :liked_count => 0 } end # API接続準備 consumer = OAuth::Consumer.new( CONSUMER_KEY, CONSUMER_SECRET, :site => 'http://www.tumblr.com' ) access_token = OAuth::AccessToken.new( consumer, ACCESS_TOKEN, ACCESS_TOKEN_SECRET ) # 増えたLike数をチェック res = access_token.get("#{LIKE_API_URL}?limit=1") likes_json = JSON.parse(res.body) liked_count = (likes_json['response']['liked_count']).to_i new_liked = liked_count - settings[:liked_count] t_new_liked = new_liked puts "NewLiked: #{new_liked}" # 規定数に達するまでループ offset = 0 limit = 20 while new_liked > 0 res = access_token.get("#{LIKE_API_URL}?limit=#{limit}&offset=#{offset}") likes_json = JSON.parse(res.body) likes_json['response']['liked_posts'].each do |post| # 進行率 print "[#{t_new_liked - new_liked + 1}/#{t_new_liked}]" # 保存処理 id = post['id'].to_i post['photos'].each_with_index do |photos, i| url = photos['original_size']['url'] print "#{url} " # <修正> 複数枚画像がある場合はファイル名末尾に通し番号を付ける download(url, "#{PHOTO_SAVE_DIR}/#{id}#{post['photos'].size > 1 ? sprintf("_%2d", i) : ''}") end puts # 既に規定数の回収をしたらループを中断 new_liked -= 1 break unless new_liked > 0 end offset += limit end puts "Complete!" # ダウンロードした枚数を保存 settings[:liked_count] = liked_count File.open(SETTING_DATA, 'wb') do |file| Marshal.dump(settings, file) end
「うわぁ……」ってコードですね! 再利用とかできそうにない!
でも、ほら、早く作らないと『スキ』がどんどん増えちゃうし……(
これを1日の終わりにでも実行すれば、その日の画像が一気に手元にきて楽しい感じ。
あとはこっからEvernoteとかに投げられたらもっと楽しいかなー?