People.connections.list не возвращает контакты с помощью клиентской библиотеки Python
Я пытаюсь программно получить доступ к списку контактов в своей личной учетной записи Google с помощью клиентской библиотеки Python
Это script, который будет запускаться на сервере без ввода пользователя, поэтому я настроил его для использования учетных данных из установленной учетной записи службы. Моя настройка консоли Google API выглядит так.
![введите описание изображения здесь]()
Я использую следующий базовый script, извлеченный из примеров, представленных в документах API -
import json
from httplib2 import Http
from oauth2client.service_account import ServiceAccountCredentials
from apiclient.discovery import build
# Only need read-only access
scopes = ['https://www.googleapis.com/auth/contacts.readonly']
# JSON file downloaded from Google API Console when creating the service account
credentials = ServiceAccountCredentials.from_json_keyfile_name(
'keep-in-touch-5d3ebc885d4c.json', scopes)
# Build the API Service
service = build('people', 'v1', credentials=credentials)
# Query for the results
results = service.people().connections().list(resourceName='people/me').execute()
# The result set is a dictionary and should contain the key 'connections'
connections = results.get('connections', [])
print connections #=> [] - empty!
Когда я нахожусь в API, он возвращает набор результатов без каких-либо "соединений". В частности, он возвращает -
>>> results
{u'nextSyncToken': u'CNP66PXjKhIBMRj-EioECAAQAQ'}
Есть ли что-то, относящееся к моей настройке или коду, что неверно? Есть ли способ увидеть код ответа HTTP-ответа или получить дополнительную информацию о том, что он пытается сделать?
Спасибо!
Боковое примечание: когда я пытаюсь использовать его "Попробуйте!" в документах API, он корректно возвращает мои контакты. Хотя я сомневаюсь, что использует клиентскую библиотеку и вместо этого полагается на авторизацию пользователя через OAuth
Ответы
Ответ 1
Требуется маска персональная защита. Укажите один или несколько допустимых путей. Допустимые пути документируются на https://developers.google.com/people/api/rest/v1/people.connections/list/.
Кроме того, используйте маску fields, чтобы указать, какие поля включены в частичный ответ.
Вместо:
results = service.people().connections().list(resourceName='people/me').execute()
... try:
results = service.people().connections().list(resourceName='people/me',personFields='names,emailAddresses',fields='connections,totalItems,nextSyncToken').execute()
Ответ 2
С учетной записью сервиса в деле DwD-G Suite для домена необходимо олицетворять или делегировать пользователя таким образом
delegate = credentials.create_delegated('[email protected]')
Ответ 3
Вот рабочая демонстрация. Я только что протестировал его прямо сейчас. Python 3.5.2
google-api-python-client==1.6.4
httplib2==0.10.3
oauth2client==4.1.2
Вы можете сохранить его на demo.py
, а затем просто запустить. Я оставил функцию create_contact
в случае, если вы захотите ее использовать, и еще один пример использования API.
CLIENT_ID
и CLIENT_SECRET
являются переменными окружения, поэтому я не случайно их разделяю в коде.
"""Google API stuff."""
import httplib2
import json
import os
from apiclient.discovery import build
from oauth2client.file import Storage
from oauth2client.client import OAuth2WebServerFlow
from oauth2client.tools import run_flow
CLIENT_ID = os.environ['CLIENT_ID']
CLIENT_SECRET = os.environ['CLIENT_SECRET']
SCOPE = 'https://www.googleapis.com/auth/contacts'
USER_AGENT = 'JugDemoStackOverflow/v0.1'
def make_flow():
"""Make flow."""
flow = OAuth2WebServerFlow(
client_id=CLIENT_ID,
client_secret=CLIENT_SECRET,
scope=SCOPE,
user_agent=USER_AGENT,
)
return flow
def get_people():
"""Return a people_service."""
flow = make_flow()
storage = Storage('info.dat')
credentials = storage.get()
if credentials is None or credentials.invalid:
credentials = run_flow(flow, storage)
http = httplib2.Http()
http = credentials.authorize(http)
people_service = build(serviceName='people', version='v1', http=http)
return people_service
def create_contact(people, user):
"""Create a Google Contact."""
request = people.createContact(
body={
'names': [{'givenName': user.name}],
'phoneNumbers': [
{'canonicalForm': user.phone, 'value': user.phone}],
}
)
return request.execute()
def demo():
"""Demonstrate getting contacts from Google People."""
people_service = get_people()
people = people_service.people()
connections = people.connections().list(
resourceName='people/me',
personFields='names,emailAddresses,phoneNumbers',
pageSize=2000,
)
result = connections.execute()
s = json.dumps(result)
# with open('contacts.json', 'w') as f:
# f.write(s)
return s
if __name__ == '__main__':
print(demo())