SBM - コメントを取得

 

SBM に投稿されたコメントを取得するための Ruby スクリプト(サンプル)を作成しました。 ブログのコメント機能を SBM に置き換えることを念頭に置いていますが、 このサンプルは、指定した URL に付けられたコメントを取ってくるだけです。 サンプルは、次の SBM について作成しています。

SBM使用するAPI使用するライブラリ
はてなブックマーク はてなブックマークエントリー情報取得API net/http, json
del.icio.us RSS feeds net/http, rexml/document, digest/md5
livedoor clip (なし) net/http, hpricot

使用するライブラリの中で、 json (JSONパーサ) と hpricot (XPath対応HTMLパーサ) は標準ライブラリではありませんが、コマンドラインで「gem install json」 のように入力するだけで簡単にインストールすることができます。

ソースコード

いずれの SBM についても同じ手順で処理します。 SBM から返されたデータを解析して、コメントが存在するエントリだけを配列 comments に格納します。 そして最後に、comments の中をまとめて出力します。

はてなブックマーク

はてなブックマークから返される JSON は括弧で囲まれています。 この括弧が存在するとライブラリ側で JSON として認識しないので、 括弧を除去する処理を入れてあります。

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

require 'net/http'
require 'rubygems'
require 'json'          # gem install json

Net::HTTP.version_1_2

url = 'http://diaspar.jp/node/142'

comments = []

host = 'b.hatena.ne.jp'
path = '/entry/json/' + url
body = Net::HTTP.start(host, 80).get(path).body
json = JSON.parse(body.sub!(%r!^\((.*)\)$!) { $1 })

json['bookmarks'].each { |item|
    if item['comment'] != ''
        comments.push({
            :date => item['timestamp'][0..9].gsub(%r!/!, '-'),
            :user => item['user'],
            :cmnt => item['comment']
        })
    end
}

comments.each { |item|
    puts item[:date] + " : " + item[:user] + " : " + item[:cmnt]
}

del.icio.us

2007年3月現在、公式ドキュメントには、 リクエストの形式を「del.icio.us/rss/url?url=http://www.example.com/」 とするように書かれています。 しかし、実際には「http://del.icio.us/rss/url/[MD5 HASH]」とするのが正しいです。

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

require 'net/http'
require 'digest/md5'
require 'rexml/document'

Net::HTTP.version_1_2

url = 'http://diaspar.jp/node/142'

comments = []

host = 'del.icio.us'
path = '/rss/url/' + Digest::MD5.hexdigest(url)
body = Net::HTTP.start(host, 80).get(path).body
xml  = REXML::Document.new(body)

xml.elements.each('rdf:RDF/item') { |item|
    if item.elements['description']
        comments.push({
            :date => item.elements['dc:date'].text[0..9],
            :user => item.elements['dc:creator'].text,
            :cmnt => item.elements['description'].text
        })
    end
}

comments.each { |item|
    puts item[:date] + " : " + item[:user] + " : " + item[:cmnt]
}

livedoor clip

当初は hpricot ではなく scrapi を使用して作り始めたのですが、 CSSセレクタを使用してコメントを抽出する方法を見つけられなかったので断念しました。 hpricot で XPath を使用すると、この問題を難なくクリアできます。

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

require 'net/http'
require 'rubygems'
require 'hpricot'       # gem install hpricot

Net::HTTP.version_1_2

url = 'http://diaspar.jp/node/142'

comments = []

host = 'clip.livedoor.com'
path = '/page/' + url
body = Net::HTTP.start(host, 80).get(path).body
node = Hpricot(body).at('table[@id="tkclipusrbox"]/tr[1]')

while node
    date = node.search('td[@class*="tkcliptime"]/text()').to_s
    date = date.sub(%r!(.*)年(.*)月(.*)日!) { "#{$1}-#{$2}-#{$3}" }
    user = node.search('a[@class="tkclipusrid"]/text()').to_s
    cmnt = node.search('td[@class="tkclipusrinfo"]/text()').to_s.strip
    if user != '' && cmnt != ''
        comments.push({ :date => date, :user => user, :cmnt => cmnt })
    end
    node = node.next_sibling
end

comments.each { |item|
    puts item[:date] + " : " + item[:user] + " : " + item[:cmnt]
}

実行結果

同一の URL「http://diaspar.jp/node/142」について、 はてなブックマーク、del.icio.us、livedoor clip の順にコメントを取得しています。

