googleカレンダーを取得するlambdaを作った

· ☕ 2

googleカレンダー連携のlambda。テスト動作みたいのさせたままで、ちゃんと完成させてなかったから、完成させた!

これまでの流れはこちら

ただ、びっくりするほどまとまりがなくて見づらくてしょうがないので、そのうちちゃんと綺麗にします…。

システム構成

システム構成図

環境

lambda:python3.7

前提

  • GCPでgoogle calendar APIを作っておく。

  • lambda内に、lambda_function.pyと同じ階層に↑のgoogle_key.jsonをおいておく。詳細

  • googleカレンダーで、↑のAPIの書くセスを許可する。

ソース

こちらで公開中。

cloudformationのtemplateもおいてあります。

デプロイするときは、apiのサービスアカウントid付きでデプロイ。

bucket_name=バケット名
packaged_name="./packaged.yaml"
stack_name=スタック名
param="Env=dev ServiceAccountId='アカウント@プロジェクト.iam.gserviceaccount.com'"
aws cloudformation package --template-file ./template.yaml --s3-bucket $bucket_name --output-template-file $packaged_name
aws cloudformation deploy --template-file $packaged_name --stack-name $stack_name --parameter-overrides $param

ちょっと解説

google_key.jsonからクレデンシャル取得

scopes = 'https://www.googleapis.com/auth/calendar'

credentials = ServiceAccountCredentials.from_json_keyfile_name(
    'google_key.json',
    scopes=scopes
)

カレンダー取得

events = service.events().list(
    calendarId=calendar_id,
    timeMin=time_min,
    timeMax=time_max,
    singleEvents=True
).execute()

欲しいのはタイトルと開始日時と終了日時だけだったので、欲しいものだけに絞ってます。

items = events['items']
items = list(map(
    lambda x: {'title': x['summary'], 'start': x['start'], "end": x["end"]}, items))

リクエスト

api gatewayから呼ばれる事が多いので、bodyの中にdumpしたjsonを入れて下さい。

{
  "body": "{\"calendar_id\":\"アカウント@gmail.com\", \"time_min\":\"2017-01-23T09:00:00+09:00\", \"time_max\":\"2017-01-23T12:24:07+09:00\"}"
}

るな
るな
エンジニア