はてなフォトライフAtomAPIでフィードを参照してみる

はてなフォトライフAtomAPIを使って、特定の写真エントリのフィードを参照するRubyコードを書いてみた。

require 'digest/sha1'
require 'time'
require 'base64'
require 'http-access2'
require 'kconv'

class HatenaPhoto
  def initialize(username, password)
    @username = username
    @password = password
    @client = HTTPAccess2::Client.new 
  end

  def get(id)
    response = @client.get("http://f.hatena.ne.jp/atom/edit/#{id}", nil,
                           create_header)
    raise "#{response.dump}" if response.status != 200
    response.content
  end

  def create_header
    nonce = Digest::SHA1.digest(Digest::SHA1.digest(
              Time.now.to_s + rand().to_s + Process.pid.to_s))
    now = Time.now.iso8601
    digest = Digest::SHA1.digest(nonce + now + @password)
    credentials = "UsernameToken Username=\"#{@username}\", " +
      "PasswordDigest=\"#{Base64.encode64(digest).chomp}\", " + 
      "Nonce=\"#{Base64.encode64(nonce).chomp}\", " +
      "Created=\"#{now}\""
    { "Accept" => "application/x.atom+xml, application/xml, text/xml, */*",
      "X-WSSE" => credentials }
  end
end

id = ARGV.pop
if id==nil
  puts "usage: ruby #{$0} <id>"
  exit
end
photo = HatenaPhoto.new("NAT", "XXXXX") # 引数1つめがユーザ名、2つめがパスワード
puts photo.get(id).to_s.tosjis

使用例はこんな感じ。タイトルや画像URLが取得できる。

C:\home\ruby>ruby hatena-photo-sample.rb 20070502215906
<?xml version="1.0" encoding="utf-8"?>

<entry xmlns="http://purl.org/atom/ns#" xmlns:hatena="http://www.hatena.ne.jp/in
fo/xmlns#">
  <title>山の上の観音崎灯台</title>
  <link rel="alternate" type="text/html" href="http://f.hatena.ne.jp/NAT/2007050
2215906"/>
  <link rel="service.edit" type="application/x.atom+xml" href="http://f.hatena.n
e.jp/atom/edit/20070502215906" title="山の上の観音崎灯台"/>
  <issued>2007-05-02T21:59:06+09:00</issued>
  <author>
    <name>NAT</name>
  </author>
  <id>tag:hatena.ne.jp,2005:fotolife-NAT-20070502215906</id>
  <hatena:imageurl>http://f.hatena.ne.jp/images/fotolife/N/NAT/20070502/20070502
215906.jpg</hatena:imageurl>
  <hatena:imageurlsmall>http://f.hatena.ne.jp/images/fotolife/N/NAT/20070502/200
70502215906_m.jpg</hatena:imageurlsmall>
  <hatena:syntax>f:id:NAT:20070502215906j:image</hatena:syntax>
</entry>

コード的には、WSSE認証のためのHTTPヘッダを作るところでちょっと苦労した。あちこちのサイトでコード例を探したり、リファレンスマニュアルを参照したりしながら書いた。

はてなフォトライフAtomAPIを使って写真を新規投稿するコードも作成中なのだけど、どうもうまくいかない。サーバから"500 Internal Server Error"が返ってくる。送信するXMLの形式が良くないのだろうか。もう少し試行錯誤してみるかな。