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ユーザの一覧が取れた