□ 概要
プログラム内で認証手順を行って $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 に変更
□ 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.php を API_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)
機能:
ブラウザで、PHP、Java、Python、Ruby などのウェブページを開く
$authUrl のリンクをクリックすると、OAuth 同意画面が開く
同意が完了すると、?code=*** が付加されて戻る (リダイレクト)。code を token に変換してセッションに保存する
必要ならば一旦確認ボタンを表示して、カレンダーへ書き込みを行う
APIとサービス
認証情報
上部ボタン、認証情報を作成
OAuth クライアント ID
アプリケーションの種類:ウェブ アプリケーション
名前:ウェブ クライアント1
承認済みの JavaScript 生成元: (なし)
承認済みのリダイレクト URI: https://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");
?>