GoogleCalendarAPIを利用して、PHPでGoogleカレンダーの情報を取得してみよう!(予定編)
今回は以下の2種類の方法で、自分のGoogleカレンダーの予定を取得してみようと思います。
- カレンダーを公開し、前回同様APIキーを用いて取得する(方法1)
- サービスアカウントを用いて、認証でカレンダーを取得する(方法2)
筆者の環境
- CentOS 7
- PHP 7.3.4
取得するカレンダーイメージ
仮のデータを入力した、以下のカレンダーから情報を取得してみます。
カレンダーを公開し、APIキーを用いて取得する(方法1)
STEP1 カレンダーを一般公開する
Googleカレンダーのメニューから「設定と共有」を選択します。
アクセス権限欄の「一般公開して誰でも利用できるようにする」を選択します。
警告のアラートが出るので「OK」を選択します。
※警告に表示されているとおり、一般公開することにより誰でも閲覧可能になります。(2つ目の方法はこの一般公開をしない方法になっています。)
カレンダーの統合欄にある、カレンダーIDをメモします。
STEP2 GoogleCalendarAPIキーの取得
前回の記事を参考にAPIキーの取得を行います。
STEP3 PHPでデータの取得
- カレンダーIDを日本の祝日カレンダーからSTEP1で取得したカレンダーIDに変更
- 終日でない予定もあるので$resultsの取得箇所を変更
/**
* ココまで前回と同じため省略
*/
$results = [];
if ($data = file_get_contents($url. http_build_query($query), true)) {
$data = json_decode($data);
foreach ($data->items as $row) {
// 終日予定はdateプロパティ、時刻指定はdateTimeプロパティにデータがはいっている
$start = new DateTime(property_exists($row->start,'date')?$row->start->date:$row->start->dateTime);
$end = new DateTime(property_exists($row->end,'date')?$row->end->date:$row->end->dateTime);
$results[$start->format('Y-m-d')][] = [
'start' => $start->format('Y-m-d H:i:s'),
'end' => $end->format('Y-m-d H:i:s'),
'title' => (string)$row->summary
];
}
}
実行結果
$ php get.php
array(4) {
["2020-02-07"]=>
array(1) {
[0]=>
array(3) {
["start"]=>
string(19) "2020-02-07 09:00:00"
["end"]=>
string(19) "2020-02-07 10:00:00"
["title"]=>
string(15) "打ち合わせ"
}
}
["2020-02-10"]=>
array(1) {
[0]=>
array(3) {
["start"]=>
string(19) "2020-02-10 00:00:00"
["end"]=>
string(19) "2020-02-11 00:00:00"
["title"]=>
string(6) "休暇"
}
}
["2020-02-12"]=>
array(1) {
[0]=>
array(3) {
["start"]=>
string(19) "2020-02-12 15:00:00"
["end"]=>
string(19) "2020-02-12 16:00:00"
["title"]=>
string(15) "打ち合わせ"
}
}
["2020-02-13"]=>
array(1) {
[0]=>
array(3) {
["start"]=>
string(19) "2020-02-13 00:00:00"
["end"]=>
string(19) "2020-02-15 00:00:00"
["title"]=>
string(6) "出張"
}
}
}
終日予定、時間指定の予定、日をまたいでいる予定もしっかり取得できました!
サービスアカウントを用いて、認証でカレンダーを取得する(方法2)
1つ目の方法ではカレンダーを一般公開する必要があり、誰でも閲覧可能になってしまいます。
一般公開できないアカウントの場合は以下の方法でカレンダーを取得することができます。
STEP1 サービスアカウントの取得
前回の記事を参考にGoogleCalendarAPI有効化まで行います。
続いて、「認証情報を作成」から「サービスアカウント」を選択します。
サービスアカウント名とサービスアカウントIDを入力し「作成」ボタンを押下します。
サービスアカウントの権限(オプション)はそのまま「続行」ボタンを押下します。
「キーを作成」ボタンを押下し、キータイプがJSONになっていることを確認して「作成」ボタンを押下します。
ここでダウンロードされたサービスアカウントの秘密鍵は後で使いますので、保存しておきます。
STEP2 情報を取得したいカレンダー側の設定
STEP1で取得したサービスアカウントにカレンダーを共有します。
Googleカレンダーのメニューから「設定と共有」を選択します。
特定のユーザーとの共有欄の「ユーザーを追加」ボタンを押下します。
ダイアログが開きますので、STEP1で取得したJSONファイルをテキストエディタで開き、「client_email」の値を入力し、「送信」ボタンを押下します。
1つ目の方法同様カレンダーIDを使いますので、カレンダーの統合欄のカレンダーIDをメモしておきます。
STEP3 PHPでデータの取得
GoogleAPIのライブラリが必要になるので、下記のURLにアクセスしインストールします。
composerでインストールする方法と、.zip形式でダウンロードしインストールする方法がありますが、今回はcomposerでインストールします。
$ composer require google/apiclient:"^2.0"
また、STEP1で取得した秘密鍵もサーバの同階層にアップロードします。
// ディレクトリ構造イメージ
path/to/your-project/
├ composer.json
├ composer.lock
├ 秘密鍵.json
├ データ取得用PHP.php
└ vendor/
└ autoload.php
下記のコードを作成してみました。
<?php
// ライブラリの読み込み
require_once __DIR__. '/vendor/autoload.php';
// 秘密鍵.jsonまでのパス
$json_path = __DIR__. '秘密鍵.json';
// データの開始日
$start = date(date('Y'). '-01-01\T00:00:00\Z');
// データの終了日
$end = date(date('Y'). '-12-31\T00:00:00\Z');
// カレンダーID
$calendar_id = 'STEP2でメモしたカレンダーID';
$client = new Google_Client();
// スコープをカレンダーの読み取りに設定
$client->setScopes(Google_Service_Calendar::CALENDAR_READONLY);
// 認証設定
$client->setAuthConfig($json_path);
// カレンダーサービスの作成
$service = new Google_Service_Calendar($client);
$option = [
'timeMin' => $start,
'timeMax' => $end,
'maxResults' => 50,
'orderBy' => 'startTime',
'singleEvents' => 'true'
];
// データの取得
$response = $service->events->listEvents($calendar_id, $option);
$events = $response->getItems();
$results = [];
if (!empty($events)) {
foreach ($events as $event) {
// 終日予定はdate、時刻指定はdateTimeにデータが入り、もう片方にはNULLが入っている
$start = new DateTime(!is_null($event->start->date)?$event->start->date:$event->start->dateTime);
$end = new DateTime(!is_null($event->end->date)?$event->end->date:$event->end->dateTime);
$results[$start->format('Y-m-d')][] = [
'start' => $start->format('Y-m-d H:i:s'),
'end' => $end->format('Y-m-d H:i:s'),
'title' => (string)$event->summary
];
}
}
var_dump($results);
実行結果
$ php データ取得用PHP.php
array(4) {
["2020-02-07"]=>
array(1) {
[0]=>
array(3) {
["start"]=>
string(19) "2020-02-07 09:00:00"
["end"]=>
string(19) "2020-02-07 10:00:00"
["title"]=>
string(15) "打ち合わせ"
}
}
["2020-02-10"]=>
array(1) {
[0]=>
array(3) {
["start"]=>
string(19) "2020-02-10 00:00:00"
["end"]=>
string(19) "2020-02-11 00:00:00"
["title"]=>
string(6) "休暇"
}
}
["2020-02-12"]=>
array(1) {
[0]=>
array(3) {
["start"]=>
string(19) "2020-02-12 15:00:00"
["end"]=>
string(19) "2020-02-12 16:00:00"
["title"]=>
string(15) "打ち合わせ"
}
}
["2020-02-13"]=>
array(1) {
[0]=>
array(3) {
["start"]=>
string(19) "2020-02-13 00:00:00"
["end"]=>
string(19) "2020-02-15 00:00:00"
["title"]=>
string(6) "出張"
}
}
}
こちらの方法でも問題なく取得できました!
まとめ
いかがでしたでしょうか。取得したデータを使って通知BOTを作ったり、独自デザインのカレンダーに自動的にデータを表示させたりもできそうですね。
この記事を書いた人
-
東京で2年半エンジニアとしての経験を積み、浜松にUターンの後、アーティスへ入社。
ソリューション事業部のWebエンジニアとして、システムの設計・開発・保守・運用からインフラまで幅広く従事している。
フルスタックエンジニア目指して現在も勉強の日々。車が好き。
この執筆者の最新記事
関連記事
最新記事
FOLLOW US
最新の情報をお届けします
- facebookでフォロー
- Twitterでフォロー
- Feedlyでフォロー