はてなフォトライフにpostするgyazoを書いた on Mac OSX

はてなフォトライフAtomAPIの扱い方が分かったので、早速gyazoを使ってはてなフォトライフにpostするスクリプトを書いてみた。gyazo自体はRubyで書かれているので、書き換えるだけでOK......なんだけど、RubygemsのロードパスはMacに標準で入っているRubygemsのものになるので注意。おいらは別途MacPortsで入れているんだけど、動かなくて原因が分かるのに結構悩んでしまった。

前準備

atomutilをインストール。

sudo /usr/bin/gem install atomutil

これでMacPortsを使ったり、別途他のところにソースからインストールしている人でも標準のRubygemsにatomutilがインストールされる。

patch

*** /Applications/gyazo.app/Contents/Resources/script	2007-09-05 14:20:13.000000000 +0900
--- /Applications/gyazo.app/Contents/Resources/script	2008-09-14 14:27:16.000000000 +0900
***************
*** 1,6 ****
  #!/usr/bin/env ruby
  
! require 'net/http'
  
  program = ARGV[0]
  idfile = File.dirname(program) + "/gyazo.app/Contents/Resources/id"
--- 1,7 ----
  #!/usr/bin/env ruby
  
! require 'rubygems'
! require 'atomutil'
  
  program = ARGV[0]
  idfile = File.dirname(program) + "/gyazo.app/Contents/Resources/id"
***************
*** 25,56 ****
  imagedata = File.read(tmpfile)
  File.delete(tmpfile)
  
! boundary = '----BOUNDARYBOUNDARY----'
  
! HOST = 'gyazo.com'
! CGI = '/upload.cgi'
  
! data = <<EOF
! --#{boundary}\r
! content-disposition: form-data; name="id"\r
! \r
! #{id}\r
! --#{boundary}\r
! content-disposition: form-data; name="imagedata"\r
! \r
! #{imagedata}\r
! \r
! --#{boundary}--\r
! EOF
! 
! header ={
!   'Content-Length' => data.length.to_s,
!   'Content-type' => "multipart/form-data; boundary=#{boundary}"
! }
! 
! Net::HTTP.start(HOST,80){|http|
!   res = http.post(CGI,data,header)
!   url = res.response.to_ary[1]
!   system "echo #{url} | pbcopy"
!   system "open #{url}"
! }
--- 26,46 ----
  imagedata = File.read(tmpfile)
  File.delete(tmpfile)
  
! post_uri = 'http://f.hatena.ne.jp/atom/post'
! userid = '******'
! pass = '******'
! 
! entry = Atom::Entry.new({
!   :title => 'post by gyazo',
!   :updated => Time.now,
!   :content => Atom::Content.new { |c|
!     c.body = [imagedata].pack('m')
!     c.type = "image/jpeg"
!     c.set_attr(:mode, "base64")
!   },
! })
  
! auth = Atompub::Auth::Wsse.new :username => userid, :password => pass
! client = Atompub::Client.new :auth => auth
  
! client.create_entry(post_uri, entry, "post bv gyazo")

中のuseridとpassにはてなアカウント、パスワードを書いてください。別途設定ファイルを準備してもよかったんだけど面倒だったので直接書くことにした。