8

Pythonとoauth2.0を使用してGoogleの連絡先をインポートする方法は何ですか?

資格情報を正常に取得し、アプリケーションが連絡先へのアクセスを要求しましたが、資格情報を取得した後、連絡先 API を検出する方法が見つかりません。

次のようなもの:

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

UnknownApiNameOrVersion例外があります。Contacts API は、apiclient でサポートされている API のリストにないようです。

別の方法を探しています。

4

2 に答える 2

21

GoogleコンタクトAPIGoogleデータAPIgoogle-api-python-clientあるため、ライブラリでは使用できませんが、検出ベースのAPIで使用することを目的としています。google-api-python-client

@NikolayFominyhで説明されているすべての問題を経験するのではなく、でOAuth2.0のネイティブサポートを使用できます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)

これを生成した後authorize_url、あなた(またはアプリケーションのユーザー)はそれにアクセスしてOAuth2.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で説明しているように、サポートを使用することもできます。

于 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 プレイグラウンドでは連絡先をインポートできることがわかります。 https://code.google.com/oauthplayground/

ステップ 1 で取得したクレデンシャルにアクセス トークンがあることがわかります。連絡先 API にアクセスするには、param の後にヘッダーに追加する必要があります。'Authorization':'OAuth %s' % access_token

ステップ 3 ここで、oauth1.0 トークンと互換性のある Google ライブラリ トークンに渡す必要があります。次のコードで実行できます。

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 に答える