Rubyを用いて予定をgoogle カレンダーに登録する
あるページから自動で予定をスクレイピングしてきて自動的にGoogle Calendarに登録したかったので,Rubyを使って実現した.
使ったバージョンは下記のとおり
・ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
・google-api-client (0.8.6)
#google-api-clientが,0.9以降だと下記のコードは使えない.
#v0.9以降では,require で 'google/api_client' の下の階層の指定が必要らしいです.
まずはgemをインストールする
$ gem install google-api-client -v 0.8.6
google developerで認証等の手続きをする
google dev. console ( https://console.developers.google.com/ )に行って,Credentialsの登録をする.
Create credentialsをクリック
Service account keyでアカウントを作成する
今回はP12 keyを用いた.JSONがRecommendされてるから次からはJSON使おう.
account nameやIDを入力.Createをクリックすると,P12キーがダウンロードされ,secret passwordが表示されるのでメモっとく.
これで登録は完了だ.
準備ができたのでコードを書く.いろいろなサイトを参照したが,
以下のようなコードができた.
# encoding: UTF-8 require 'google/api_client' CALENDAR_ID = '[登録したいカレンダーのID]' client = Google::APIClient.new(:application_name => 'test') # 認証 key = Google::APIClient::KeyUtils.load_from_pkcs12('[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', issuer: '[シークレットアカウント(emailアドレス形式)]', signing_key: key ) client.authorization.fetch_access_token! # google calendar に登録 cal = client.discovered_api('calendar', 'v3') event_name = "New Event!" #イベントのタイトル(summary) event = { 'summary' => event_name, 'start' => { 'date' => "[開始日の日付]", }, 'end' => { 'date' => "[終了日の日付]", } } result = client.execute(:api_method => cal.events.insert, :parameters => {'calendarId' => CALENDAR_ID}, :body => JSON.dump(event), :headers => {'Content-Type' => 'application/json'})
以下の部分をAPIのReferenceに合わせて上手に書いてあげることでいろいろなことができる.
result = client.execute(:api_method => cal.events.insert, :parameters => {'calendarId' => CALENDAR_ID}, :body => JSON.dump(event), :headers => {'Content-Type' => 'application/json'})
:api_method => cal.events.insert
の部分を cal.events.[やりたい動作] にして,
Referenceに書いてある Parameters を与えてやる.
:parameters => {'calendarId' => CALENDAR_ID}
bodyやその他もろもろも,Referenceを覗いて,それを書いてあげるだけでいい.
今回は,eventの中身をjson formatにしてあるので(どこかのコードを参考にしたため),jsonでstart.dateやend.dateを指定しているが,eventオブジェクトを生成してその中に入れていくということもできると思う.
例えば,書き換えると以下のようなことができる.
・現在を中心とした過去と未来の各6ヶ月分の予定を引っ張ってくる(計1年)
d = Date.today time_max = (d >> 6).to_time.iso8601 time_min = (d << 6).to_time.iso8601 params = {'calendarId' => CALENDAR_ID, 'orderBy' => 'startTime', 'timeMax' => time_max, 'timeMin' => time_min, 'singleEvents' => 'True'} result = client.execute(:api_method => cal.events.list, :parameters => params)
これは,Referenceのlistを参考にするとよい.
ここらへんを参考にパラメータをうめていく.
・削除する(イベントIDとカレンダーIDを指定する)
params = {'calendarId' => CALENDAR_ID, 'eventId' => event.id} result = client.execute(:api_method => cal.events.delete, :parameters => params)
DeleteはcalendarIdとeventIdを指定しろと書いてあるから,それだけ.
==参考==
Google Calendar API Reference
https://developers.google.com/google-apps/calendar/v3/reference/
Google Calendar API を使って予定表を自動更新したりする
http://maehrm.hatenablog.com/entry/20141216/p1
Googleカレンダーに予定をRubyで登録する
http://maehrm.hatenablog.com/entry/20141216/p1
rubyでgoogleカレンダーのイベントを取得するメモ
http://qiita.com/mechamogera/items/bf2ed20e332dc31d2352