Ruby de Google Data API

参考ページ Using Ruby with the Google Data APIs

Rubygemのbloggerモジュールで不足している機能を実現するために、Google Data APIについて学習します。Bloggerモジュールで実現したかったのは定期的な記事修正でしたが、日付指定の記事投稿ができなかったため断念するしかありませんでした。他のモジュールについてはGoogle Data APIを直接扱うものがあり、類似のモジュールがいくつもあります。このため自分にとって何が必要でどのモジュールが適しているのかを判断する必要があります。また、可能ならばbloggerモジュールにコミットしたいと考えています。このような背景からドキュメントを読む必要があると考えました。

以下では、まとめきれていないメモを羅列していくつもりです。

GET (記事の取得)、 POST (記事の投稿)、PUT (既存の記事を更新)

200 (feedやエントリーの取得に成功)、201 (リソース?の作成や更新に成功)、400 (Bad Requiest)

Obtaining and install Ruby

RubyのインストールとXmlSimpleの準備をする。RubyについてはLinuxならすでに用意されているから、aptなどを使うといい。Windowsだったら、Ruby本家のページに行くと様々なパッケージを見つけることができる。XmlSimpleについては、以下のようにしてインストールする。

$ gem install xml-simple

サンプル

require 'net/http'<br />youtube_top_rated_videos_feed_uri = 'http://gdata.youtube.com/feeds/api/standardfeeds/top_rated'<br />uri = URI.parse(youtube_top_rated_videos_feed_uri)<br />p uri.host<br />Net::HTTP.start(uri.host, uri.port) do |http|<br />  puts http.get(uri.path)<br />end

ここではどうやってリクエストを送るかが分かる程度でいい。

Authentication I Using the Google Spreadsheets API

アカウント認証してSpreadsheetsを操作する。

認証には2つの方法がある。AuthSubとClientLogin。AuthSubはウェブアプリケーションのためのもので、token-exchange processを行う方式である。。ClientLoginはインストール型アプリケーションのためのもので、ユーザー名とパスワードをhttps経由でGoogleに送信する方式である。この時、Googleのサービスを判別する文字列も送信する必要があり、Spreadsheets の場合は、wiseとなっている。

サンプル

ここまでで認証が完了したので、次に以下のURLにアクセスしてspreadsheetsを取得してみる

http://spreadsheets.google.com/feeds/spreadsheets/private/full

これは認証済みのリクエストなので、我々のヘッダーで通りたい。実際には、様々なfeedに対しいくつかのリクエストを送信するため、この機能を小さな関数(ここではget_feed)でラッピングするべきである。

サンプル

またも多くのXMLが表示された。ただし、サンプルではぼかされている、これをコマンドラインから解読する心配をしなくてもいいように。もっとユーザーフレンドリーにするために、XmlSimpleを使ってデータ構造へと解釈してみる。

サンプル

(サンプルでspreadsheetの数とspreadsheetキーが取得できているか確認する)

(spreadsheetを作成したことがなければ、feedそのものが生成されておらず、XMLの取得は失敗する。この場合は、http://spreadsheets.google.com/feeds/spreadsheets/private/full にアクセスすると404が返ってくる)

Obtaining worksheets

spreadsheetを掘り下げるためには、以下のような作業が必要になる。

1. spreadsheetのキーを取得する
2. worksheet feed を取得するために、spreadsheetのキーを使う
3. 使いたいworksheetのidを取得する
4. worksheetの内容にアクセスするために、cellsFeedやlistFeedを発行する

cellsFeedとlistFeedは、worksheetのセル内容を代表するもの。listFeedは行を代表するもので、新しいデータをPOSTするのに推奨されている。cellsFeedは各セルを代表するもので、PUTに使われる。詳しくは API documentation を参照してください。

まず、spreadsheetキーを抜き出して、worksheet feedを取得できるようにします。

サンプル

(ここでlistfeedとcellsfeedを取得できているか確認する)

テーブル

listFeedでみるテーブルデータ

サンプル

(ここのサンプルがなぜか実行できない。get_feedを呼び出しているがuse_sslが設定されていないため切断されてしまう。正しくは http://snippets.dzone.com/posts/show/13217)

XMLでは、spreadsheetの最初の行がセルのヘッダーであると仮定し、XMLのヘッダーが生成される。

(次はXMLのサンプルで、最初の行にセルのヘッダーがあると仮定する

次はcellsFeedの例

サンプル

(このサンプルもlistFeedのサンプルと同様の理由で動かない)

totalResultsを確認。hrefと"ref"="edit"を確認。version string = 8srvbs。version stringはPUTで更新するたびに変わる。

Posting content to the listFeed

最初に必要なのは listFeed のための POST リンクである。このリンクは、list feedを要求したときに返される。ref属性のURLを含んでいる。このリンク要素を解析して、href属性を展開する必要がある。まず、postをより簡単にする、小さなメソッドを作ってみよう

サンプル

(このサンプルではなぜかurlを直書きしている。また、listfeedと同様の問題で動かない。以下に、サンプルの改善案を記述しておく)

def post(uri, data, headers)
  uri = URI.parse(uri)
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  return http.post(uri.path, data, headers)
end

post_url = worksheet_data["entry"][0]["link"][0]["href"]

headers["Content-Type"] = "application/atom+xml"

new_row = '<atom:entry xmlns:atom="http://www.w3.org/2005/Atom">' <<
          '<gsx:language xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended">' <<
          'ruby</gsx:language>' <<
          '<gsx:website xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended">' <<
          'http://ruby-lang.org</gsx:website>' <<
          '</atom:entry>'

post_response = post(post_url, new_row, headers)

Using the cellsFeed to update content

cells feed は PUT を好む。R5C1 は5行1列を意味している。これを cellfeed_uri に追加してアクセスしている。

サンプル

(このサンプルもlistfeedと同様の問題で動かない。ここではR5C1の後にあるversion string, 47pc を確認する。)

次に、version stringを抽出するメソッドをつくってみる

サンプル

(このサンプルもlistfeedと以下省略)

PUT を行うメソッドも作ってみる。ここで作る関数は、以下の変数を含む配列を引数にとる。

サンプル

:batch_id毎に結果が返ってくる。

 

 

メモのまとめ

  • ヘッダー
  • http://spreadsheets.google.com/feeds/spreadsheets/private/full
  • spreadsheetキー

コメント

このブログの人気の投稿

git-svnでFILE was not found in commit HASH

[Java] 母音か子音か

ECJをJenkinsに食わせてみた