それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Google Calendar API を使って予定表を自動更新したりする

予定表をチャント管理しようと思ったけど出来ない

面倒だもの。。でもチャント予定表を作らないと何が何だかわからなくなってツライ。

予定表を作るのもちょっと気合が必要だし、作った予定表を自由に扱えないと不安。

チャント習慣を身につけないとあとで困るのはわたしだわ。

カレンダーの自動管理する方法

いろいろな方法があって迷う迷う

  1. iCal フォーマットのデータをWEBサーバーに置く案
    1. iCal のURLを指定して取り込む
    2. iCal データを定期的に更新する
    3. iPhoneiOSでもiCalを取り込むようにする
  2. GoogleAPIでカレンダーを扱う案
    1. Google API でプログラム専用ユーザーを作る
    2. カレンダーAPIでデータを取得
    3. カレンダーAPIでデータ追加削除
  3. iCloud Kitを使ってアプリ作る案
    1. Apple にDeveloper登録する
    2. iCloud にアクセスするOSXアプリ作る
    3. iCloud kit を使ってデータ追加削除

iCloud のカレンダーは・・OSXiOSだけ

プログラムからOAuthして予定表を管理しようと思ったけど、iCloudは出来ない。これはMacMini買ってOSX Serverを使えという神のお告げだと思ったけども、いますぐにそこまでしてると手順が増えて面倒だ

iCal を設置する方法は悪くない

データの一括削除とか一括更新するときに、既存の予定を1つずつちまちま削除して追加してをしなくていい。データ作ってガッツリ置くだけ。でもパーミッションとか。。。考えるのが面倒だ。

google Calendar APIを使う

GoogleAPIはいろいろ膨大に増えていて、統一的に扱うには専用のライブラリを使うのが手早くなっているので、コレを使うことにする。

手順は次の通り

今回は、サービス・アカウントを作成してカレンダーをメンテナンス。

サービスアカウントは、プログラムから自動実行に便利。メンテナンス専用アカウントが作られる。作られたアカウントを通してデータを操作する。

サービスアカウントでデータ操作までの手順

ほとんどがWEBからポチポチして、証明書とったりパーミッションを設定する作業。GoogleGUIは頻繁に変わわるだろうから、流れを覚えておくといいかもしれない。

  1. Google Developer Console にアクセスして 「プロジェクトを新規作成」
  2. 新規追加したプロジェクトでCalendarAPIをONにする
  3. プロジェクトのAUTH設定からcredential をOAuthで作成
  4. サービスアカウントを作成
  5. 作成するとPassPhraseが表示されるのでメモ(一回だけ表示される、メモを忘れたら削除して作りなおす)
  6. 同時にクライアント証明書がダウンロードされる。任意の場所に保存しPATHをメモ
  7. サービス・アカウントのメールアドレスをメモ
  8. GoogleCalendarを開く
  9. 管理したいカレンダーの設定を開く
  10. 先ほど作成されたサービスアカウントのメアドをパーミッションに追加して「保存」(必ず保存押してしてね)
  11. プログラムを作る

プログラムは ruby でやってみた

rubyAPIアクセス専用プログラムが提供されているので、それを使う

gem install google-api-client -v 0.6.4

Google APIはコロコロ変わるし、Rubyもバージョン・アップが頻繁なので、数ヶ月後でも動作するようにバージョンを固定しておく。

プログラムを作成する

#!/usr/bin/env ruby 
# coding: utf-8
require 'google/api_client'
require 'pp'
client = Google::APIClient.new(:application_name => 'my_ruby_test')



key = Google::APIClient::KeyUtils.load_from_pkcs12('/PATH/TO/証明書/Desktop/XXXXXXXXXX.p12', '**********')
client.authorization = Signet::OAuth2::Client.new(
  :token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
  :audience => 'https://accounts.google.com/o/oauth2/token',
  :scope => 'https://www.googleapis.com/auth/calendar',# ここはreadonlyや全権など該当にするものに
  :issuer => 'サービスアカウント@Google Console',
  :signing_key => key)
client.authorization.fetch_access_token!


cal = client.discovered_api('calendar', 'v3')
time_min = Time.utc(2012, 10, 1, 0).iso8601
time_max = Time.utc(2014, 11, 31, 0).iso8601
params = {'calendarId' => 'GoogleカレンダでCalendarIDを確認',
          # 'orderBy' => 'startTime',
          # 'timeMax' => time_max,
          # 'timeMin' => time_min,
          # 'singleEvents' => 'True'
        }

result = client.execute(:api_method => cal.events.list,
                        :parameters => params)


puts result.response.body
# イベント格納
events = []
result.data.items.each do |item|
  events << item
end

# 出力
events.each do |event|
  printf("%s,%s\n",event.start.date,event.summary)
end

これでREADが動く。一覧できたらOK

検索・追加・削除・更新・詳細

  • 追加するときは Event.quickAdd が便利 insert面倒
  • 検索するときは Event.list
  • 削除するときは Event.delete
  • 詳細取るときは Event.get
  • 更新するときは Event.update

ruby のコード

最初に覚えるのはdiscover

client 作成するまでは、Google APIは全部共通.

cal = client.discovered_api('calendar', 'v3')

もちろんAPIをDiscoverしても、Console側でON、OAuthで許可してないと使えないけれども。

イメージとして、Thrift 。Thrift のセットを呼び出す感じがdiscover。XML_RPC以前の SOAPや thriftっぽいね

大事なのは execute と method

result = client.execute(:api_method => cal.events.list,
                        :parameters => params)

ここで、api のmethodを指定する。 :api_method => cal.events.list だとか、:api_method => cal.events.quickAddとか指定する。

引数として与えるParamsはAPIドキュメント参照

参考資料

http://qiita.com/mechamogera/items/bf2ed20e332dc31d2352

http://qiita.com/iron-breaker/items/2440c4ab41a482b1b096

https://developers.google.com/google-apps/calendar/v3/reference/events/list