Как я могу показать список * всех * доступных календарей, используя Google Calendar API v3 / клиентскую библиотеку Google API?

Я пытался получить доступ к API Календаря Google v3, используя PHP. Первоначально я хочу просто перечислить пользовательские календари, которые доступны для моего вызова API.

Для этого я скачал клиентскую библиотеку PHP API Google и попытался использовать следующий код (полученный из моих адаптаций, из https://mytechscraps.wordpress.com/2014/05/15/accessing-google-calendar-using-the-php-api/ ):

<?php

//error_reporting(0);
//@ini_set('display_errors', 0);

// If you've used composer to include the library, remove the following line
// and make sure to follow the standard composer autoloading.
// https://getcomposer.org/doc/01-basic-usage.md#autoloading
require_once './google-api-php-client-master/autoload.php';

// Service Account info
$client_id = '754612121864-pmdfssdfakqiqblg6lt9a.apps.googleusercontent.com';
$service_account_name = '754674507864-pm1dsgdsgsdfsdfsdfdflg6lt9a@developer.gserviceaccount.com';
$key_file_location = 'Calendar-7dsfsdgsdfsda953d68dgdsgdsff88a.p12';$client = new Google_Client();
$client->setApplicationName("Calendar");

$service = new Google_Service_Calendar($client);

$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials(
$service_account_name,
array('https://www.googleapis.com/auth/calendar.readonly'),
$key
);

$client->setAssertionCredentials($cred);

$cals = $service->calendarList->listCalendarList();
print_r($cals);

?>

Я создал учетную запись службы в консоли разработчиков Google и сгенерировал данные OAuth, которые я использовал для установки соответствующих переменных, как видно из кода.

Этот код возвращает следующее:

Google_Service_Calendar_CalendarList Object ( [collection_key:protected] => items [internal_gapi_mappings:protected] => Array ( ) [etag] => "14171313334000" [itemsType:protected] => Google_Service_Calendar_CalendarListEntry [itemsDataType:protected] => array [kind] => calendar#calendarList [nextPageToken] => [nextSyncToken] => 000014121268327000 [modelData:protected] => Array ( [items] => Array ( [0] => Array ( [kind] => calendar#calendarListEntry [etag] => "1417721316542000" [id] => [email protected] [summary] => [email protected] [timeZone] => Europe/London [colorId] => 23 [backgroundColor] => #cd74e6 [foregroundColor] => #000000 [selected] => 1 [accessRole] => reader [defaultReminders] => Array ( ) ) ) ) [processed:protected] => Array ( ) )

Проблема в том, что это, кажется, возвращает подробности только один календарь. То есть календарь для [email protected] (единственный, которым я явно поделился со своим сервисом).

Тем не менее, я знаю, что эта учетная запись Google имеет доступ только для чтения к ряду календарей других пользователей (я вижу их при входе в Календарь Google от имени этого пользователя).

Кроме того, если я использую Google Apps Explorer на этой странице: https://developers.google.com/google-apps/calendar/v3/reference/calendarList/list#auth , Когда я вошел в мою учетную запись Google как [email protected], я получаю подробную информацию о все из этих других календарей.

Поэтому я пытаюсь понять, почему Apps Explorer показывает мне все остальные календари, а код PHP — нет?

2

Решение

Сервисной учетной записи не нужно запрашивать у пользователя доступ, потому что вы должны настроить ее. Перейдите на сайт Календаря Google. Найдите «Настройки календаря», затем перейдите на вкладку «Календари», найдите календарь, к которому вы хотите получить доступ, и нажмите «Общий доступ: Изменить настройки», добавьте адрес электронной почты учетной записи службы, как и адрес электронной почты абонента. Это даст учетной записи службы такой же доступ, как если бы вы использовали ее совместно с любым другим пользователем.

<?php
session_start();
require_once 'Google/Client.php';
require_once 'Google/Service/Calendar.php';
/************************************************
The following 3 values an befound in the setting
for the application you created on Google
Developers console.         Developers console.
The Key file should be placed in a location
that is not accessable from the web. outside of
web root.

In order to access your GA account you must
Add the Email address as a user at the
ACCOUNT Level in the GA admin.
************************************************/
$client_id = '1046123799103-nk421gjc2v8mlr2qnmmqaak04ntb1dbp.apps.googleusercontent.com';
$Email_address = '1046123799103-nk421gjc2v8mlr2qnmmqaak04ntb1dbp@developer.gserviceaccount.com';
$key_file_location = '629751513db09cd21a941399389f33e5abd633c9-privatekey.p12';
$client = new Google_Client();
$client->setApplicationName("Client_Library_Examples");
$key = file_get_contents($key_file_location);
// seproate additional scopes with a comma
$scopes ="https://www.googleapis.com/auth/calendar.readonly";
$cred = new Google_Auth_AssertionCredentials(
$Email_address,
array($scopes),
$key
);
$client->setAssertionCredentials($cred);
if($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion($cred);
}
$service = new Google_Service_Calendar($client);

?>

<html><body>

<?php
$calendarList  = $service->calendarList->listCalendarList();
print_r($calendarList);
while(true) {
foreach ($calendarList->getItems() as $calendarListEntry) {
echo "<a href='Oauth2.php?type=event&id=".$calendarListEntry->id." '>".$calendarListEntry->getSummary()."</a><br>\n";
}
$pageToken = $calendarList->getNextPageToken();
if ($pageToken) {
$optParams = array('pageToken' => $pageToken);
$calendarList = $service->calendarList->listCalendarList($optParams);
} else {
break;
}
}

?>
</html>

код извлечен из учебника API Календаря Google с PHP — Сервисный аккаунт

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]