$ ruby --version
ruby 1.8.5 (2006-08-25) [i386-linux]
$
$ chmod 744 hatena_bookmark.rb
$ ./hatena_bookmark.rb
2007-03-10 : numbur9 : Firefox 拡張機能コレクション | Diaspar Journal  自分の嗜好に合っているのがいくつか
2007-03-09 : Back : 拡張機能まとめ
2007-03-06 : jazzfantasista : []
2007-03-05 : sudo44ug : アイコン付きでわかりやすい
2007-03-05 : schahrazade : Firefox plugin
2007-03-05 : manpukuya : こういうページはたくさんあれど、たいてい知らないアドオンが入っているからブックマークしちゃう。
2007-03-05 : teruya : いろいろ便利。使い方わからないのもいくつかw
2007-03-05 : udy : PageConcater知らなかった。これこそ求めていたもの。
2007-03-05 : nakakoh : firefox
2007-03-05 : forcutie :  アドオン
2007-03-05 : azuhata : わんこのみみ
2007-03-05 : authorNari : まとめ
2007-03-05 : aratako0 : 便利そうなものもあり。そろそろfirebugかな。
2007-03-05 : kennsu : 拡張機能コレクション
2007-03-05 : hideAki : Firefox 拡張機能コレクション
2007-03-05 : klangfarbe : firefox,addon,まとめ,使える
2007-03-05 : firewindow : あとで読んでおく
2007-03-05 : kotukotu_G : Firefoxの拡張機能。あとで、これをいれる。
2007-03-04 : huchi : Search Status:ステータスバーに PageRank と Traffic Rank を表示
2007-03-04 : kazz7 : ああ……まだ試していない、いや知らなかった拡張がこんなにも。それにしてもPageConcaterはいいですね。
2007-03-04 : eggist77 :  Firefox 拡張機能コレクション
2007-03-04 : an111 : アドオン
2007-03-04 : news_chirami :  Firefoxの拡張機能に関する記事です。Firefoxの拡張機能にはデバッグツールなどもありますので検討してみてはいかがでしょうか?
2007-03-04 : hsato_00 : firefox extension debug develeopment
2007-03-04 : myrmecoleon : けっこう使えそうなのあるな
2007-03-04 : syouyu-raamen : 便利なエクステンションのまとめ
2007-03-04 : yoshiii : これだから、FFは使いやすいのですよ~~。IEから主流をとる日が来るといいのに~~~!
2007-03-04 : wacky : 情報収集/サイトやページの統計/Web開発のためのFirefox拡張機能を紹介。
$
$ chmod 744 delicious.rb
$ ./delicious.rb
2007-03-17 : tzsn : 数多くの素晴らしい Firefox 拡張機能の中から、愛用しているものを中心に、 これから活用したいと考えているものも併せて紹介します。
2007-03-05 : yosshi :   Firefox 拡張機能コレクション | Diaspar Journal このエントリーを含むブックマーク
2007-03-05 : naoK : あーとーでー
2007-03-05 : uddy : PageConcater知らなかった。これこそ求めていたもの。
2007-03-04 : Mr.10000volt : 数多くの素晴らしい Firefox 拡張機能の中から、愛用しているものを中心に、 これから活用したいと考えているものも併せて紹介します。 コレクションの傾向は次のような感じです。
2007-03-04 : muney : 数多くの素晴らしい Firefox 拡張機能の中から、愛用しているものを中心に、 これから活用したいと考えているものも併せて紹介します。 コレクションの傾向は次のような感じです。
2007-03-04 : tada01 : 数多くの素晴らしい Firefox 拡張機能の中から、愛用しているものを中心に、 これから活用したいと考えているものも併せて紹介します。 コレクションの傾向は次のような感じです。
$
$ chmod 744 livedoor_clip.rb
$ ./livedoor_clip.rb
2007-03-13 : bfscan : 数多くの素晴らしい Firefox 拡張機能の中から、愛用しているものを中心に、 これから活用したいと考えているものも併せて紹介します。 コレクションの傾向は次のような感じです。
2007-03-06 : kathewka : なかなか見ない拡張も多く、それでいて非常に有用です
2007-03-05 : blueinv : Firefox 拡張機能コレクション | Diaspar Journal
2007-03-05 : xcezx : PageConcater

更新履歴

日付 内容
2007-03-24 初版