У меня возникли проблемы с чтением событий календаря с библиотеками PHP, предоставляемыми Google. Календари, которые я хочу прочитать, НЕ публично доступны, но я хочу их прочитать на своем серверном приложении.
Учетная запись, в которой хранятся календари, отделена от моей (я буду называть ее учетной записью API), хотя календари мне поделили.
В соответствии с опубликованными в Google деталях календаря:
Любой может: ничего не видеть
Вы можете: видеть только свободные / занятые (скрыть детали).
У учетной записи API и моей учетной записи есть учетные записи службы OAuth2.0 с ключом P12.
Я следил за руководством по адресу: http://www.daimto.com/google_service_account_php/, что помогло мне выяснить процесс аутентификации. Мне удалось прочитать календари, которые публично доступны без каких-либо проблем в любой учетной записи. Вот мой код:
// Start the Google client $client = new Google_Client(); $client->setClientId({{client_id from google}}); $client->setApplicationName("Project Name"); $client->setClientSecret({{client_secret from google}}); $key = file_get_contents({{key_file_location on my server}}); $cred = new Google_Auth_AssertionCredentials( $Email_address, // Scopes that we will be using array( "https://www.googleapis.com/auth/calendar" ), $key ); $client->setAssertionCredentials($cred); if($client->getAuth()->isAccessTokenExpired()) { $client->getAuth()->refreshTokenWithAssertion($cred); } // Use Google Calendar API plugin $service = new Google_Service_Calendar($client); $optParams = array( 'singleEvents'=> true, 'timeMin'=>date(DateTime::ATOM), 'timeMax' => date(DateTime::ATOM, time()+(3 * 24 * 60 * 60)) ); $results = $service->events->listEvents( '{{Calendar ID from Google Calendar Settings}}', $optParams );
Однако при попытке использовать код для календарей, которые не являются общедоступными, я получаю следующую ошибку в любой из этих учетных записей:
Неустранимая ошибка: исключить исключение «Google_Service_Exception» с сообщением «Ошибка вызова GET https://www.googleapis.com/calendar/v3/calendars {{CalendarID}} 🙁 404) Не найдено …
Когда я пытаюсь var_dump($client->getAuth())
, я заметил, что есть значение, которое может предполагать, что аутентификация не работает: ["authenticated":"Google_Client":private]=> bool(false)
. Это происходит на обоих учетных записях и в общедоступных и общедоступных календарях.
Я могу использовать Google API Explorer с моей учетной записью, чтобы показывать данные JSON в календаре, которые не являются общедоступными. Есть ли что-то, отсутствующее в API Google PHP или настройках учетной записи Google, что позволит мне делать то, что я хочу?
Спасибо за ваше время.
Если вы хотите получить доступ к приватным календарям с учетной записью службы, вам необходимо либо выполнить делегирование полномочий, если вы владеете доменом, содержащим эти календари ( https://developers.google.com/drive/web/delegation описывает его для диска, но он работает для календаря), или вам нужно будет разделить частный календарь с адресом электронной почты учетной записи службы.
Спасибо за ваше предложение.
Оказывается, проблема заключалась в том, что лицо, ответственное за учетную запись API, не делилось календарями с электронной почтой учетной записи сервера разработчика.
Поскольку у меня не было доступа к настройкам учетной записи API, и ошибка из API календаря Google была не очень описательной, потребовалось некоторое время, чтобы понять.