2章 その7
Rubyのdelicious用ライブラリのインタフェースが、本に書かれているコードに合わないので適宜自作していくことにした。
あるタグを最近付けられたページの一覧
http://feeds.delicious.com/v2/rss/popular/ruby?count=15
あるページにつけられたユーザのコメント一覧
http://delicious.com/url/2593e8120ff82189c270631baf5c0dd1
この2つのAPIをまず呼べるようにする。get_popular関数とget_urlposts関数として教科書と同じインタフェースで実装した
delicious.rb として同じディレクトリに保存
require 'rubygems' require 'open-uri' require 'rexml/document' require 'cgi' class Delicious # あるタグのpopular postのURLリストを取得 def get_popular(tag, count=15) uri = 'http://feeds.delicious.com/v2/rss/popular/' + tag + '?count=' + count.to_s doc = REXML::Document.new(open(uri).read) results = Array.new #XMLを分解してURLだけ抜き出す REXML::XPath.each(doc, '//item//link()'){ |link| results.push(link.text) } return results end # あるURLをブックマークしているユーザのリスト def get_urlposts(post_url,count=15) md5 = Digest::MD5.hexdigest(post_url) uri = 'http://feeds.delicious.com/v2/rss/url/'+md5+'?count=' + count.to_s doc = REXML::Document.new(open(uri).read) results = Array.new REXML::XPath.each(doc, '//item//title()'){ |user| # [from username] タイトル となっているので、そこからユーザ名だけ抜き出す results.push(user.text.split('[from ')[1].split(']')[0]) } return results end end
p.21より、最近あるワードに言及したユーザのリストを手に入れる。
あるワード(タグ)がついて最近投稿されたURL一覧をget_popularで取ってきて、そのURLからget_urlpostsでユーザ一覧をgetする
deliciousrec.rb として保存
require 'delicious.rb' class Rec def initialize @del = Delicious.new end def initializeUserDict(tag, count=5) user_dict = Hash.new # popularな投稿をcount番目まで取得 @del.get_popular(tag, count).each{ |p1| #このリンクを投稿したすべてのユーザを取得 @del.get_urlposts(p1).each{ |p2| user = p2 user_dict[user] = Hash.new } } return user_dict end end
delicious.rb, deliciousrec.rbと同じディレクトリで
irb
irb [~/src/ruby/collective] >> require 'deliciousrec.rb' => true >> rec = Rec.new => #<Rec:0x64017c @del=#<Delicious:0x640154>> >> rec.initializeUserDict('programming') => {"ejpusa"=>{}, "carloslucas"=>{}, "chairraver"=>{}, "blence"=>{}, "ins3cure"=>{}, "mmkassem"=>{}, "brmichel"=>{}, "signalkorps"=>{}, "gonium"=>{}, "ychian"=>{}, "ifelse"=>{}, "headuphigh"=>{}, "mattriffle"=>{}, "illectron"=>{}, "inferis"=>{}, "pilhofer"=>{}, "gahat"=>{}, "ajinjin"=>{}, "aliveguy77"=>{}, "yeah_its_me"=>{}, "parisgraphics"=>{}, "andreia"=>{}, "peteog"=>{}, "trcasey"=>{}, "mpouse"=>{}, "bjcolson"=>{}, "emincan"=>{}, "Marcelous"=>{}, "misterc"=>{}, "gumbright"=>{}, "aka.delicious"=>{}, "sa_aa"=>{}, "freddiedubya"=>{}, "mickeyckm"=>{}, "dustandmold"=>{}, "leandro.saad"=>{}, "bigtrouble77"=>{}, "lastps"=>{}, "bqtran"=>{}, "perfect_man"=>{}, "cglee"=>{}, "bdawson"=>{}, "shimazu"=>{}, "cwallen_net"=>{}, "gingle"=>{}, "pantagruel"=>{}, "megabit01"=>{}, "bit3725"=>{}, "balloonguy"=>{}, "ewBookmarks"=>{}, "dburger"=>{}, "v8media"=>{}, "ruriko"=>{}, "_tsv_"=>{}, "rhmoraes"=>{}, "evilpenguin84"=>{}, "osterman"=>{}, "enzo.aquino"=>{}, "henrikp"=>{}, "D4rKr0W"=>{}, "kobyv"=>{}, "sridhar"=>{}, "clever.netman"=>{}, "pacifix"=>{}, "jyke"=>{}, "dcourtney98"=>{}, "herrmann"=>{}, "chrismay"=>{}, "Onco"=>{}, "inggy"=>{}, "jemerick"=>{}} >>
programmingタグに関係のありそうなdeliciousユーザの一覧が取れた