0

タイトルが大きく不安定であることは承知しており、申し訳ありません。私が抱えているジレンマは、gspreadが Session を使用し、Python 用の Google API クライアント ライブラリがHTTPLib2 を使用することです。Google API クライアントを操作しているサービス アカウントがあり、認証されたhttplib2.Http()インスタンスを取得してラップし、gspread がそれを Session オブジェクトのように使用できるようにしたいと考えています。

更新: gspreadの更新 103で修正されました。以下の Jay Lee のすばらしい回答に基づいて、Python 2.7 でサービス アカウントを使用して gspread を初期化する方法を次に示します (置き換えて設定Clientする必要があります)。/path/to/service-account.p12sa_id

import gspread
from oauth2client.client import SignedJwtAssertionCredentials
from apiclient.discovery import build
# ...
with open('/path/to/service-account.p12') as f: sa_key = f.read()
credentials = SignedJwtAssertionCredentials(
    sa_id, sa_key, 'https://spreadsheets.google.com/feeds')
http = httplib2.Http()
http = credentials.authorize(http)
build('drive', 'v2', http = http)
access_token = http.request.credentials.access_token
gspread_auth_headers = {'Authorization' : 'Bearer %s' % access_token}
gspread_session = gspread.httpsession.HTTPSession(headers=gspread_auth_headers)
fakeauth = ('notmyusername@gmail.com', 'notmypassword')
client = gspread.Client(fakeauth, http_session=gspread_session)
# https://github.com/burnash/gspread/issues/103
if False == hasattr(client, "session"):
    client = gspread.Client(fakeauth)
    client.session = gspread_session

clientこれで、通常どおり使用できます。うわー!

4

1 に答える 1

1

gspread をざっと見てみると、廃止された古い ClientLogin 認証プロトコルを使用していることがわかります。ただし、httplib2.Http() インスタンスからアクセス トークンを取得し、同じヘッダーを gspread セッションに適用できるはずです (効果的に gspread で OAuth 2.0 も使用できるようになります)。

http = <<<Your existing, authenticated httplib2.Http() object)>>>
access_token = http.request.credentials.access_token
gspread_auth_headers = {'Authorization': 'Bearer %s' % access_token}
gspread_session = gspread.httpsession.HTTPSession(headers=gspread_auth_headers)
my_gspread = gspread.Client(auth=('notmyusername@gmail.com', 'notmypassword'), http_session=gspread_session)

notmyusername@gmail.comgspread.Clientnotmypasswordは auth が渡されるタプルであると想定し、 my_gspread.login() を呼び出さない限り Google に渡されないため、これらは必要なだけです (呼び出しません)。

期限切れの access_tokens に注意してキャッチする必要があります。gspread が無効なトークンに関するエラーをスローした場合は、それをキャッチし、http.request.credentials.refresh() を呼び出して新しいアクセス トークンを取得し、新しいトークンで gspread セッションを再作成する必要があります。

于 2014-01-29T19:00:12.883 に答える