読者です 読者をやめる 読者になる 読者になる

JP7FKFの備忘録

アマチュア無線(JP7FKF)をやっている.電子工作,機械工作,ものづくりが好き.

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をクリック
f:id:jp7fkf:20160715214239p:plain
Service account keyでアカウントを作成する
f:id:jp7fkf:20160715214243p:plain
今回はP12 keyを用いた.JSONがRecommendされてるから次からはJSON使おう.
f:id:jp7fkf:20160715220324p:plain
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を参考にするとよい.
f:id:jp7fkf:20160715214700p:plain
ここらへんを参考にパラメータをうめていく.


・削除する(イベントIDとカレンダーIDを指定する)

params = {'calendarId' => CALENDAR_ID,
'eventId' => event.id}
result = client.execute(:api_method => cal.events.delete,
:parameters => params)

DeleteはcalendarIdとeventIdを指定しろと書いてあるから,それだけ.
f:id:jp7fkf:20160715214734p:plain

==参考==
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

rubygoogleカレンダーのイベントを取得するメモ
http://qiita.com/mechamogera/items/bf2ed20e332dc31d2352