Я пытаюсь использовать Google People API для добавления и обновления моих контактов в Google. Я настроил API почти дословно с примером кода, приведенным в документации Google (https://developers.google.com/people/v1/getting-started). Я получаю ошибку для следующей строки кода, которая снова дословно появляется из документации:
$profile = $people_service->people->get('people/me', array('personFields' => 'names,emailAddresses'));
Ошибка заключается в следующем:
Fatal error: Uncaught exception 'Google_Exception' with message '(get) unknown parameter: 'personFields'' in /home/danbak15/bakerlegalservicesmo.com/office/google-api-php-client-2.2.0/src/Google/Service/Resource.php:147 Stack trace: #0 /home/danbak15/bakerlegalservicesmo.com/office/google-api-php-client-2.2.0/vendor/google/apiclient-services/src/Google/Service/People/Resource/People.php(52): Google_Service_Resource->call('get', Array, 'Google_Service_...') #1 /home/danbak15/bakerlegalservicesmo.com/office/BLScontacts.php(36): Google_Service_People_Resource_People->get('people/me', Array) #2 {main} thrown in /home/danbak15/bakerlegalservicesmo.com/office/google-api-php-client-2.2.0/src/Google/Service/Resource.php on line 147
Я видел ответ на аналогичный вопрос (Не удается получить доступ к данным моего профиля при доступе к API Google-People) предложить использовать класс Google_Service_PeopleService вместо класса Google_Service_People, как указано в документации. Однако, когда я пытаюсь сделать это, я получаю еще одну ошибку:
Fatal error: Uncaught exception 'Google_Service_Exception' with message '{ "error": { "code": 401, "message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.", "errors": [ { "message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.", "domain": "global", "reason": "unauthorized" } ], "status": "UNAUTHENTICATED" } } ' in /home/danbak15/bakerlegalservicesmo.com/office/google-api-php-client-2.2.0/src/Google/Http/REST.php:118 Stack trace: #0 /home/danbak15/bakerlegalservicesmo.com/office/google-api-php-client-2.2.0/src/Google/Http/REST.php(94): Google_Http_REST::decodeHttpResponse(Object(GuzzleHttp\Psr7\Response), Object(GuzzleHttp\Psr7\Request), 'G in /home/danbak15/bakerlegalservicesmo.com/office/google-api-php-client-2.2.0/src/Google/Http/REST.php on line 118
На данный момент я в полной растерянности. Я хотел бы использовать Контакты Google, чтобы отслеживать свои контакты, и хотел бы иметь возможность работать с Контактами Google через PHP, чтобы я мог добавить их в свою базу данных. Кто-нибудь может пролить свет на это? Спасибо заранее за любую помощь!
ОБНОВИТЬ:
Я попытался переместить страницу на локальный сервер на моем компьютере (забыв, что Google перенаправляет страницу на мой сайт), чтобы посмотреть, смогу ли я получить другой результат с другого сервера. Каким-то волшебным образом это сработало, когда я пытался получить доступ к сценарию с моего сайта — в течение 15-30 минут или около того. Затем я получил ту же ошибку, что и раньше. Если я запускаю страницу с моего локального сервера, я попаду в бесконечный цикл перенаправления авторизации (что и следовало ожидать, учитывая, что Google перенаправляет меня на онлайн-страницу), но тогда онлайн-страница будет работать некоторое время.
На данный момент, я не могу начать догадываться, где проблема. Имеет ли это смысл для кого-то еще?
Это работало нормально для меня:
$scopes[] = 'https://www.googleapis.com/auth/contacts.readonly';
$client->setScopes($scopes);
$service = new Google_Service_People($client);
$optParams = ['requestMask.includeField' => 'person.names'];
$connections = $service->people_connections->listPeopleConnections('people/me', $optParams)->getConnections();
foreach ($connections as $connection) {
if (!empty($connection->getNames()[0])) {
print $connection->getNames()[0]->getDisplayName() . "\n" . '<br>';
}
}
Я думаю, я знаю, что происходит.
Мой английский не очень хорошо, поэтому я надеюсь, что вы понимаете, что я имею в виду ..
В моем случае я использую класс Google_Service_People (src \ Google \ Service \ People.php) и получаю ту же ошибку, что и вы. Итак, я смотрю на People.php и вижу это:
$this->people = new Google_Service_People_Resource_People(
$this,
$this->serviceName,
'people',
array(
'methods' => array(
'get' => array(
'path' => 'v1/{+resourceName}',
'httpMethod' => 'GET',
'parameters' => array(
'resourceName' => array(
'location' => 'path',
'type' => 'string',
'required' => true,
),
'requestMask.includeField' => array( // <= This is the problem.
'location' => 'query',
'type' => 'string',
),
),
),
Я проверяю официальный документ и там говорятrequestMask.includeField уже УСТАРЕЛО.«но это все-таки в коде API, как-то.
Поэтому я изменил это на это:
$this->people = new Google_Service_People_Resource_People(
$this,
$this->serviceName,
'people',
array(
'methods' => array(
'get' => array(
'path' => 'v1/{+resourceName}',
'httpMethod' => 'GET',
'parameters' => array(
'resourceName' => array(
'location' => 'path',
'type' => 'string',
'required' => true,
),
'personFields' => array( // <- Change to 'personFields'
'location' => 'query',
'type' => 'string',
),
),
После этого все идет хорошо.
Если вы используете Клиентские библиотеки Google API от PHP. Эта клиентская библиотека находится в бета. Таким образом, что-то в их API не похоже на то, как оно есть в их API-документе.
Так что это мой случай. Английский не мой язык, поэтому я надеюсь, вы понимаете, что я пытаюсь описать.
Джон Родригес решил проблему. Спасибо! Моя библиотека немного отличается, но проблема была та же. В моем случае я использую класс Google_Service_PeopleService вместо класса Google_Service_People. Путь к файлу, который я изменил: google-api-php-client-2.2.0 / vendor / google / apiclient-services / src / Google / Service / PeopleService.php. В этом случае $ this-> people — это класс Google_Service_PeopleService_Resource_People, который содержит массив методов. Я закомментировал устаревший код. Вот соответствующий код:
$this->people = new Google_Service_PeopleService_Resource_People(
$this,
$this->serviceName,
'people',
array(
'methods' => array(
'createContact' => array(
...
),
),
),'deleteContact' => array(
...
),
),
),'get' => array(
'path' => 'v1/{+resourceName}',
'httpMethod' => 'GET',
'parameters' => array(
'resourceName' => array(
'location' => 'path',
'type' => 'string',
'required' => true,
),
'personFields' => array(
'location' => 'query',
'type' => 'string',
),
/* 'requestMask.includeField' => array(
'location' => 'query',
'type' => 'string',
), */
),
),'getBatchGet' => array(
'path' => 'v1/people:batchGet',
'httpMethod' => 'GET',
'parameters' => array(
'personFields' => array(
'location' => 'query',
'type' => 'string',
),
/* 'requestMask.includeField' => array(
'location' => 'query',
'type' => 'string',
), */
'resourceNames' => array(
'location' => 'query',
'type' => 'string',
'repeated' => true,
),
),
),'updateContact' => array(
...
),
),
),
Пока это работает как надо, но я еще не проверил это полностью. Спасибо за помощь!