【PHP】Google Home Mini と Google Assistant と PHP を使って、Google Calendar 登録をしてみた

webhook.php

<?php
require_once __DIR__.'/google-api-php-client-1.1.7/src/Google/autoload.php';
require_once __DIR__.'/functions.php';

$calendarId    = '◯◯◯@group.calendar.google.com';
$allDay        = 1;
$startDay  = date('Y-m-d');
$startTime = '00:00:00';
$endDay    = date('Y-m-d');
$endTime   = '00:00:00';

$update_response = file_get_contents("php://input");
$update = json_decode($update_response, true);

$summary = $update["originalRequest"]["data"]["inputs"][0]["arguments"][0]["textValue"];
$description = $update_response;
$event = writeGoogleCalendar($calendarId, $allDay, $startDay, $startTime, $endDay, $endTime, $summary, $description);

functions.php

<?php
/**
 * jsonファイルからGoogleClientを生成します
 */
function getGoogleClientByJson() {
    $json_path = __DIR__.'/key/◯◯.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);

    $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();
    }
    return $client;
}

/**
 * カレンダーにデータを書き込む
 *
 * @param string $calendarId :カレンダーID
 * @param int    $allDay     :終日かどうか(1の場合は終日として登録)
 * @param string $startDay   :開始日
 * @param string $startTime  :開始時間($allDay=1のときは無視されます)
 * @param string $endDay     :終了日
 * @param string $endTime    :終了時間($allDay=1のときは無視されます)
 * @param string $summary    :カレンダーの件名に登録されます
 * @param string $description:カレンダーの説明に登録されます
 */
function writeGoogleCalendar($calendarId, $allDay, $startDay, $startTime, $endDay, $endTime, $summary, $description) {
    $client = getGoogleClientByJson();
    $service = new Google_Service_Calendar($client);
    $dt1 = new DateTime($startDay.' '.$startTime);
    $dt2 = new DateTime($endDay.' '.$endTime);

    if ($allDay == 1) {
        // $allDayが1であれば、終日で登録する
        $event = new Google_Service_Calendar_Event(array(
          'summary' => $summary,
          'description' => $description,
          'start' => array(
            'date' => $dt1->format('Y-m-d'), // 開始日
            'timeZone' => 'Asia/Tokyo',
          ),
          'end' => array(
            'date' => $dt2->format('Y-m-d'), // 終了日
            'timeZone' => 'Asia/Tokyo',
          ),
        ));
    } else {
        // $allDayが1以外であれば、日時で登録する
        $st = $dt1->getTimestamp();
        $et = $dt2->getTimestamp();
        $event = new Google_Service_Calendar_Event(array(
          'summary' => $summary,
          'description' => $description,
          'start' => array(
            'dateTime' => date('c', $st), // 開始日時
            'timeZone' => 'Asia/Tokyo',
          ),
          'end' => array(
            'dateTime' => date('c', $et), // 終了日時
            'timeZone' => 'Asia/Tokyo',
          ),
        ));
    }
    $event = $service->events->insert($calendarId, $event);
}

今回は、google-api-php-client-1.1.7 を使用しましたが、2.0.0 で仕様がかなり変わっているみたいなので、その辺をまた調べないといけないみたい。

関連記事