4

我正在寻找一种从谷歌帐户中检索我的联系人的每个电子邮件地址的好方法,以用于 Python 中的“桌面”应用程序。

第一次,我通过 Google Code 创建了一个应用程序。我切换了 Google Plus API,检索了我的大部分用户数据,但没有检索到我的任何联系人。

我开始调查,发现了很多东西,但大部分都已经过时了。

我找到了一个很好的方法来检索我的联系人,使用 gdata 库,但通过https://www.google.com/m8/feeds授予我完整的读/写访问权限,没有反馈。

self.gd_client = gdata.contacts.client.ContactsClient(source='MyAppliName')
self.gd_client.ClientLogin(email, password, self.gd_client.source)

根据迁移到 stackoverflow 的官方 'google contact api' google group,只读访问被破坏。

顺便说一句,我不是“相信我的应用程序,我使用只读访问,我发誓”的超级粉丝。

我在https://developers.google.com/oauthplayground找到了 google api 游乐场,他们在其中使用 OAuth2.0 令牌和大多数 api,包括联系人,切换网页:

Google OAuth 2.0 Playground 正在请求以下权限:

  • 管理您的联系人

根据这个游乐场,可以将 OAuth2.0 与 google contact api 一起使用,但我不知道如何将 https://www.google.com/m8/feeds 添加到我的范围内,它没有出现在列表中.

还有其他方法吗?

4

2 回答 2

4

如果这个问题仍然对您开放,这里有一些示例代码如何使用 oauth2 和 Google Contact API v3:

import gdata.contacts.client
from gdata.gauth import AuthSubToken
from oauth2client import tools
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage


def oauth2_authorize_application(client_secret_file, scope, credential_cache_file='credentials_cache.json'):
    """
    authorize an application to the requested scope by asking the user in a browser.

    :param client_secret_file: json file containing the client secret for an offline application
    :param scope: scope(s) to authorize the application for
    :param credential_cache_file: if provided or not None, the credenials will be cached in a file.
        The user does not need to be reauthenticated
    :return OAuth2Credentials object
    """
    FLOW = flow_from_clientsecrets(client_secret_file,
                                   scope=scope)

    storage = Storage(credential_cache_file)
    credentials = storage.get()

    if credentials is None or credentials.invalid:
        # Run oauth2 flow with default arguments.
        credentials = tools.run_flow(FLOW, storage, tools.argparser.parse_args([]))

    return credentials

SCOPES = ['https://www.google.com/m8/feeds/', 'https://www.googleapis.com/auth/userinfo.email']

credentials = oauth2_authorize_application('client-secret.json', scope=SCOPES)
token_string = credentials.get_access_token().access_token

# deprecated!
# auth_token = AuthSubToken(token_string, SCOPES)

with open('client-secret.json') as f:
    oauth2_client_secret = json.load(f)

auth_token = gdata.gauth.OAuth2Token(
    client_id=oauth2_client_secret['web']['client_id'],
    client_secret=oauth2_client_secret['web']['client_secret'],
    scope=SCOPES,
    user_agent='MyUserAgent/1.0',
    access_token=credentials.get_access_token().access_token,
    refresh_token=credentials.refresh_token)


client = gdata.contacts.client.ContactsClient(auth_token=auth_token)

query = gdata.contacts.client.ContactsQuery()
于 2015-03-26T09:35:18.413 回答
1

请求应如下所示:

https://accounts.google.com/o/oauth2/auth?
scope=https%3A%2F%2Fwww.google.com%2Fm8%2Ffeeds&
state=<myState>&
redirect_uri=<Redirect URI>&
response_type=code&
client_id=<my Client ID>&approval_prompt=force

这将获得对用户联系人的读/写访问权限。

于 2012-12-06T19:57:41.287 回答