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)
Ruby はてなブックマーク Atom API WSSE認証
はてなブックマークAtomAPI/はてなフォトライフAtomAPI で使用するWSSE認証のHTTP X-WSSEヘッダを作成するRubyスクリプト
$KCODE = 'u' require 'time' require 'digest/sha1' def hatena_wsse_header(hatena_id, password) # Nonce : HTTPリクエスト毎に生成したセキュリティ・トークン # ランダムなバイト列 http://sheepman.parfait.ne.jp/20050104.html nonce = Array.new(10){ rand(0x100000000) }.pack('I*') nonce_base64 = [nonce].pack("m").chomp # Base64エンコード # Created : Nonceが作成された日時をISO-8601表記で記述したもの now = Time.now.utc.iso8601 # PasswordDigest : Nonce, Created, パスワードを文字列連結しSHA1アルゴリズムでダイジェスト化して生成された文字列を、Base64エンコードした文字列 digest = [Digest::SHA1.digest(nonce + now + password)].pack("m").chomp credentials = sprintf(%Q<UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s">, hatena_id, digest, nonce_base64, now) { 'X-WSSE' => credentials } end