にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

Atompubを使ってRubyスクリプトではてなフォトライフに画像をアップロード

はてなフォトライフスクリプトから写真をアップロードできるようにしたかったので、AtomAPIを使ってアップロードするスクリプトを作成してみた。
といっても、atomutilというgemを使えば面倒な作業が殆どなくなって楽ちんで作ることができた。
いちいちクラスを作成する必要なんて無かった気がする。

#! /usr/bin/env ruby
$KCODE='u'
require 'base64'
require 'rubygems'
require 'atomutil'

USER='XXXXXX'
PASS='XXXXXX' # base64 encoded

exit if ARGV.size == 0
file = ARGV.shift

class Fotolife
  ENDPOINT='http://f.hatena.ne.jp/atom'

  def initialize user, pass
    @user = user
    @pass = pass
  end

  def upload file
    # create entry
    new_entry = Atom::Entry.new :title => file
    data = File.open(file).read
    new_entry.content = Atom::Content.new({:body => data, :type => 'image/jpeg', :mode=>'base64'})

    # publish
    auth = Atompub::Auth::Wsse.new :username=>@user, :password=>@pass
    client = Atompub::Client.new :auth=>auth
    client.create_entry(ENDPOINT+'/post', new_entry)
  end
end

foto = Fotolife.new(USER, Base64.decode64(PASS))
res = foto.upload(file)
puts res

これで、

$ ruby fotoupload.rb hoge.jpg

とすればアップロードができる。atomutilはデータがバイナリだと自動的にBase64エンコードしてくれるからいい。
このスクリプトでの制限は以下の通り。

  • 画像フォーマットはJPEG決めうち
  • 一度に1ファイルのみ

あと、これはatomutilのバグ(仕様?)なのかもしれないが、以下は仕様どおりとのこと。mode属性はAtomPub 0.3のころの名残だそうです。(2008/12/05追記)

  • contentタグのmode属性が反映されない(指定の仕方の問題かしら)
  • はてなは成功時にステータスコード201を返すが、それだとatomutilさんからBad Content-Typeと返ってくるみたい