2014-09-26 3 views
2

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

Calendar.php содержание файла можно найти here. Метод 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 = '[email protected]account.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); 
} 

?> 
+0

где вы получаете $ cal_id? имеет ли учетная запись службы доступ к этому календарю? – DaImTo

+0

Да. Это идентификатор календаря конкретного календаря Google, в который я пытаюсь отправить события. В этом календаре я добавил значение $ client_id в «share with specific people». – Alex

ответ

11

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

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

2) Вам необходимо создать пару открытого/закрытого ключа. На консоли разработчика нажмите «Учетные данные». Под учетной записью службы нажмите «Создать новый ключ P12». Вам нужно будет это где-то хранить. Это расположение файла становится переменной $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 = '[email protected]ccount.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 example for service accounts
Google Developers Console for inserting events in API v3
Using OAuth 2.0 to Access Google APIs

+1

Помогли много. Благодаря! –

+0

Казалось бы, это для v1 библиотеки google-api-client. Для тех, кто сейчас читает, если вы получаете «Неустранимая ошибка: класс» Google_Auth_AssertionCredentials «не найден», обязательно прочитайте https://github.com/google/google-api-php-client/blob/master/UPGRADING. мкр # google_auth_assertioncredentials-была-была-удалена – KFE

Смежные вопросы