Google Contact API - Oauth 2.0

时间:2012-12-06 11:11:09

标签: python google-api oauth-2.0 google-contacts

我正在寻找一种从Google帐户中检索我的联系人的每个电子邮件地址以获取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)

据官方'google contact api'Google群组迁移到stackoverflow,只读访问权限已损坏。

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

我在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添加到我的范围,该范围不会出现在名单上。

还有其他办法吗?

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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

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