WWW::Mechanize 0.9でFlickrに画像をアップロードする

ある問題の解決方法が思いつかなかったので、Flickr APIを使う事に方針変更する。このまま捨てるのも勿体ないのでWWW::MechanizeでFlickrに画像をアップロードする - ちょっと待っての日記をWWW:Mechanizeの0.9に対応したサンプルコードです。

この日記を更新してFlickrへアップロードしているスクリプトで余計な部分*1をのぞいています。

しかし、Mechanize 0.9は取っつき難いなぁ。慣れてしまえば、判りやすいんだけど。

require 'rubygems'
require 'mechanize'

# Exif 除去
##require 'RMagick'
##require 'tempfile'

class HatenaFlickrWriter
  def initialize(id, pass)
    @AGENT = WWW::Mechanize.new
    @id = id
    @password = pass
  end

  # By yahoo login ID, password
  def login
    page = @AGENT.get('http://flickr.com/signin/')
    page.form_with(:name => "login_form") { |fm|
      fm.set_fields("login" => [@id], "passwd" => [@password])
      z = fm.click_button
      z.link_with(:text => 'click here').click # redirect
    }
  end
  
  # Basic uploader supports 6 files.
  UPLOAD_FILE_INBOX = ["file1","file2","file3","file4","file5","file6"]
  def upload(filenames)
    page = @AGENT.get('http://flickr.com/')
    x1 = page.link_with(:text => "Upload").click
    x2 = x1.link_with(:text => "basic Uploader").click
    x2.form_with(:action => 'http://up.flickr.com/photos/upload/transfer/') { |form|
      filenames.each_with_index { |fname, index|
        if index >= UPLOAD_FILE_INBOX.size
          p "#{UPLOAD_FILE_INBOX.size} ファイルが上限です"
          break
        end
        tmp = UPLOAD_FILE_INBOX[index]
##      form.file_upload_with(:name => tmp).file_name = strip_exif(fname)
        form.file_upload_with(:name => tmp).file_name = fname
      }
      form.radiobuttons[1].check # Public (anyone can see them)
      form.click_button
    }
  end
  private
# jpegのexif情報を取り除いて、tmpディレクトリに保存する
## def strip_exif(fname)
##   img = Magick::ImageList.new(fname)
##   img.strip!
##   ofile = Dir.tmpdir + File::Separator + fname
##   img.write(ofile)
##   return ofile
## end
end

# test code
if __FILE__ == $0
  flickr = HatenaFlickrWriter.new('LOGIN ID','PASSWORD')
  flickr.login
  fname = []
  ARGV.each { |f|
    fname.push f
  }
  flickr.upload(fname)
end

*1:cookie対応など