服务帐户与Google日历的连接

时间:2018-09-20 08:45:08

标签: php google-api google-oauth2

我正在尝试连接到 Google日历,并使用域范围内的授权设置了服务帐户。 然后,我下载了json p12文件,将其放在我的Web服务器上,并尝试运行以下代码。

目标是让php脚本从Google日历返回事件列表,以便可以使用它们。

执行代码时, $ events 不包含日历中列出的任何项目,而是一个类似于php源代码下方的json对象。

我误读了文档,是否遗漏了明显的内容?

非常感谢您的反馈,

内特

<? require_once 'vendor/autoload.php';

    $calendar = initCalendar();

    $events = $calendar->events->listEvents('primary');

    // Take from : https://developers.google.com/calendar/v3/reference/events/list
    while(true) {
      foreach ($events->getItems() as $event) {
        echo $event->getSummary();
      }
      $pageToken = $events->getNextPageToken();
      if ($pageToken) {
        $optParams = array('pageToken' => $pageToken);
        $events = $service->events->listEvents('primary', $optParams);
      } else {
        break;
      }
    }

    function initCalendar(){

        $KEY_FILE_LOCATION = __DIR__ . '/my_downloaded_file.json';

        $client = new Google_Client();

        putenv('GOOGLE_APPLICATION_CREDENTIALS='.$KEY_FILE_LOCATION);
        $client->setAuthConfig($KEY_FILE_LOCATION);
        $client->useApplicationDefaultCredentials();


        $client->setApplicationName('Calendar Sync');
        $client->setIncludeGrantedScopes(true);   // incremental auth       
        $client->setScopes([
            Google_Service_Calendar::CALENDAR
            , Google_Service_Calendar::CALENDAR_READONLY
        ]);     


        $client->setRedirectUri('https://' . $_SERVER['HTTP_HOST'] . '/api/events.php');
        $client->setAccessType('offline');        // offline access


        $calendar = new Google_Service_Calendar($client);       

        return $calendar;   

    }


?>

返回的JSON

object(Google_Service_Calendar_Events)#58 (19) {
  ["collection_key":protected]=>
  string(5) "items"
  ["accessRole"]=>
  string(5) "owner"
  ["defaultRemindersType":protected]=>
  string(37) "Google_Service_Calendar_EventReminder"
  ["defaultRemindersDataType":protected]=>
  string(5) "array"
  ["description"]=>
  NULL
  ["etag"]=>
  string(18) ""sdfsdfgsdfsf""
  ["itemsType":protected]=>
  string(29) "Google_Service_Calendar_Event"
  ["itemsDataType":protected]=>
  string(5) "array"
  ["kind"]=>
  string(15) "calendar#events"
  ["nextPageToken"]=>
  NULL
  ["nextSyncToken"]=>
  string(28) "sdfsdfsdfsdfsdf="
  ["summary"]=>
  string(67) "user@domain.test"
  ["timeZone"]=>
  string(3) "UTC"
  ["updated"]=>
  string(24) "2018-09-20T10:17:37.161Z"
  ["internal_gapi_mappings":protected]=>
  array(0) {
  }
  ["modelData":protected]=>
  array(0) {
  }
  ["processed":protected]=>
  array(0) {
  }
  ["defaultReminders"]=>
  array(0) {
  }
  ["items"]=>
  array(0) {
  }
}

1 个答案:

答案 0 :(得分:1)

服务帐户是虚拟用户,不是您的个人用户。它有自己的Google日历帐户。为日历提供primary时,如果它是当前经过身份验证的用户(服务帐户)的主要日历。

您可以将新事件添加到服务帐户日历中,或者与服务帐户共享日历,然后需要提供日历的日历ID才能访问该数据。