Calendarlist возвращает пустой набор результатов с учетной записью службы

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

Я черпал вдохновение из того, что было сделано в quickstart.php и что объяснено в документации Google, чтобы попробовать некоторые тесты.

Проблема в том, что все мои запросы возвращают пустой результат, когда я использую метод getItems();

Мой код:

function getClient()
{
    $client = new Google_Client();
    $client->setApplicationName('Google Calendar API PHP synchroniser');
    $client->setScopes(Google_Service_Calendar::CALENDAR_READONLY);
    $client->setAuthConfig('Path/To/My/AccountService/File.json');
    $client->setAccessType('online');
    $client->setPrompt('MyCalendarWithMyData');

    // Load previously authorized token from a file, if it exists.
    // The file token.json stores the user's access and refresh tokens, and is
    // created automatically when the authorization flow completes for the first
    // time.
    /*
    $tokenPath = 'token.json';
    if (file_exists($tokenPath)) {
        $accessToken = json_decode(file_get_contents($tokenPath), true);
        $client->setAccessToken($accessToken);
    }

    // If there is no previous token or it's expired.
    if ($client->isAccessTokenExpired()) {
        // Refresh the token if possible, else fetch a new one.
        if ($client->getRefreshToken()) {
            $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
        } else {
            //I don't know what to put here.
        }
    }
    */
    return $client;
}

$client = getClient(); // based on quickstart.php

$service = new Google_Service_Calendar($client);// from the sample on documentation

$calendarList = $service->calendarList->listCalendarList();
$calendars=$calendarList->getItems();
var_dump($calendars);

Моя цель - когда я получил список календарей, чтобы получить каждое событие относительно каждого календаря в списке календарей, чтобы обновить мою базу данных. Спасибо Г.Г.


person Galaxy Ghost    schedule 15.05.2019    source источник
comment
Добро пожаловать в стек, он не работает, нам очень сложно помочь. Пожалуйста, отредактируйте свой вопрос, включите свой код и опишите любые проблемы, которые у вас возникают, например, с сообщениями об ошибках решения. вы можете прочитать stackoverflow.com/help/how-to-ask   -  person DaImTo    schedule 15.05.2019
comment
Извините, но я сделал что-то не так, когда задавал свой вопрос, теперь он должен быть лучше   -  person Galaxy Ghost    schedule 15.05.2019
comment
Извините, я все еще не понимаю вашего вопроса. Похоже, вы запрашиваете данные из API, вы не получаете никаких данных? Код, который вы разместили, не имеет ничего общего с событиями или MySQL. вам нужно предоставить нам stackoverflow.com/help/reprex, который мы можем использовать, чтобы увидеть проблему.   -  person DaImTo    schedule 15.05.2019
comment
Да, я хочу получить список календарей учетной записи, но когда я пытаюсь это сделать, он не возвращает данных. Но когда я пытаюсь напрямую использовать Google CalendarList API с функцией Try it, он возвращает мои ожидаемые данные. Я сделал что-то не так в коде выше?   -  person Galaxy Ghost    schedule 15.05.2019
comment
Вы используете сервисный аккаунт? Вы входите в систему под тем же пользователем, что и в Try it?   -  person DaImTo    schedule 15.05.2019
comment
Я создал учетную запись службы, скачал файл json и указал путь к нему следующим методом: PHP $client->setAuthConfig('My/Path/To/My/AccountService/File.json');   -  person Galaxy Ghost    schedule 15.05.2019


Ответы (1)


Что вам нужно помнить, так это то, что учетная запись службы — это не вы. Сервисный аккаунт — это фиктивный пользователь. У этого пользователя есть собственная учетная запись календаря Google, учетная запись на диске и, возможно, еще несколько.

Если вы сделаете

$calendar = $service->calendars->get('primary');
echo $calendar->getSummary();

Вы увидите, что на самом деле в вашей служебной учетной записи есть календарь. Чего у него нет, так это ничего по умолчанию в его списке календарей.

Если вы хотите, чтобы он имел доступ к вашему личному календарю Google, вам нужно будет перейти на веб-сайт календаря Google и поделиться календарем с адресом электронной почты учетной записи службы. затем он должен быть в состоянии сделать следующее: убедитесь, что вы записали идентификатор календаря для календаря, которым вы поделились с ним, пока вы находитесь в настройках.

$calendar = $service->calendars->get('calendarid');

echo $calendar->getSummary();

Если вы действительно хотите, чтобы это было в списке календарей, вы можете добавить его.

