2016-07-31 17 views
11

Ich versuche programmatisch die Liste der Kontakte auf meinem persönlichen Google-Konto mit der Python-Client-Bibliothek zugreifen zupeople.connections.list nicht wiederkehrende Kontakte mit Python-Client-Bibliothek

Dies ist ein Skript, das auf einem läuft Server ohne Benutzereingaben, also habe ich eingerichtet, Anmeldeinformationen von einem Dienstkonto zu verwenden, das ich eingerichtet habe. Mein Google API-Konsolensetup sieht so aus.

enter image description here

ich folgenden Grund Skript bin mit, zog aus den Beispielen in der API-Dokumentation zur Verfügung gestellt -

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! 

Wenn ich die API traf es ein Ergebnis ohne ‚Verbindungen‘ gesetzt zurück Schlüssel. Insbesondere gibt es zurück -

>>> results 
{u'nextSyncToken': u'CNP66PXjKhIBMRj-EioECAAQAQ'} 

Gibt es etwas in Bezug auf meine Setup oder Code, die inkorrekt ist? Gibt es eine Möglichkeit, den HTTP-Statuscode der Antwort zu sehen oder weitere Details darüber zu erhalten, was er versucht?

Danke!

Randnotiz: Wenn ich es mit versuche, gibt es meine Kontakte korrekt zurück. Obwohl ich bezweifle, dass die Client-Bibliothek verwendet und stattdessen auf Benutzerautorisierung über OAuth

+0

Hey, ich habe genau das gleiche Problem. Konnten Sie es lösen? Vielen Dank. – katericata

+0

@katericata - habe ich nicht, sorry :( – user2490003

Antwort

5

Die PersonFields Maske ist erforderlich. Geben Sie einen oder mehrere gültige Pfade an. Gültige Pfade sind unter https://developers.google.com/people/api/rest/v1/people.connections/list/ dokumentiert.

Verwenden Sie außerdem Felder Maske, um anzugeben, welche Felder in einer Teilantwort enthalten sind.

Statt:

results = service.people().connections().list(resourceName='people/me').execute() 

... versuchen:

results = service.people().connections().list(resourceName='people/me',personFields='names,emailAddresses',fields='connections,totalItems,nextSyncToken').execute() 
0

Mit Dienstkonto in DwD - G Suite Domain weite Delegation ist notwendig impersonate oder delegierten Benutzer auf diese Weise

delegate = credentials.create_delegated('[email protected]') 
0

Hier ist eine funktionierende Demo. Ich habe es gerade getestet. Python 3.5.2

google-api-python-client==1.6.4 
httplib2==0.10.3 
oauth2client==4.1.2 

Sie können es auf demo.py speichern und dann einfach laufen. Ich habe die create_contact Funktion für den Fall verlassen, dass Sie es vielleicht verwenden möchten und ein weiteres Beispiel für die API-Nutzung haben.

CLIENT_ID und CLIENT_SECRET sind Umgebungsvariablen, also teile ich das nicht versehentlich im Code.

"""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())