有哪些可能的方法可以使用python和oauth2.0导入Google联系人?
我们成功获得了凭据,我们的应用程序请求访问联系人,但是在获得凭据后,我找不到发现联系人 API 的方法。
所以像这样的事情:
from apiclient.discover import build
import httplib2
http = httplib2.Http()
#Authorization
service = build("contacts", "v3", http=http)
给了我们UnknownApiNameOrVersion
例外。看起来联系人 API 不在 apiclient 支持的 API 列表中。
我正在寻找其他方法。
Contacts API 不能与google-api-python-client
库一起使用,因为它是 Google Data API,而 google-api-python-client
旨在与基于发现的 API 一起使用。
与其经历@NikolayFominyh描述的所有麻烦,不如在 gdata-python-client
中使用对 OAuth 2.0 的本机支持。
要获取有效的令牌,请按照 Google 开发者博客文章中的说明进行操作,深入了解该过程。
首先,创建一个令牌对象:
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)
生成此authorize_url
后,您(或应用程序的用户)将需要访问它并接受 OAuth 2.0 提示。如果这是在 Web 应用程序中,您可以简单地重定向,否则您需要在浏览器中访问该链接。
授权后,将代码交换为令牌:
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
支持。
最终的解决方案相对容易。
步骤 1获取 oauth2.0 令牌。这在官方文档中有很好的记录:http://code.google.com/p/google-api-python-client/wiki/OAuth2
步骤 2现在我们有令牌,但无法发现联系人API。但是您可以发现,在oauth2.0游乐场中,您可以导入联系人。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()