«前の日記(2008-10-12 (日)) 最新 次の日記(2008-10-21 (火))»  

まちゅダイアリー


2008-10-20 (月)

Ruby を使って Flickr へ写真をアップロード

image_ex.rbを使っていた日記をflickr.rbを使うように書き換えるというのが自動的にできるといいなと思ってブクマしたら、まちゅさんがimage_ex.rbからflickr.rbへのマイグレーションツールを作ってくれるかもという流れに。

ということで、 image_ex から flickr への移行について考えてみた。

移行対象の写真ファイルを取得

image, image_ex プラグインは images/ ディレクトリに yyyymmdd_i.jpg 形式でファイルを配置している。 2008年10月20日の日記の写真なら、 20081020_0.jpg になる。2枚目以降は i の数値が増えていく。 image_ex プラグインは写真を縮小する機能があり、縮小したファイルは(おそらく)名前の先頭に「s」が付く。 Flickrへ移行するときは、 images/yyyymmdd_i.jpg 形式のファイルを取得すればよさそう。

写真を Flickr へアップロード

tDiary の Flickr プラグインは日記に写真を表示することができるけど、認証が必要なアップロードには対応していない。 自作で認証やアップロードに対応するのは大変なので、ライブラリを使う方向で調べてみた。

  • flickr.rb … 最終更新日が2008年の2月。使いやすそうなライブラリだけど、認証やアップロードに対応していなかったので残念ながらNG。 gem install flickr でインストール可能。
  • WWW::MechanizeでFlickrに画像をアップロードする … Webブラウザの動作をエミュレートする方法。悪くないけどFlickrの仕様変更の影響を受けるので最後の手段。
  • rflickr.rb … 最終更新日が2006年の1月。もう活動していないのかな。認証とアップロードに対応している。

試しに、 rflickr.rb を使ってみた。 RubyGemsを使ってインストール。

sudo gem install rflickr

同梱の GETTING-STARTED を参考に、以下のサンプルソースを作成した。 gem の使い方に自信ないけど、大丈夫かな?

#!/usr/bin/env ruby
require 'rubygems'
gem 'rflickr'
require 'flickr'

api_key = '******************************'
secret = '*********'
flickr = Flickr.new('flickr.dat', api_key, secret)
# トークンを取得していなければ取得する。トークンは flickr.dat に格納する。
unless flickr.auth.token
  url = flickr.auth.login_link                                               
  puts "Webブラウザで #{url} へアクセスしてから、何かキーを押してください"
  gets
  flickr.auth.getToken
  flickr.auth.cache_token
end
# 写真をアップロード。返り値は写真のID。
p flickr.photos.upload.upload_file(ARGV.shift)

Flickr のサイトで api_key と secret を取得し、ファイルに設定する。 また、APIの Auth mode は Web ではなく Desktop にしておく。 このサンプルをコマンドラインから実行すると、引数で渡したJPEGファイルがFlickrにアップデートされた。

./rflickr_test.rb sample.jpg

同時に、取得したトークンが flickr.dat に保存される。 これで、2回目からはトークンの取得が不要になる。

<auth>
  <token>******************-******************</token>
  <perms>delete</perms>
  <user nsid="19594487@N00" username="machu." fullname="MATSUOKA Kohei" />
</auth>

upload_file メソッドは lib/flickr/upload.rb に定義されている。 引数でタイトルなどを指定することもできる。

def upload_file(filename,title=nil,description=nil,tags=nil,
      is_public=nil,is_friend=nil,is_family=nil)

あとは、 image プラグインの写真 (images/yyyymmdd_i.jpg) をアップロードし、ファイル名と Flickr の写真IDのペアを保存すればOKかな。

imageプラグインの書き換え

日記データに記録されている image プラグインの呼び出しを flickr プラグインに変更する。 このとき、先ほど保存したファイル名と Flickr のIDのペアが必要になる。 書き換えの案は2つ。

  1. 日記データ(*.td2)の image プラグインの呼び出し文字列を書き換える
  2. flickr プラグインにて image メソッドを上書きする

1の案は関係ない文字を書き換えてしまいそうで怖い。 2の案のほうが安全だけど、いつまでもファイル名とIDのペアが必要なのが欠点か。 うーん。

P.S.

僕も昔は絵日記プラグイン (image.rb, image-ex.rb) を使っていたんだけど、どこかのタイミングで images/ ディレクトリを消してしまっていたみたい。 昔の日記を表示しても写真が表示されないや。 なんてこった。