Вставка записей календаря Google с учетной записью службы

Я пытаюсь использовать учетную запись службы для создания записей в календаре Google. Я очень близко к этому, но самая последняя строка не сработает. Я получаю 500 Internal Service Error когда я позволяю этому запустить. В противном случае программа работает без ошибок, что бы ни стоило.

Содержимое файла Calendar.php можно найти здесь . Метод insert() который я пытаюсь вызвать, начинается в строке 1455 этого файла.

 <?php function calendarize ($title, $desc, $ev_date, $cal_id) { session_start(); /************************************************ Make an API request authenticated with a service account. ************************************************/ set_include_path( '../google-api-php-client/src/'); require_once 'Google/Client.php'; require_once 'Google/Service/Calendar.php'; // (not real keys) $client_id = '843319906820-jarm3f5ctbtjj9b7lp5qdcqal54p1he6.apps.googleusercontent.com'; $service_account_name = '843319906820-jarm3f5ctbtjj7b7lp5qdcqal54p1he6@developer.gserviceaccount.com'; $key_file_location = '../google-api-php-client/calendar-249226a7a27a.p12'; // echo pageHeader("Service Account Access"); if (!strlen($service_account_name) || !strlen($key_file_location)) echo missingServiceAccountDetailsWarning(); $client = new Google_Client(); $client->setApplicationName("xxxx Add Google Calendar Entries"); if (isset($_SESSION['service_token'])) { $client->setAccessToken($_SESSION['service_token']); } $key = file_get_contents($key_file_location); $cred = new Google_Auth_AssertionCredentials( $service_account_name, array('https://www.googleapis.com/auth/calendar'), $key ); $client->setAssertionCredentials($cred); if($client->getAuth()->isAccessTokenExpired()) { $client->getAuth()->refreshTokenWithAssertion($cred); } $_SESSION['service_token'] = $client->getAccessToken(); // Prior to this, the code has mostly come from Google's example // google-api-php-client / examples / service-account.php // and relates to getting the access tokens. // The rest of this is about setting up the calendar entry. //Set the Event data $event = new Google_Service_Calendar_Event(); $event->setSummary($title); $event->setDescription($desc); $start = new Google_Service_Calendar_EventDateTime(); $start->setDate($ev_date); $event->setStart($start); $end = new Google_Service_Calendar_EventDateTime(); $end->setDate($ev_date); $event->setEnd($end); $calendarService = new Google_Service_Calendar($client); $calendarList = $calendarService->calendarList; $events = $calendarService->events; // if I leave this line, my code won't crash (but it won't do anything, either) //echo "here"; die(); $events.insert($cal_id, $event, false); } ?> 

Я понял это. Поскольку я не вижу никаких примеров использования учетных записей службы с API v3, я просто отправлю свое полное решение для справки. Однако есть несколько вещей, которые вам нужно сделать в дополнение к реализации кода:

1) Вам нужно перейти на консоль Google Developer и пометить свою учетную запись как «учетную запись службы». Это будет отличать его от веб-приложения. Важным отличием является то, что никому не будет предложено войти в свою учетную запись до того, как будут добавлены события, поскольку учетная запись будет принадлежать вашему приложению, а не конечный пользователь. Для получения дополнительной информации см. Эту статью , начиная со страницы 5.

2) Вам нужно создать пару открытого / закрытого ключа. На консоли разработчика нажмите «Учетные данные». Под учетной записью службы нажмите «Создать новый ключ P12». Вам нужно будет это где-то хранить. Это расположение файла становится $key_file_location переменной $key_file_location в коде ниже.

3) Также с консоли разработчика вам нужно включить API Calendar . Из вашего проекта на левом поле вы увидите APIs . Выберите это и найдите API Calendar . Щелкните по нему, примите условия обслуживания и убедитесь, что он теперь отображается в разделе « Enabled APIs со статусом « On

4) В календаре Google, который вы хотите добавить к событиям, в настройках, нажмите «Настройки календаря», а затем «Раскрыть этот календарь» вверху. В разделе «Поделиться с конкретными людьми» в поле «Лицо» вставьте адрес электронной почты из учетных данных учетной записи службы. Измените настройки разрешений на «Внести изменения в события». Не забудьте сохранить изменения.

Затем реализуйте этот код где-нибудь.

Прокомментируйте, если что-то запутанно или опущено. Удачи!

 <?php function calendarize ($title, $desc, $ev_date, $cal_id) { session_start(); /************************************************ Make an API request authenticated with a service account. ************************************************/ set_include_path( '../google-api-php-client/src/'); require_once 'Google/Client.php'; require_once 'Google/Service/Calendar.php'; //obviously, insert your own credentials from the service account in the Google Developer's console $client_id = '843319906820-xxxxxxxxxxxxxxxxxxxdcqal54p1he6.apps.googleusercontent.com'; $service_account_name = '843319906820-xxxxxxxxxxxxxxxxxxxdcqal54p1he6@developer.gserviceaccount.com'; $key_file_location = '../google-api-php-client/calendar-xxxxxxxxxxxx.p12'; if (!strlen($service_account_name) || !strlen($key_file_location)) echo missingServiceAccountDetailsWarning(); $client = new Google_Client(); $client->setApplicationName("Whatever the name of your app is"); if (isset($_SESSION['service_token'])) { $client->setAccessToken($_SESSION['service_token']); } $key = file_get_contents($key_file_location); $cred = new Google_Auth_AssertionCredentials( $service_account_name, array('https://www.googleapis.com/auth/calendar'), $key ); $client->setAssertionCredentials($cred); if($client->getAuth()->isAccessTokenExpired()) { $client->getAuth()->refreshTokenWithAssertion($cred); } $_SESSION['service_token'] = $client->getAccessToken(); $calendarService = new Google_Service_Calendar($client); $calendarList = $calendarService->calendarList; //Set the Event data $event = new Google_Service_Calendar_Event(); $event->setSummary($title); $event->setDescription($desc); $start = new Google_Service_Calendar_EventDateTime(); $start->setDateTime($ev_date); $event->setStart($start); $end = new Google_Service_Calendar_EventDateTime(); $end->setDateTime($ev_date); $event->setEnd($end); $createdEvent = $calendarService->events->insert($cal_id, $event); echo $createdEvent->getId(); } ?> 

Некоторые полезные ресурсы:
Пример Github для учетных записей служб
Google Developers Console для вставки событий в API v3
Использование OAuth 2.0 для доступа к API Google