はてなフォトライフ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の形式が良くないのだろうか。もう少し試行錯誤してみるかな。