Google カレンダーの自動変更 (PHP)

□ 概要
プログラム内で認証手順を行って $client 変数を作る。そのための認証情報を Google Clould Platform で作る。認証は、公開されている情報を取得するだけならば API キーで動作するが、データを作成し保存する場合は OAuth 2.0 クライアント ID が必要 (JSON ファイルをダウンロード、ユーザーが認証を行って、token を作成) (自分がユーザーの場合でも)。1回目は OAuth 同意画面も作る。Google Clould Platform のプロジェクトで Calender API を有効化する。フリーのライブラリ google-api-php-client を使う (ファイルを直接ダウンロードすれば composer は使わなくて良い)。$client から Google カレンダーの $service 変数を作る。

 


□ 予備知識

Google Clould Platform
    https://console.cloud.google.com/

    上部ボタン、新しいプロジェクト
    プロジェクト名:My Project 39176 (デフォルト)
    場所:組織なし (デフォルト)
    作成ボタン

    上部ボタン、Cloud Shell をアクティブにする

    Cloud Shell 上部、エディタを開く (戻るときは、ターミナルを開く)

    Cloud Shell 上部、さらに表示、アップロード

    Cloud Shell 上部、ウェブでプレビュー、ポート 8080 でプレビュー

    上部ボタン左、ナビゲーション メニュー、ホーム、ダッシュボード

 

・Git
    ソースコードのコピー (クローン)
    Code ボタンから HTTPS のアドレスを取得
    git clone https://github.com/googleapis/google-api-php-client.git

 


□ 参考ページ

google-api-php-client:
https://github.com/googleapis/google-api-php-client

PHP Quickstart:
https://developers.google.com/calendar/api/quickstart/php

スパイスワークス社、今井様:
https://www.spiceworks.co.jp/blog/?p=10254

REFFECT 社、SAKODA 様:
https://reffect.co.jp/php/php-google-calendar-api

PHP Google Event Examples:
https://developers.google.cn/calendar/api/v3/reference/events/insert
https://developers.google.cn/calendar/api/v3/reference/events/list
https://hotexamples.com/jp/examples/-/Google_Event/-/php-google_event-class-examples.html
https://gist.github.com/AFelipeTrujillo/fc7cf8d379ddb39e56c1

 


□ システム条件
PHP 5.6.0 以上

Cloud Shell は PHP Version => 7.2.34
Lolipop は 7.3 (選択可能)

 


□ リリースのダウンロード
google-api-php-client-[RELEASE_NAME].zip をダウンロードして、解凍する
mkdir google-api-php-client
cd google-api-php-client
unzip ../google-api-php-client--PHP7.0.zip

コードに次の行を追加する
require_once '/path/to/google-api-php-client/vendor/autoload.php';
(または、require_once 'vendor/autoload.php';)
(または、require __DIR__ . '/vendor/autoload.php';)

 


□ サンプルコード
次のコマンドで確認できる
git clone https://github.com/googleapis/google-api-php-client.git
cd google-api-php-client
php -S localhost:8080 -t examples/
Cloud Shell 上部、ウェブでプレビュー、ポート 8080 でプレビュー

 


□ 基本サンプル (link)
google-api-php-client フォルダ内に BasicExample.php を作成
コードの先頭に <?php、末尾に ?> を追加
作成した APP_KEY を使用 (下記)

APIとサービス
ライブラリ
Google Books API
有効にする

php -S localhost:8080 -t . BasicExample.php

Cloud Shell 上部、ウェブでプレビュー、ポート 8080 でプレビュー

 


□ APP_KEY の作成

上部ボタン左、ナビゲーション メニュー

APIとサービス
ライブラリ
Google Calender API
有効にする

APIとサービス
認証情報
上部ボタン、認証情報を作成
API キー
******

 


□ OAuth 2.0 クライアント ID の作成 (デスクトップ アプリ) (link)

APIとサービス
認証情報
上部ボタン、認証情報を作成
OAuth クライアント ID

アプリケーションの種類:デスクトップ アプリ
名前:デスクトップ クライアント1

クライアント ID:******
クライアント シークレット:******
JSON をダウンロード
名前を credentials.json に変更

php quickstart.php

 

 

□ QuickStart サンプルの試し方 (Google Clould Platform 環境)
https://github.com/googleworkspace/php-samples/blob/master/calendar/quickstart/quickstart.php
php quickstart.php
Open the following link in your browser と表示されるので、ブラウザで開く
OAuth 同意画面が開くので
ユーザーを選択
Continue
Continue を押して進んで行くと、最後にコードが表示される
******
Enter verification code と表示されているので、コマンドプロンプトに貼り付け
token.json が作成され、Google カレンダーデータ取得のサンプルプログラムが動作している ※ 昔の token.json がある場合は前もって削除

 

quickstart.phpAPI_KEY に書き直した場合
//if (php_sapi_name() != 'cli') { をコメントアウト
//$client = getClient(); を削除 (function getClient() も削除)
$client = new Google\Client();
$client->setApplicationName("Client_Library_Examples");
$client->setDeveloperKey("******");
$service = new Google_Service_Calendar($client); そのまま
$calendarId = 'hoge.hoge@gmail.com'; 自分のメールアドレスに変更
printf("<a href=\"%s\">%d</a> %s %s (%s)<br>\n", $event->getHtmlLink(), $cnt, $event->getDescription(), $event->getSummary(), $start);

summary と description は、credentials.json では、予定:予定なし・デフォルトの公開設定、も表示するが、API_KEY では、予定:予定あり・公開、しか表示されない

 

 

