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