SBM からエントリを一括削除
投稿者: alvin 日付: 水, 2006-12-13 02:09
SBM から、すべてのエントリを一括削除する Ruby スクリプトです。
このスクリプトを使用する場合は、あらかじめ SBM をバックアップ(エクスポート)
しておくことをお勧めします。
スクリプトは、次の SBM について作成しています。
はてなブックマークからエントリを一括削除
ソースコード
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 |
[初版] はてなブックマーク版
|
|