SBM からエントリを一括削除

 

SBM から、すべてのエントリを一括削除する Ruby スクリプトです。 このスクリプトを使用する場合は、あらかじめ SBM をバックアップ(エクスポート) しておくことをお勧めします。 スクリプトは、次の SBM について作成しています。

SBM 使用するAPI 使用するライブラリ
はてなブックマーク はてなブックマークAtomAPI net/http, rexml/document, digest/sha1, time
del.icio.us Developers 》 API 》 Posts net/https, rexml/document

はてなブックマークからエントリを一括削除

ソースコード

WSSE認証により、ブックマークの編集権を取得します。 1エントリ削除するのに、http.get ではなく http.delete を使用しています。

del_hatena_bookmark.rb
#!/usr/bin/ruby -Ku

require 'net/http'
require 'digest/sha1'
require 'rexml/document'
require 'time'

Net::HTTP.version_1_2

username = '<username>'     # はてなユーザID
password = '<password>'     # パスワード

# WSSE認証ヘッダを作成
def x_wsse(username, password)
    nonce   = Array.new(10){ rand(0x100000000) }.pack('I*')
    created = Time.new.utc.iso8601
    digest  = Digest::SHA1.digest(nonce + created + password)
    wsse    = "UsernameToken Username=#{username}, ",
              "PasswordDigest=#{[digest].pack('m').chomp}, ",
              "Nonce=#{[nonce].pack('m').chomp}, ",
              "Created=#{created}"
    { 'x-wsse' => wsse.to_s }
end

Net::HTTP.start('b.hatena.ne.jp') { |http|
    next_page = true
    while next_page
        header = x_wsse(username, password)
        body   = http.get("/atom/feed", header).body    # エントリの一覧を1ページ分取得
        doc    = REXML::Document.new body
        doc.elements.each('feed/entry/id') { |id|
            eid = id.text.scan(%r|^.*-([0-9]+)$|).to_s
            print "delete #{eid} ... "
            header = x_wsse(username, password)
            code   = http.delete("/atom/edit/#{eid}", header).code      # 1エントリ削除
            puts code == '200' ? "OK" : "NG(#{code})"
        }
        next_page = doc.elements['feed/link[@rel="next"]'] ? true : false;
    end
}

実行結果のサンプル

$ chmod 744 del_hatena_bookmark.rb
$ ./del_hatena_bookmark.rb
delete 3082754 ... OK
delete 1028861 ... OK
delete 3073621 ... OK
delete 3073527 ... OK
delete 3061152 ... OK
delete 672945 ... OK
delete 119283 ... OK
delete 1518320 ... OK
delete 1052093 ... OK
delete 2006169 ... OK
(以下省略)

del.icio.us からエントリを一括削除

ソースコード

Basic認証により、ブックマークの編集権を取得します。

del_delicious.rb
#!/usr/bin/ruby -Ku

require 'net/https'
require 'rexml/document'

Net::HTTP.version_1_2
$stdout.sync = true         # 標準出力をバッファリングしない

username = '<username>'     # del.icio.us ユーザ名
password = '<password>'     # パスワード

host     = 'api.del.icio.us'
path_all = '/v1/posts/all'
path_del = '/v1/posts/delete?url='
header   = { 'User-Agent' => 'del_delicious.rb v1.0' }

http = Net::HTTP.new(host, 443)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
http.start { |http|
    req = Net::HTTP::Get.new(path_all, header)
    req.basic_auth(username, password)
    res = http.request(req)                         # 全件取得
    xml_all = REXML::Document.new(res.body)
    xml_all.elements.each('posts/post') { |item|
        sleep 1
        title = item.attributes['description']
        url = item.attributes['href']
        req = Net::HTTP::Get.new(path_del + url, header)
        req.basic_auth(username, password)
        res = http.request(req)                     # 1件、削除
        xml_del= REXML::Document.new(res.body)
        code = xml_del.elements['result'].attributes['code']
        puts "#{code} : #{title}"                   # 削除の結果
    }
}

実行結果のサンプル

$ ruby --version
ruby 1.8.5 (2007-03-13 patchlevel 35) [i386-linux]
$ chmod 700 del_delicious.rb
$ ./del_delicious.rb
done : タイトル1
done : タイトル2
done : タイトル3
done : タイトル4
done : タイトル5
~ 続く ~

改版履歴

日付 内容
2007-03-31 [追加] del.icio.us 版
2006-12-13 [初版] はてなブックマーク版