12

我正在尝试使用 Python 客户端库以编程方式访问我自己的个人 Google 帐户中的联系人列表

这是一个无需用户输入即可在服务器上运行的脚本,因此我将其设置为使用我设置的服务帐户中的凭据。我的 Google API 控制台设置如下所示。

在此处输入图像描述

我正在使用以下基本脚本,从 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 的用户授权

4

4 回答 4

6

personFields掩码是必需的。指定一个或多个有效路径。有效路径记录在https://developers.google.com/people/api/rest/v1/people.connections/list/

此外,使用字段掩码来指定部分响应中包含哪些字段。

代替:

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

... 尝试:

results = service.people().connections().list(resourceName='people/me',personFields='names,emailAddresses',fields='connections,totalItems,nextSyncToken').execute() 
于 2017-08-31T20:19:00.700 回答
2

这是一个工作演示。我现在刚刚测试过。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())
于 2017-11-18T20:54:49.357 回答
0

使用服务帐户,在 DwD - G Suite 域范围委派中,必须以这种方式模拟或委派用户

delegate = credentials.create_delegated('user@xxxx.xxx')
于 2017-11-18T09:54:25.553 回答
0

对于其他 googlers:我在使用 JS API 时遇到了同样的问题。

我在我的个人 gmail 地址上成功了,但在我的工作之一(g-suite)上也没有在我的辅助 gmail 地址上。

看不到图案。该作品可能已停用联系人列表。

于 2018-05-09T07:37:59.480 回答