8

存在哪些使用 python 和oauth2.0导入谷歌联系人的可能方法?

我们成功获得了凭据,并且我们的应用程序请求访问联系人,但是在获得凭据后我找不到发现联系人 api 的方法。

所以像:

 from apiclient.discover import build
 import httplib2
 http = httplib2.Http()
 #Authorization
 service = build("contacts", "v3", http=http) 

给我们UnknownApiNameOrVersion例外。看起来联系人 API 不在 apiclient 支持的 API 列表中。

我正在寻找替代方法。

4

2 回答 2

21

Google Contacts API不能与库一起使用,因为google-api-python-client它是Google Data API,而google-api-python-client旨在与基于发现的 API一起使用。

无需经历@NikolayFominyh描述的所有麻烦,您可以在gdata-python-client.

要获取有效令牌,请按照 Google Developers博客文章中的说明深入了解该过程。

首先,创建一个令牌对象:

import gdata.gauth

CLIENT_ID = 'bogus.id'  # Provided in the APIs console
CLIENT_SECRET = 'SeCr3Tv4lu3'  # Provided in the APIs console
SCOPE = 'https://www.google.com/m8/feeds'
USER_AGENT = 'dummy-sample'

auth_token = gdata.gauth.OAuth2Token(
    client_id=CLIENT_ID, client_secret=CLIENT_SECRET,
    scope=SCOPE, user_agent=USER_AGENT)

然后,使用此令牌授权您的应用程序:

APPLICATION_REDIRECT_URI = 'http://www.example.com/oauth2callback'
authorize_url = auth_token.generate_authorize_url(
    redirect_uri=APPLICATION_REDIRECT_URI)

生成 this 后authorize_url,您(或您的应用程序的用户)将需要访问它并接受 OAuth 2.0 提示。如果这是在 Web 应用程序中,您可以简单地重定向,否则您需要在浏览器中访问该链接。

授权后,将代码换成token:

import atom.http_core

redirect_url = 'http://www.example.com/oauth2callback?code=SOME-RETURNED-VALUE'
url = atom.http_core.ParseUri(redirect_url)
auth_token.get_access_token(url.query)

在您访问浏览器的情况下,您需要将重定向到的 URL 复制到变量redirect_url.

如果您在 Web 应用程序中,您将能够指定路径的处理程序/oauth2callback(例如),并且可以简单地检索查询参数code以交换令牌的代码。例如,如果使用WebOb

redirect_url = atom.http_core.Uri.parse_uri(self.request.uri)

最后用这个令牌授权你的客户:

import gdata.contacts.service

client = gdata.contacts.service.ContactsService(source='appname')
auth_token.authorize(client)

更新(原始答案后 12 个月以上):

或者,您可以使用我在博客文章google-api-python-client中描述的支持。

于 2013-01-04T16:31:50.703 回答
2

最终解决方案相对容易。

步骤 1 获取 oauth2.0 令牌。它在官方文档中有很好的记录: http ://code.google.com/p/google-api-python-client/wiki/OAuth2

第 2 步 现在我们有令牌,但无法发现联系人 API。但是你会发现,在 oauth2.0 Playground 中你可以导入联系人。 https://code.google.com/oauthplayground/

您可以发现,您在凭据中具有访问令牌,在步骤 1 中获得。要访问联系人 api,您必须在参数之后添加到标题'Authorization':'OAuth %s' % access_token

第 3 步 现在您必须将令牌传递给谷歌库令牌,该令牌将与 oauth1.0 令牌兼容。可以通过以下代码完成:

from atom.http import ProxiedHttpClient #Google contacts use this client
class OAuth2Token(object):
    def __init__(self, access_token):
        self.access_token=access_token

    def perform_request(self, *args, **kwargs):
        url = 'http://www.google.com/m8/feeds/contacts/default/full'
        http = ProxiedHttpClient()
        return http.request(
            'GET',
            url,
            headers={
                'Authorization':'OAuth %s' % self.access_token
            }
        )
google = gdata.contacts.service.ContactsService(source='appname')
google.current_token = OAuth2Token(oauth2creds.access_token)
feed = google.GetContactsFeed()
于 2012-04-20T21:35:53.980 回答