はてなブックマークをダウンロードするスクリプト

どっくりびんきー

はてなブックマークをダウンロードするスクリプトを書いてみました。はてなブックマークのサイトにアクセスして、各日ごとにXML形式で指定したディレクトリにブックマークを保存します。
ファイルhbl

#!/usr/bin/env ruby
# -*- ruby -*-
# $Id: hbl,v 1.2 2005/07/29 22:25:03 s-tanaka Exp $

require 'open-uri'
require 'digest/sha1'
require 'base64'
require 'rexml/document'

def get_wsse(user, pass)
  created = Time.now.iso8601

  nonce = ''
  20.times do 
    nonce << rand(256).chr
  end
  
  passdigest = Digest::SHA1.digest(nonce + created + pass)

  return "UsernameToken Username=\"#{user}\", " +
    "PasswordDigest=\"#{Base64.encode64(passdigest).chomp}\", " + 
    "Nonce=\"#{Base64.encode64(nonce).chomp}\", " +
    "Created=\"#{created}\""
end

def http_get(uri, user, pass)
  open(uri, 'X-WSSE' => get_wsse(user, pass)) do |http|
    return http.read
  end
end

if ARGV.size < 3
  $stderr.puts "usage: hbl [user] [pass] [dir]"
  exit 1
end

user = ARGV[0]
pass = ARGV[1]
dir  = ARGV[2]
dir = $` if dir =~ /\/$/

date = 'latest'
uri = "http://b.hatena.ne.jp/atom/feed?date=#{date}"
loop do
  puts date

  feed = http_get(uri, user, pass)

  open("#{dir}/#{date}.xml", 'w') do |file|
    file.write feed
  end

  doc = REXML::Document.new(feed)
  isnext = false
  doc.elements.each('feed/link') do |elem|
    next if elem.attributes['rel'] != 'prev'
    uri = elem.attributes['href']
    next if uri !~ /(\d\d\d\d\d\d\d\d)$/
    date = $1
    isnext = true
  end
  break unless isnext
end

実行例。hblコマンドの引数として、はてなのユーザ名、はてなのパスワード、ブックマークを保存するディレクトリを指定します。

$ hbl ha-tan XXXX .
latest
20050729
...

Rubyのライブラリ万歳です。楽すぎ。