google readerのスター付きアイテム全件を取得して編集する

google reader apiを使って、スター付きアイテムを棚卸したときの備忘。

OAuth認証

GoogleのOAuthを試してみた | スマートネットワーク 開発ブログを参考にアプリケーションを登録して、consumer keyとconsumer secretを取得。


OAuth gemでGoogle カレンダー APIからデータを取得する - modkaの日記の「アクセス・トークンとトークン・シークレットを取得する」のコードを拝借。

今回はgoogle readerを操作したいので、'SCOPE'を'http://www.google.com/calendar/feeds/'から'https://www.google.com/reader/api'に変更して、access tokenとaccess secretを取得。

スター付きアイテムのJSONを取得してローカルに保存

iPhoneを買ったあとでlivedoor readerからgoogle readeに乗り換えたので、2010年3月から1300個くらいのスター付きアイテムがあった。

continuationってのを返してくれて、次のrequest parameterに入れておけば続きを読めるので、とてもラク

# -*- coding: utf-8 -*-

require 'rubygems'
require 'oauth'
require 'json'

CONSUMER_KEY= '取得したconsumer key'
CONSUMER_SECRET = '取得したconsumer secret'
ACCESS_TOKEN = '取得したaccess token'
ACCESS_TOKEN_SECRET = '取得したaccess secret'
SCOPE = 'https://www.google.com/reader/api'

consumer = OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET, {
                                 :signature_method => 'HMAC-SHA1',
                                 :site => SCOPE,
                               })

access_token = OAuth::AccessToken.new(consumer, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)


# JSONを取得して保存する
STARRED_URL = "#{SCOPE}/0/stream/contents/user/-/state/com.google/starred?n=100"
JSON_DIR = "./json"
Dir::mkdir(JSON_DIR) unless File::exists? JSON_DIR
t = Time.now.strftime("%Y_%m_%d_%H_%M")
i = 0

while true
  request_url = STARRED_URL
  request_url = request_url + "&c=" + @continuation if @continuation
  puts "#{i}: #{request_url} ..."
  body = JSON.parse(access_token.get(request_url).read_body)
  File::open(JSON_DIR + "/#{t}_#{sprintf('%04d', i)}.json", "w") do |f|
    body["items"].each { |item| f.puts item.to_json}
  end
  @continuation = body["continuation"]
  break unless body["continuation"] && body["items"] && !body["items"].empty?
  i += 1
end

スターを外す

# -*- coding: utf-8 -*-

require 'rubygems'
require 'oauth'
require 'uri'

CONSUMER_KEY= '取得したconsumer key'
CONSUMER_SECRET = '取得したconsumer secret'
ACCESS_TOKEN = '取得したaccess token'
ACCESS_TOKEN_SECRET = '取得したaccess secret'
SCOPE = 'https://www.google.com/reader/api'
TAG_ID = URI.encode('user/-/state/com.google/starred')
ACTION = 'edit'
TOKEN_RUL = "#{SCOPE}/0/token"

consumer = OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET, {
                                 :signature_method => 'HMAC-SHA1',
                                 :site => SCOPE,
                               })

access_token = OAuth::AccessToken.new(consumer, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
token = access_token.get(TOKEN_RUL).read_body

# スターを順に消去していく
t = Time.now.to_i
post_url = "#{SCOPE}/0/edit-tag?ck=#{t}&client=script"
# idは取得したJSONの各itemの中のidを指定
id_targets = ["tag:google.com,2005:reader/item/2d0f46c78cde9d60", "tag:google.com,2005:reader/item/01e089ad5c951839"]
id_targets.each do |id|
  body = { }
  body["i"] = URI.encode(id)
  body["r"] = TAG_ID  # スターを付けるときは、"r"ではなく"a"とする
  body["ac"] = ACTION
  body["T"] = token

  # postを投げて実行
  puts "#{id}: #{access_token.post(post_url, body)}"
end