新規作成 | 一覧 | RSS | FrontPage | 検索 | 更新履歴
[Calendar/When/Ruby/2.APIの使用例/6.iCalendar/GoogleCalendar] (前:6.iCalendar|次:Obsolete) (English)

GoogleCalendar

Ruby から制御するAPI

インストール

クライアントプログラムから Google Calendar API v3 を使用するには、まず google-api-client をインストールします。

( google-api-client for gem - https://rubygems.org/gems/google-api-client )

 $ gem install google-api-client

次に Calendar API を有効にして、アクセストークンを取得します。

→「rubyにてgoogleカレンダーの情報を取得する」参照

ただし、参照サイトの手順中の 'google-api oauth-2-login' の実行の際 OpenSSL が cacert.pem を参照するので、Microsoft Windows の場合は事前に cacert.pem を取得しておく必要があります。

→「Windows7+Ruby+google-api-clientで、GoogleAPI向けOAuth認証用のYAMLファイルを取得する」参照

カレンダーID

参照するカレンダーは下記のID(calendarId)で指定します。

私用primary
国別祝日言語コード.国名#holiday@group.v.calendar.google.com

→国別祝日で使用可能な組み合わせ

クライアントオブジェクトとサービスオブジェクトの生成

本ライブラリは google-api-client のクライアントオブジェクトとサービスオブジェクトに Calendar API v3 の制御を依頼します。

これらのオブジェクトを生成するサンプルコードを下記に示します。

(インストールの項で取得したアクセストークンはファイル google-api.yaml に保持しているものとしました)

 require 'google/api_client'
 require 'yaml'
 oauth_yaml = YAML.load_file('google-api.yaml')
 client = Google::APIClient.new(:application_name => 'when_exe',
                                :application_version => When::VERSION)
 client.authorization.client_id = oauth_yaml['client_id']
 client.authorization.client_secret = oauth_yaml['client_secret']
 client.authorization.scope = oauth_yaml['scope']
 client.authorization.refresh_token = oauth_yaml['refresh_token']
 client.authorization.access_token = oauth_yaml['access_token']
 service = client.discovered_api('calendar', 'v3')

本ライブラリ側の対応

When::GoogleAPI::Calendar

Google Calendar API v3 で参照したイベント情報全体を保持するコンテナとして When::GoogleAPI::Calendarクラスを追加しました。

クラスメソッド Calendar.list で Calendar インスタンスを生成し、インスタンスメソッド Calendar#enum_for で個々のイベント日時を取得します。

 calendar = When::GoogleAPI::Calendar.list(client, service,
                  'en.japanese#holiday@group.v.calendar.google.com')
 calendar.enum_for(When.when?('20150101/1231')).each do |date|
   p [date, date.events[0].summary] #=>
 # [2015-01-01, "New Year's Day"]
 # [2015-01-12, "Coming of Age Day"]
 # [2015-02-11, "National Foundation Day"]
 # [2015-03-21, "Spring Equinox"]
 # [2015-04-29, "Shōwa Day"]
 # [2015-05-03, "Constitution Memorial Day"]
 # [2015-05-04, "Greenery Day"]
 # [2015-05-05, "Children's Day"]
 # [2015-05-06, "Constitution Memorial Day observed"]
 # [2015-07-20, "Sea Day"]
 # [2015-09-21, "Respect for the Aged Day"]
 # [2015-09-22, "Bridge Public holiday"]
 # [2015-09-23, "Autumn Equinox"]
 # [2015-10-12, "Sports Day"]
 # [2015-11-03, "Culture Day"]
 # [2015-11-23, "Labor Thanksgiving Day"]
 # [2015-12-23, "Emperor's Birthday"]
 end

When::V::Event

前項を実現するため When::V::Eventクラスのコンストラクタで、Google Calendar API v3 の events.list コマンドの応答を直接扱えるようにしました。

下記のサンプルコードでは応答中のイベント情報(Google::APIClient::Schema::Calendar::V3::Eventクラス)を to_hash メソッドで Hash 化して、そのまま When::V::Event のコンストラクタの引数としています

 result = client.execute(:api_method => service.events.list,
           :parameters => {'calendarId' => 'en.japanese#holiday@group.v.calendar.google.com'})
 result.data.items.each do |e|
   p e.class                #=> Google::APIClient::Schema::Calendar::V3::Event
   event = When::V::Event.new(e.to_hash)
   p event.class            #=> When::V::Event
   p event.google_api_props #=> 
   # {"kind"=>"calendar#event",
   # <..snip..>
   # "summary"=>"Coming of Age Day",
   # "creator"=>
   #  {"email"=>"en.japanese#holiday@group.v.calendar.google.com",
   #   "displayName"=>"Holidays in Japan",
   #   "self"=>true},
   # "organizer"=>
   #  {"email"=>"en.japanese#holiday@group.v.calendar.google.com",
   #   "displayName"=>"Holidays in Japan",
   #   "self"=>true},
   # "start"=>{"date"=>"2014-01-13"},
   # "end"=>{"date"=>"2014-01-14"},
   # "transparency"=>"transparent",
   # <..snip..>
  end

関連するブログ記事

2015-05-25gcalapi と google-api-client
2015-05-27閏時の扱い