$calendarListEntry = new Google_Service_Calendar_CalendarListEntry();
$calendarListEntry->setId("calendarId");

$createdCalendarListEntry = $service->calendarList->insert($calendarListEntry);

echo $createdCalendarListEntry->getSummary();

Сервисный аккаунт настроен

Как я уже упоминал, сервисные аккаунты должны быть предварительно авторизованы. Вам нужно перейти на веб-сайт Календаря Google и в настройках календаря, к которому вы хотите, чтобы он имел доступ, вам нужно поделиться с ним календарем, как показано

введите здесь описание изображения

Полезные ссылки

person DaImTo    schedule 15.05.2019
comment
Я попробовал то, что вы дали с помощью метода get, я получил основной календарь, который хотел. Но на самом деле этот календарь связан с несколькими другими календарями, и я хочу получить его с помощью calendarList, потому что, когда у меня будут эти календари, мне нужно будет извлечь каждое событие из них, чтобы обновить мою базу данных. - person Galaxy Ghost; 15.05.2019
comment
Затем вам нужно сделать вставку в список календарей, если вы действительно этого хотите. Весь список календарей на самом деле является списком, используемым для отображения в нижней левой части веб-сайта календаря Google. Поскольку учетная запись службы не имеет возможности использовать веб-сайт календаря Google, по умолчанию в ее списке календарей ничего нет. Календари не связаны друг с другом. Вы что-то не так понимаете в календаре Google - person DaImTo; 15.05.2019
comment
Если вы знаете, из какого календаря вам нужны события, почему бы просто не использовать developers.google. com/календарь/v3/ссылка/события/список? - person DaImTo; 15.05.2019
comment
Да, я не понимаю, как вы сказали ранее: вы используете учетную запись службы? Вы входите в систему под тем же пользователем, что и в Try it? Кажется, это не потому, что когда я пытаюсь получить события в основном календаре, многие данные защищены, и я не могу получить к ним доступ. Когда я попробовал функцию «Попробовать» на веб-сайте Google Calendar API, я только что проверил OAuth2.0 и нажал «Выполнить». Как я могу узнать, что Google использовал для выполнения этого запроса? - person Galaxy Ghost; 15.05.2019
comment
Какой тип клиента вы создали в консоли разработчика Google? Если вы создали клиент Oauth2 (браузер), то при запуске кода он появится и попросит вас войти в систему как пользователь и предоставить им доступ. Если вы используете учетную запись службы, то учетная запись сервера предварительно авторизуется с собственной учетной записью своего собственного пользователя. - person DaImTo; 15.05.2019
comment
Я создал: -1 ключ API -1 идентификатор клиента OAuth 2.0 -1 ключ сервисной учетной записи - person Galaxy Ghost; 15.05.2019
comment
И какой из них вы используете в своем коде? почему бы вам не отредактировать свой вопрос, опубликовав свой метод getClient, чтобы я мог его увидеть. Вероятно, вам нужен только один из них, а не все три. - person DaImTo; 15.05.2019
comment
Сообщение отредактировано, не знаю, как использовать идентификатор клиента OAuth2.0, когда я пытаюсь, он говорит, что у меня внутренняя ошибка 500. Затем я попробовал учетную запись службы, и это, кажется, работает, но, как уже говорилось ранее, не совсем, я пойду посмотреть, что вы сказали в своем отредактированном ответе - person Galaxy Ghost; 15.05.2019
comment
Я думаю, вам следует сделать шаг назад и следовать руководству и понять, как это работает, что код даже отдаленно не корректен для Oauth2 или учетных записей служб developers.google.com/calendar/quickstart/php - person DaImTo; 15.05.2019
comment
Я использовал и тестировал этот учебник, мой тестовый код основан на нем. Я попытался изменить его, чтобы приспособить к моим проблемам. Проблема в том, что я не совсем понимаю часть инициализации клиента. :/ Затем я попытался понять это самостоятельно, но, как вы видели, это нехорошо. - person Galaxy Ghost; 15.05.2019
comment
попробуйте это daimto.com/google-developer-console-oauth2, затем попробуйте этот daimto.com/google-developer-console-service-account - person DaImTo; 15.05.2019
comment
Кажется, я нашел способ найти все свои данные, используя учетную запись службы, и выполняя этот запрос ``` $service-›events-›listEvents($calendarId) ``` просто в цикле и изменяя $ calendarId каждый раз, когда я его вызываю - person Galaxy Ghost; 15.05.2019