鳥小屋.txt

主に自作ゲームをつくったりしているよ。制作に関することやそうじゃないことのごった煮ブログ

Tumblr APIで『スキ』した画像を保存してみた

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とかに投げられたらもっと楽しいかなー?


どっさり!!