いろいろ
Seize the day.
2007-05-06 [長年日記]
■ [blog][comp] buzzurl や del.icio.us のブックマーク件数を JSON で取得して表示する Ruby スクリプト
はてなブックマーク [2007-01-28],livedoor クリップ [2007-02-10] に続いて,buzzurl と del.icio.us のブックマーク件数を取得する Ruby スクリプトを書いてみた.API がなくて JSON しか提供されてないので,自分の生半可な知識では手のつけようがない.というわけで,JSON parser というのをありがたく頂戴してくる. まず,buzzurl 用は以下.
#!/usr/bin/ruby
#http://webos-goodies.jp/archives/51019710.html
require 'jsonparser'
#require 'open-uri'
require 'net/http'
class BuzzurlBookmarkCounter
def count urls
api = "/api/counter/v1/json?url="
urls.each_with_index{|url, i|
api = api + "&url=" unless i == 0
api = api + url
}
api = api.gsub(/\#/,'%23')
src = ''
Net::HTTP.version_1_2
Net::HTTP.start('api.buzzurl.jp', 80) {|http|
response = http.get(api)
src = response.body
}
# open(api) do |file|
# src = file.read
# end
parser = JsonParser.new
json = parser.parse(src)
result = Hash.new
json.each do |item|
result.store("#{item['url']}", "#{item['users']}".to_i)
end
urls.each do |item|
result.store(item, 0) unless ( result.key?(item) )
end
return result
end
end
if __FILE__ == $0
if ARGV.size != 1
print "usage: #{__FILE__} <urls>\n"
exit
else
result = BuzzurlBookmarkCounter.new.count(*ARGV)
result.each do |url, count|
puts "#{url} #{count}"
end
end
end
del.icio.us 用は以下.
#!/usr/bin/ruby
#http://webos-goodies.jp/archives/51019710.html
require 'jsonparser'
#require 'open-uri'
require 'net/http'
require 'kconv'
class DeliciousBookmarkCounter
def count urls
api = "/feeds/json/url/blogbadge?url="
urls.each_with_index{|url, i|
api = api + "&url=" unless i == 0
api = api + url
}
api = api.gsub(/\#/,'%23')
src = ''
Net::HTTP.version_1_2
Net::HTTP.start('badges.del.icio.us', 80) {|http|
response = http.get(api)
src = response.body
}
# api = "http://badges.del.icio.us" + api
# open(api) do |file|
# src = file.read
# end
# src = src.toeuc
src = src.tojis
parser = JsonParser.new
begin
json = parser.parse(src)
rescue Exception => e
# return e.backtrace
result = {"" => 0}
return result
end
result = Hash.new
json.each do |item|
result.store("#{item['url']}", "#{item['total_posts']}".to_i)
end
urls.each do |item|
result.store(item, 0) unless ( result.key?(item) )
end
return result
end
end
if __FILE__ == $0
if ARGV.size != 1
print "usage: #{__FILE__} <urls>\n"
exit
else
result = DeliciousBookmarkCounter.new.count(*ARGV)
result.each do |url, count|
puts "#{url} #{count}"
end
end
end
URL を引数に取ればコマンドラインから使えるし,以下のような検証用スクリプトも多分使えると思う (はてな,livedoor 用のコードも入ったままですが).
!#/usr/bin/ruby
require 'hatena_bookmark_counter'
require 'livedoor_clip_counter'
require 'delicious_bookmark_counter'
require 'buzzurl_bookmark_counter'
pml = "http://nao.s164.xrea.com/td/2007-04-19.html"
url = [pml,"#{pml}#p01","#{pml}#p02" ]
total = 0
total2 = 0
total3 = 0
total4 = 0
result = HatenaBookmarkCounter.new.count(url)
result2 = LivedoorClipCounter.new.count(url)
result3 = DeliciousBookmarkCounter.new.count(url)
result4 = BuzzurlBookmarkCounter.new.count(url)
puts "-- hatena\n"
puts result
result.each do |url, count|
total += count
end
puts total
puts "-- livedoor\n"
puts result2
result2.each do |url, count2|
total2 += count2
end
puts total2
puts "-- del.icio.us\n"
puts result3
result3.each do |url, count3|
total3 += count3
end
puts total3
puts "-- buzzurl\n"
puts result4
result4.each do |url, count4|
total4 += count4
end
puts total4
ちなみに Ruby の勉強は遅々として進んでないので,コードとしてはダメダメなはずです.すいません.なんで open-uri じゃなくて NET:HTTP でやっているかというと,del.icio.us の場合になぜかうまく動かなかったから.謎.buzzurl のほうは open-uri でいけると思う.
あと,3 日間くらいハマッたのが,del.icio.us の JSON フィードにマルチバイト文字が含まれてる場合に,JSON parser が Syntax Error を投げてくる件.UTF-8 なフィードしか扱わないはずなのに,なぜかフィードを JIS にしたら解決してしまった.激しく謎.しかも再現性がどうもあやしく,EUC にして解決したこともあった.なので,とりあえず例外が来たらダミーを返すようにしてあります.
上記 2 件の謎は,単独コードでテストしたときには発生しないので,tDiary の何かと干渉してたりするのかも知れない.
あと,SBS 側のサービスが死んでた時のために,ほんとは Timeout::Error をちゃんと拾ってあげるべきなんだろうね.さぼってるけど.
さて,おかげでトップページが随分重くなってしまって,たまにコンテンツ生成に失敗するようになってしまったので,個別記事へのアクセス時にのみ,ブックマーク件数を表示させるようにした.単に tDiary の comment_new から comment_description に移しただけだが (使い方間違ってる),だいぶ軽くなったとは思います.
どんな感じになったのかは,とりあえずうちの唯一のホッテントリ [2007-04-19] でも眺めてみて下さいw
[ ツッコミ | permalink | trackback ]
[TrackBack URL: http://nao.s164.xrea.com/td/tb.rb/20070506]
[(注) スパム対策のため,言及リンクのないトラックバックは受け付けていません.]
[(注) スパム対策のため,言及リンクのないトラックバックは受け付けていません.]
本日のリンク元
検索
- キーワード不明 ×12 / json each ×10 / JSON parser ×7 / del.icio.us total_posts ×3 / JSON each ×3 / xrea json ×3 / xrea ruby "http.start" ×2 / JsonParser Syntax error マルチバイト ×2 / ruby json parse ×2 / ruby require json ×2 / del.icio.us json 件数 ×2 / ruby json 取得 ×2 / json parser ×2 / Buzzurl API ×2 / del.icio.us count ×2 / json syntax error () ×1 / del icio us JSON ブックマーク 件数 ×1 / JSON 取得 ×1 / Buzzurl ブックマーク数 取得 ×1 / delicious api json ×1 / del.icio.us 件数 表示 ×1 / json .open ×1 / del.icio.us API 使い方 ×1 / ruby http 取得 ×1 / json require 'open-uri' ×1 / del.icio.us API 件数 ×1 / json 取得 表示 ×1 / json parser syntax error ×1 / json key each ×1 / del.icio json ×1 / delicious API JSON ×1 / open-uri ×1 / buzzurl ブックマーク数 取得 ×1 / Ruby json ×1 / del.icio.us 件数取得 ×1 / j-son file ×1 / "del.icio.us" ブックマーク数 php ×1 / web api json マルチバイト ×1 / json read ×1 / json parser new ×1 / if __FILE__ == $0 ×1 / json count ×1 / json ruby file ×1 / json xrea ×1 / json src 表示 ×1 / new JSON ×1 / del.icio.us クリップ数 ×1 / ruby api require json ×1 / JSON parse ×1 / jsonparser ruby ×1 / json euc ×1 / JSON Parser ×1 / buzzurl 件数 ×1 / del.icio.us ruby ×1 / buzzurl api UTF-8 ×1 / ajax json delicious api ×1 / delicious JSON recent API ×1 / del.icio.us クリップ数 表示 ×1 / ruby 更新 の 取得 net/http ×1 / delicious ブックマーク数 合計 hash ×1 / json eval each ×1 / json 件数 ×1 / ruby json ×1 / del.icio.us ブックマーク件数 ×1 / delicious count ×1 / Json Syntax Error ruby ×1 / JSON item ×1 / del icio us はてな livedoor 件数 ×1 / Json each ×1 / del.icio.usブックマーク件数 ×1 / json 取得 ×1 / del.icio.us ブックマーク カウント ×1 / Buzzurl API ブックマーク ×1 / json new URL ×1 / delicious ホッテントリ ×1 / delicious api 日本語 ×1 / count 取得 ruby ×1 / json ruby ×1 / buzzurl api ×1 / json parse ×1 / json hash 取得 ×1 / del.icio.us tdiary ×1 / json ruby bookmark ×1 / url 取得 ruby ×1 / del.icio.us counter ×1 / JSON Parse Error [Syntax Error] ×1 / delicious 件数 取得 ×1 / buzzurl json ×1
以下の広告はサーバによって自動的に挿入されています.
Copyright © 2004-2006, nao. All rights reserved.





