サービスアカウント認証でGoogleカレンダーAPIを使ってみた
IT技術
はじめに
GoogleカレンダーAPIを使ってGoogleカレンダーに予定を追加するというのをやりました。
またAPIの認証方法に、OAuth 2.0での認証とサービスアカウントを用いての認証がありますが
今回はサービスアカウントでの認証でAPIを使用していきます。
また今回はphpのコードでAPIを実行していきます。
今回は以下の環境で開発しています。
- Laravel 9.17.0
- php8.0
- GCPのプロジェクトがある
GoogleカレンダーAPIとは
GoogleカレンダーAPIとは、その名の通りGoogleカレンダーを操作するためのAPIです。
カレンダーの予定を作成、更新、削除などを行うことができます。
当然ですがGoogleが提供しています。
実装に向けての準備
では実装に向けてGCPのプロジェクト内で準備をしていきます。
準備としては以下の3点です。
- Google Calendar APIの有効化
- サービスアカウントの作成およびキーのダウンロード
- 予定を入れたいGoogleアカウントのカレンダーの管理権限をサービスアカウントに付与する
Google Calendar APIの有効化
プロジェクトのダッシュボードで「APIとサービス」>「ライブラリ」に移動します。
ライブラリにて「Google Calendar API」で検索し、出てきたページに飛びます。
遷移したページ内にて「有効にする」というボタンがあるので、そのボタンを押して
Google Calendar APIを有効にします。
サービスアカウントの作成およびキーのダウンロード
プロジェクトの「IAMと管理」>「サービスアカウント」に移動します。
「サービスアカウントを作成」を選択しサービスアカウント名を入力し説明欄に適宜説明を記述します。
(サービスアカウントIDの入力欄がありますが、サービスアカウント名を入力すると自動で反映されます。特段こだわりがなければ自動で反映されたものそのまま使って問題ありません)
各所入力が完了したら「完了」ボタンを押すとサービスアカウントが作成されます。
サービスアカウントの作成ができたら次はキーの作成を行っていきます。
サービスアカウント作成時同様「IAMと管理」>「サービスアカウント」に移動します。
作成したサービスアカウントの詳細画面に移動しキー(鍵)を管理するページに移動します。
そこに「鍵を追加」と書かれたボタンばあるのでそれを押して、「新しい鍵を作成」を選択します。
そうするとキーのタイプを選ぶ画面が出るのでJSONタイプを選択し、ダウンロードします。
ダウンロードしたキーは紛失しないよう管理してください。
補足ですが2024年6月16日以降、サービスアカウントのキーの漏洩が確認されると自動でサービスアカウントが無効化されます。
ですのでキーの管理は公開された場所に保管しないようにしましょう。
GitHubのpublicリポジトリ等も無効化の対象のようですので注意です。
↓参考↓
予定を入れたいGoogleアカウントのカレンダーの管理権限をサービスアカウントに付与する
サービスアカウント認証で他のユーザーのカレンダーに予定を入れたい場合は、そのカレンダーの管理権限をサービスアカウントにも付与しないといけません。
まずGoogleアカウントのカレンダーの画面に移動します。
予定を入れたいカレンダーの「設定と共有」の画面に移動して、「特定のユーザーまたはグループと共有する」の欄の「ユーザーやグループを追加」のボタンを押します。
そうするとアカウントを選択する欄と、権限選択の欄がでくるのでサービスアカウントのメールアドレスを選択し「変更及び共有の管理権限」の権限を選択し「送信」ボタンを押します。
以上で権限付与は完了です。
実装
準備が整ったのでいよいよ実装に取り掛かります。
ではまずGoogle Calendar APIを利用するためのgoogle-api-php-clientというライブラリをインストールします。
ターミナルで以下のコマンドを実行します。
1composer require google/apiclient:^2.15.0
インストールが完了したらコードを書いていきます。
まずは手始めに予定の作成をしていきましょう。以下のようなコードとなります。
1use Google\Client;
2public function insertEvent()
3{
4 $client = new Client();
5 $client->setAuthConfig('/path/to/client_credentials.json'); // サービスアカウントのJSONファイルのパス
6 $client->addScope(\Google_Service_Calendar::CALENDAR);
7
8 $calendar_id = '任意のカレンダーID';
9 $service = new \Google_Service_Calendar($client);
10 $event = new \Google_Service_Calendar_Event(array(
11 'summary' => "イベントのタイトル",
12 'description' =>"イベントの説明欄",
13 'start' => array(
14 'dateTime' => '2024-01-01T09:00:00+09:00', // 開始時間
15 'timeZone' => 'Asia/Tokyo',
16 ),
17 'end' => array(
18 'dateTime' => '2024-01-01T10:00:00+09:00', // 終了時間
19 'timeZone' => 'Asia/Tokyo',
20 ),
21 ));
22 return $service->events->insert($calendar_id, $event);
23}
上記のコードはカレンダーの予定を作成し、その予定を返り値として返すような関数となっています。
補足ですがGoogleカレンダーのイベントの開始時間start
と終了時間end
はRFC3339形式で書く必要があります。
実際に開始時間と終了時間を取得する際はDBに保存している値やフォームの入力値など、違う形式で書かれた日時を取得してくるかと思います。
phpではCarbonを使ってRFC3339形式に変換することができるので参考にしてみてください。
1$start = Carbon::create($date_time)->toRfc3339String();
では次に削除していきましょう。
削除は単純です。既存の予定のcalendarId
とeventId
を渡せばいいだけです。
1public function deleteEvent()
2{
3 $calendar_id = '任意のカレンダーID';
4 $event_id = '削除対象のイベントID';
5 $client = new Client();
6 $client->setAuthConfig('/path/to/client_credentials.json'); // サービスアカウントのJSONファイルのパス
7 $client->addScope(\Google_Service_Calendar::CALENDAR);
8
9 $service = new \Google_Service_Calendar($client);
10 $service->events->delete($calendar_id, $event_id);
11}
削除はこれだけです。簡単ですね!!
まとめ
Google Calendar APIを使ってカレンダーの予定を登録、削除していきました。
ToDoアプリなどに取り込むことで自身のGoogleカレンダーに予定を共有できたりするので
よかったら皆さんも使ってみてください。
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