Googleカレンダー情報をPHPで取得してみる2

こんにちは、システムエンジニアの今井です。

以前、「Googleカレンダー情報をPHPで取得してみる」を公開しましたが、今回は「サービスアカウント」方式の使い方について書きたいと思います。

以前はサーバーキーを使ってGoogleカレンダー情報を取得してみましたが、
取得するGoogleカレンダーを一般公開する必要があり、一般公開したくないカレンダーには向かないというデメリットがありました。
※一般公開すると、世界中のユーザから閲覧できてしまいます。

「サービスアカウント」方式を使うことで、一般公開したくないカレンダーからデータを取得できるようになります。

 

1.今回してみること

  • 自分のGoogleカレンダーの「hoge」という名前のカレンダーから情報を取得したい
  • PHPプログラムで「hoge」カレンダー情報を取得して、var_dumpする
  • PHPプログラムはカレンダー情報の読み込みだけを行う、PHPプログラムからカレンダーへの書き込みは行わない

 

2.用意するもの

「サービスアカウント」方式でGoogleカレンダーから情報を取得するにあたり以下のものが必要になります。

  • Googleアカウント
  • サービスアカウントキー
  • google-api-php-clientプログラム

※Googleアカウントの取得方法はここでは省略させていただきます。

 

3.サービスアカウントキー取得方法

①:GoogleDeveloperConsoleページにアクセスします
 https://code.google.com/apis/console/

②:「プロジェクトを作成」をクリックします。
1

③:「hoge」という名前でプロジェクトを作成します。
※:運用時は正しい名前で登録してください。
2

④:作成後以下の画面が表示されますので、「GoogleAPIを利用する」をクリックします。
3

⑤:検索窓に「calendar」と入力すると、「CalendarAPI」が表示されますのでクリックします。
4

⑥:「有効にする」をクリックします。
5

⑦:有効になった後、左メニューの「認証情報」をクリックします。
6

⑧:「認証情報を作成」から「サービスアカウントキー」をクリックします。
7

⑨:「サービスアカウント」には「App Engine default service account」を選択して「JSON」にチェックをいれて「作成」ボタンをクリックします。
8

⑩:jsonファイルがダウンロードされるので、ローカルPCに保存します。

以上で、サービスアカウントキーの取得が完了しました。

 

4.google-api-php-clientプログラム取得方法

Googleカレンダーからサービスアカウント方式でデータを取得するため、google-api-php-clientというライブラリを使います。
バージョン1.1.7を使います。
①:以下URLを開きます。
https://github.com/google/google-api-php-client

②:releasesという箇所をクリックします。
16

③:1.1.7の「Source code(zip)」をクリックしてzipファイルをダウンロードします。
17

ダウンロードしたzipファイルはローカルPCに保存しておきます。
※後ほどこのzipファイルを使います。

 

5.Googleカレンダーの準備

データを取得したいカレンダーに対して先ほどダウンロードしたjsonファイルのサービスアカウントキーを登録する必要があります。
①:「3.サービスアカウントキー取得方法」でダウンロードしたjsonファイルをテキストエディタで開きます。
※client_emailの値を覚えておきます。

②:Googleカレンダーを開きます。

③:「マイカレンダー」から「新しいカレンダー作成」をクリックします。
9

④:新しいカレンダーに以下の項目を入力して、「カレンダーを作成」を押します。
・「カレンダー名」に任意の値を入れます。(ここではhogeとしています)
・「ユーザ」にclient_emailの値を入れて「ユーザを追加」を押します。
10

以上でカレンダー側の設定は終了です。

 

6.PHPからGoogleカレンダーの情報を取得してみる

①:「5.Googleカレンダーの準備」で作成した「hoge」カレンダーにテスト用の値を入れて保存します。
11

12

②:「hoge」カレンダーIDを取得します。
・「hoge」カレンダー右の▼をクリックして、「カレンダー設定」をクリックします。
13

・「カレンダーのアドレス」にあります、「カレンダーID」が今回必要な情報になります。こちらを覚えておいてください。
14

③:PHPプログラムからカレンダー情報を取得します。
以下の環境で作成します。
・テストプログラムは /var/www/html/index.php として設置
・「4.google-api-php-clientプログラム取得方法」で取得したプログラムは/var/www/html/google-api-php-client以下に保存
・「3.サービスアカウントキー取得方法」で取得したjsonファイルは /var/www/html/json/hoge.json として設置

<?php
/**
 * ・データを先頭から10件取得します。
 * ・2016年1月1日から2016年12月31日までのデータが対象です。
 */
require_once __DIR__.'/google-api-php-client/src/Google/autoload.php';
$json_path = __DIR__.'/json/hoge.json';
$json_string = file_get_contents($json_path, true);
$json = json_decode($json_string, true);

$private_key = $json['private_key'];
$client_email = $json['client_email'];

$scopes = array(Google_Service_Calendar::CALENDAR_READONLY);

$credentials = new Google_Auth_AssertionCredentials(
    $client_email,
    $scopes,
    $private_key
);

$client = new Google_Client();
$client->setApplicationName("Google Calendar PHP API");
$client->setAssertionCredentials($credentials);
if ($client->getAuth()->isAccessTokenExpired()) {
    $client->getAuth()->refreshTokenWithAssertion();
}

$service = new Google_Service_Calendar($client);

// ここでデータを取得する範囲を決めています
$t = mktime(0, 0, 0, 1, 1, 2016);
$t2 = mktime(0, 0, 0, 12, 31, 2016);
$calendarId = '';  // ここには「6.PHPからGoogleカレンダーの情報を取得してみる」の②で取得したカレンダーIDを入れます。
$optParams = array(
  'maxResults' => 10,
  'orderBy' => 'startTime',
  'singleEvents' => TRUE,
  'timeMin' => date('c', $t),
  'timeMax' => date('c', $t2),
);

$results = $service->events->listEvents($calendarId, $optParams);

var_dump($results['items']);

実行結果は以下のようになります。
15

④:パラメータ説明
パラメータを設定することで検索条件の絞り込みができます。

パラメータ名説明

orderBy 指定した条件で並び替えてくれます。startTimeまたはupdatedが指定できます。
maxResults 最大件数を設定します。設定しない場合は全件取得されます。
timeMin 開始日付を設定します。
timeMax 終了日付を設定します。

以上でサービスアカウントキーを使ってPHPでGoogleカレンダー情報を取得できるようになりました。

 

7.まとめ

サービスアカウントキーを使うことで、カレンダーを一般公開しないままデータが取得できるようになりました。

次回は、PHPプログラムからカレンダーに情報を書き込む方法を紹介できればと思います。

Pocket