Ruby はてなブックマークの全ブックマークを取得するスクリプト

はてなブックマークAtomAPI FeedURIを使用して全ブックマークを取得するRubyスクリプト
require 'hatena_wsse_header' は d:id:toward:20051225:ruby_hatena_wsse

#!/usr/local/bin/ruby -w

$KCODE = 'u'

require 'net/http'
Net::HTTP.version_1_2
require 'rexml/document'
require 'pstore'
require 'hatena_wsse_header' # はてなブックマーク/はてなフォトライフ AtomAPI WSSE認証 HTTP X-WSSEヘッダを作成


hatena_id = 'hatena_id' # はてなID
password  = 'password'  # パスワード


bookmarks = [] # 全ブックマーク

# 全ブックマークを取得
Net::HTTP.start('b.hatena.ne.jp') do |http|
  offset = 0
  has_next = true
  while has_next
    header = { 'User-Agent' => "Ruby/#{VERSION}" }.update(hatena_wsse_header(hatena_id, password))
    response = http.get('/atom/feed?of=' + offset.to_s, header)
    root = REXML::Document.new(response.body).elements['feed']
    
    total_results  = root.elements['openSearch:totalResults'].text.to_i
    start_index    = root.elements['openSearch:startIndex'].text.to_i
    items_per_page = root.elements['openSearch:itemsPerPage'].text.to_i
    if total_results >= start_index + items_per_page
      offset += items_per_page
    else
      has_next = false
    end
    
    root.elements.each('entry') do |elem|
      bookmark = {}
      bookmark[:title]     = elem.elements['title'].text
      bookmark[:url]       = elem.elements['link[@rel="related"]'].attributes['href']
      bookmark[:hb_url]    = elem.elements['link[@rel="alternate"]'].attributes['href']
      bookmark[:atom_edit] = elem.elements['link[@rel="service.edit"]'].attributes['href']
      bookmark[:eid]       = bookmark[:atom_edit].split('/')[-1]
      bookmark[:issued]    = elem.elements['issued'].text
      bookmark[:summary]   = elem.elements['summary'].text
      bookmark[:tag]       = []
      elem.elements.each('dc:subject') do |tag|
        bookmark[:tag] << tag.text
      end
      bookmarks << bookmark
    end
  end
end


# 全ブックマークをPStoreで保存
db = PStore.new("hatena_bookmark-#{hatena_id}.pstore")
db.transaction do
  db['bookmarks'] = bookmarks
end


# PStoreファイルから全ブックマークを読み込み
bookmarks2 = nil
db2 = PStore.new("hatena_bookmark-#{hatena_id}.pstore")
db2.transaction do
  bookmarks2 = db2['bookmarks']
end
require 'pp'
pp bookmarks2.collect { |i| i[:title] }

ブックマークを公開しているはてなIDは、Atomフィードで同様のことが可能(WSSE認証不要)
23・24行目を変更

    header = { 'User-Agent' => "Ruby/#{VERSION}" }
    response = http.get("/#{hatena_id}/atomfeed?of=" + offset.to_s, header)