harry’s memorandum

おれおれメモ

ruby の googlereaderライブラリ で Google Reader API を使ってみた

結構便利。

インストール

最初はgooglereaderライブラリをインストール。

 $ sudo gem install googlereader

認証

これだけでOK. これはgooglreaderライブラリじゃなくて一緒にインストールしたgooglebaseライブラリの機能ですね。

require 'rubygems'
require 'google/reader'
require 'pp'
 
config =  { :email => "example@gmail.com" , :password => "mypassword" }
pp Google::Base.establish_connection(config[:email], config[:password])

結果こんな感じに。

warning: peer certificate won't be verified in this SSL session
#<Google::Base:0x2b5ed7901210
 @email="example@gmail.com",
 @password="mypassword",
 @sid=
  "DQAAAHkAAADmvlp1cjxsJvuR_C4nHXxHCfPC7AC4pAGUkMkd-qIp7fkcHyQB8ILAdR_eS_MTd86ZQyu-1CjMAPchL0fNXFgWsqEl0hCZ_BHNh2fpbqdsAK4yLP2sNozQyih60lxxDI7GkyV_WEDED5j3mYAML8xmf9KCl1b8NpChVZNwqDSROw">

SSLの警告

でもwarningがでてた。以下を追加すればいいみたい。
http://www.5dollarwhitebox.org/drupal/node/64

class Net::HTTP
  alias_method :old_initialize, :initialize
  def initialize(*args)
    old_initialize(*args)
    @ssl_context = OpenSSL::SSL::SSLContext.new
    @ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
  end
end

Googleアカウントのsidとtoken

結構重要。

config =  { :email => "example@gmail.com" , :password => "mypassword" }
cnn = Google::Base.establish_connection(config[:email], config[:password])

puts cnn.sid
 #=> DQAAAHoAAAATvLdZ_QOcge_R5OOm4ZLL8oK86YluqOvfPkzPiY4KbwGJg3sNlvNlbvx8h3wFdQThQ1lFgo724_nHZGKyCqQsYEmXEUgrEFh4BH99vRmX3rV7Ab_kWPng5lWfZEy85583Jn7eBI5Qtz-KzUZ_xIDAYeYxhDc4UUscJyAd7d1sOA
puts Google::Reader::Base.get_token
 #=> KLWHOyYBAAA.Jq5UlKPYuleY5CeK8SGq4w.t-Oo2RGpMbDRIRPwW5gh3A

未読件数を取得

reading-listというやつが総未読数になるっぽい。

p Google::Reader::Count.all[0].count
 #=> 15
Google::Reader::Count.all.each {|feed|
  puts "count:#{feed.count} google_id:#{feed.google_id}"
}
 #=> count:15 google_id:user/09054545224190070545/state/com.google/reading-list
 #=> count:7 google_id:feed/http://blog.goo.ne.jp/newseko/rss2.xml
 #=> count:8 google_id:feed/http://ichita.blog.so-net.ne.jp/index.rdf

すべてのラベルを取得

starred, shared, blogger-following, というのが予約であるっぽい。broadcast というラベルも出てきた気がする。

pp  Google::Reader::Label.all.map {|label|label.name}
 #=> ["starred", "shared", "jimin", "minshu", "broadcast", "blogger-following"]

ラベルを指定して取得

おっと、山本一太が未読だったか。まあいいや。

pp  Google::Reader::Label.new("jimin")
 #=> #<Google::Reader::Label:0x2abd8d707810 @count=0, @name="jimin", @shared=true>

Google::Reader::Label.new("jimin").entries.each {|feed|
  puts "#{feed.links[0].href} #{feed.title}"
}
 #=> http://ichita.blog.so-net.ne.jp/2010-01-17 政権党VS検察という異様
 #=> http://ichita.blog.so-net.ne.jp/2010-01-16-4 50にして惑う政治家
 #=> http://ichita.blog.so-net.ne.jp/2010-01-16-3 中曽根弘文後援会、14年ぶりの挨拶

未読を既読に変更

これで山本一太のアイテムはすべて既読になりました。良かった良かった。

token = Google::Reader::Base.get_token
state = Google::Reader::State::READ

unread = Google::Reader::Label.new("jimin").entries(:unread, :n => 10)
while true
  break if unread.size == 0
  unread.each {|feed|
    ret = Google::Base.post(url, :form_data => {:i => feed.id, :a => state, :T => token})
    puts "#{ret}: #{feed.title} #{feed.links[0].href}"
  }
  unread = Google::Reader::Label.new("jimin").entries(:unread, :n => 10, :c => unread.continuation)
end

 #=> OK: 建設業界の悲鳴 http://ichita.blog.so-net.ne.jp/2010-01-16-2
 #=> OK: 小沢幹事長が失脚したら... http://ichita.blog.so-net.ne.jp/2010-01-16-1
 #=> OK: 山本一太が組みたいと思う政治家 http://ichita.blog.so-net.ne.jp/2010-01-16

購読しているフィードを解除

Google::Base.post をちょろっと変更するだけです。ここのEditAPIを参照。
2010/01/30追加

config =  { :email => "example@gmail.com" , :password => "mypassword" }
cnn = Google::Base.establish_connection(config[:email], config[:password])

Google::Reader::Base.establish_connection(config[:email], config[:password])
token = Google::Reader::Base.get_token
url = Google::Reader::SUBSCRIPTION_EDIT_URL

Google::Reader::Subscription.all.each {|feed|
  id = feed.google_id
  ret = Google::Base.post(url, :form_data => {:s => id, :ac => 'unsubscribe', :T => token})
  puts [ret,id].join(":")
}

フィードを新たに登録

2010/01/30追加

config =  { :email => "example@gmail.com" , :password => "mypassword" }
cnn = Google::Base.establish_connection(config[:email], config[:password])

Google::Reader::Base.establish_connection(config[:email], config[:password])
token = Google::Reader::Base.get_token
url = Google::Reader::SUBSCRIPTION_EDIT_URL

%w(
 http://blog.goo.ne.jp/newseko/rss2.xml
 http://ichita.blog.so-net.ne.jp/index.rdf
 http://katsuya.weblogs.jp/blog/atom.xml
).each {|feed|
  id = "feed/#{feed}"
  ret = Google::Base.post(url, :form_data => {:s => id, :ac => 'subscribe', :T => token})
  puts [ret,id].join(":")
}