□ OAuth 2.0 クライアント ID の作成 (ウェブ アプリケーション) (link1) (link2)

機能:
ブラウザで、PHPJavaPythonRuby などのウェブページを開く
$authUrl のリンクをクリックすると、OAuth 同意画面が開く
同意が完了すると、?code=*** が付加されて戻る (リダイレクト)。code を token に変換してセッションに保存する
必要ならば一旦確認ボタンを表示して、カレンダーへ書き込みを行う

APIとサービス
認証情報
上部ボタン、認証情報を作成
OAuth クライアント ID

アプリケーションの種類:ウェブ アプリケーション
名前:ウェブ クライアント1

承認済みの JavaScript 生成元: (なし)
承認済みのリダイレクト URIhttps://hoge-hoge.com/simple-events-insert.php  ※プログラムで指定するものと同じ

クライアント ID:******
クライアント シークレット:******
JSON をダウンロード
名前を client_secret.json に変更

ブラウザで https://hoge-hoge.com/simple-events-insert.php を開く
Connect Me! をクリック
OAuth 同意画面が開くので
ユーザーを選択
Continue
Continue

 

 

□ Events: insert サンプルの試し方 (Lolipop 環境)
https://github.com/googleapis/google-api-php-client/tree/main/examples
https://developers.google.cn/calendar/api/v3/reference/events/insert
元コード: examples/simple-file-upload.php
コピーして名前を変更: simple-events-insert.php

変更①:
include_once __DIR__ . '/google-api-php-client/vendor/autoload.php';
include_once __DIR__ . '/templates/base.php';

echo pageHeader("Events: insert - Google Calendar Events Insert");

echo('Place: ' . __DIR__ . '/templates/base.php' . '<br>');
echo('Exist: ' . file_exists(__DIR__ . '/templates/base.php') . '<br>');
echo('<br>');


変更②:
$redirect_uri = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];


変更③:
$client->addScope("https://www.googleapis.com/auth/calendar.events");
$service = new Google\Service\Calendar($client);


変更④:
if ($_SERVER['REQUEST_METHOD'] == 'POST' && $client->getAccessToken()) {
以降に Events: insert ページのサンプルコードを貼り付ける。元の file upload は削除
予定の日付は近日に変更
'visibility' => 'public', を追加。予定の設定が、予定あり、公開、になる


変更⑤:
HTML の部分は、Events: insert に合わせて、文言を変更
次のように改善 (?code=.. にリダイレクトすると FireFox では正しく動作しない)
<?php else: ?>
  <form action="<?= $redirect_uri ?>" method="POST">


追加コード: example/templates/base.php
コピーして1箇所変更: templates/base.php


変更 (base.php):
フォルダ名・ファイル名を直接記述
function getOAuthCredentialsFile()
{
  // oauth2 creds
  $oauth_creds = '/home/users/hoge/hoge/client_secret.json';

 

 

□ OAuth 同意画面

同意画面を設定
  OAuth 同意画面
  User Type:外部
  作成
アプリ登録
  アプリ名:ModifyCalendar
  ユーザー サポートメール:hoge.hoge@gmail.com
  デベロッパーの連絡先情報:hoge.hoge@gmail.com
  保存して次へ
スコープの設定
  何も設定せずに、保存して次へ
テストユーザー
  ADD USERS、自分の gmail アドレス (hoge.hoge@gmail.com)
  保存して次へ

 

 

□ ウェブ プレビューの使い方
https://cloud.google.com/shell/docs/using-web-preview
SimpleHTTPServer の例
cd `mktemp -d` \
    && echo '<html><body>Hello World</body></html>' >./index.html \
    && python -m SimpleHTTPServer 8080

cd `mktemp -d` && echo '<html><body>Hello World</body></html>' > ./index.html && python -m SimpleHTTPServer 8080

 

 

(20220228 追加コメント)
1回目
※ セッションを閉じ、ログイン情報や、クッキーをクリア後。または他のブラウザから
Connect Me!

アカウント (hoge.hoge@gmail.com) のログインと認証 (許可) (「招待元のデベロッパーを信頼できる場合のみ、続行してください。」)

Click here to insert an event

Event created


2回目
※ セッションを閉じ (ブラウザを閉じ)、ブラウザを再起動した後。またはPC再起動後
Connect Me!

Click here to insert an event

Event created

 

<< HTML から PHP に書き換え >>
<?php
echo("<div class=\"box\">\n");
if (isset($authUrl)):
  echo("<div class=\"request\">\n");
  echo("<a class='login' href='" . $authUrl . "'>Connect Me!</a>\n");
  echo("</div>\n");
elseif($_SERVER['REQUEST_METHOD'] == 'POST'):
  echo("<div class=\"shortened\">\n");
  echo("<p>Your call was successful! Check your calendar for the following link:</p>\n");
  echo("<ul>\n");
  echo("<li><a href=\"" . $event->htmlLink . "\" target=\"_blank\">Event</a></li>\n");
  echo("</ul>\n");
  echo("</div>\n");
else:
  echo("<form action=\"" . $redirect_uri . "\" method=\"POST\">\n");
  echo("<input type=\"submit\" value=\"Click here to insert an event\" /><br>\n");
  echo("<br>\n");
  echo("<!-- <a href=\"insert-by-http-request.html\">(insert by HTTP request)</a><br> -->\n");
  echo("</form>\n");
endif;
echo("</div>\n");
?>