4

サードパーティのソースからデータを取得し、サブセットを選択して CSV ファイルに書き込み、それを Google ドライブにアップロードしてスプレッドシートに変換する Python アプリケーションがあります。これを cron ジョブとして実行したいのですが、現在、SDK ではブラウザと対話して OAuth 資格情報を取得するために人間が必要です。

Drive SDK のドキュメントを検索しましたが、役立つ情報が見つかりませんでした。また、mechanize ライブラリを使用して OAuth プロセスを自動化しようとしても失敗しました。私は何かが欠けていると確信しています。Drive API が人間の介入を必要とするなんて信じられません。提案?

https://developers.google.com/accounts/docs/OAuth2WebServer#overviewを参照しましたが、これが私が試したものです。

flow = OAuth2WebServerFlow(settings.CLIENT_ID, settings.CLIENT_SECRET
                           setings.OAUTH_SCOPE,settings.REDIRECT_URI)
authorize_url = flow.step1_get_authorize_url()

リクエスト URL を作成します。

https://accounts.google.com/o/oauth2/auth?
scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&
redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&
response_type=code&
client_id=999637210521.apps.googleusercontent.com&
access_type=offline

次に、発行する requests ライブラリを使用します。
r = req.get(authorize_url)

ただし、応答本文はコードのない HTML ドキュメントです。

4

3 に答える 3

1

私も以前に同じ問題を抱えています。

解決策: 今後使用するために資格情報を保存します。以下の URL を参照してください。

https://developers.google.com/accounts/docs/OAuth2#installed

https://developers.google.com/accounts/docs/OAuth2InstalledApp

from oauth2client.file import Storage
...
storage = Storage('a_credentials_file')
storage.put(credentials)
...
credentials = storage.get()

新しいトークンを作成するための資格情報を再利用しているスクリプトを github にプッシュしました。

https://github.com/sukujgrg/google_drive

于 2012-12-29T14:44:46.223 に答える
0

Google Drive API の Authorization セクションを見ましたか? ( https://developers.google.com/drive/examples/python#authorization )

それでも必要なものが得られない場合は、リクエストライブラリをのぞいてみてください。使い方は非常に簡単で、OAuth クレデンシャルを簡単に取得できるはずです。

于 2012-12-27T22:08:29.950 に答える
0

免責事項:

私はセキュリティの専門家ではなく、問題に対する私の恐ろしい解決策に伴うリスクを知りません...しかし、コードを Cron 実行可能にすることができます。

Googleクイックスタートの例のように、特定の範囲で、アプリへの手動アクセス受け入れを1回行う場合(回答の下部に投稿された有用な部分):https://developers.google.com/drive/web /クイックスタート/python

次に、一度生成しCLIENT_SECRET_FILE たファイルとファイルの両方をリポジトリに追加できます。drive-quickstart.json次に、コードベースのコピーに常にアクセスできるようにしたいGoogleドライブアカウントがある場合、資格情報の2回目のチェックはありません。

免責事項:

直観的に、このソリューションはセキュリティにとって恐ろしいものであり、コードベースが何らかの方法で公開された瞬間に、Google ドライブは完全に破壊、削除、禁止などの危険にさらされます...

import httplib2
import os

from apiclient import discovery
import oauth2client
from oauth2client import client
from oauth2client import tools

def get_credentials():

    try:
        import argparse
        flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
    except ImportError:
        flags = None

    SCOPES = 'https://www.googleapis.com/auth/drive'
    #ASSUME THAT THE CLIENT SECRETE FILE BELOW IS STORED IN YOUR CODE BASE
    CLIENT_SECRET_FILE = 'client_secret.json'
    APPLICATION_NAME = 'Drive API Quickstart'

    #ASSUME THAT THIS FILE BELOW IS STORED INSIDE YOUR CODE BASE
    credential_dir = os.path.realpath('')
    credential_path = os.path.join(credential_dir,
                                   'drive-quickstart.json')

    store = oauth2client.file.Storage(credential_path)
    credentials = store.get()
    if not credentials or credentials.invalid:
        flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
        flow.user_agent = APPLICATION_NAME
        if flags:
            credentials = tools.run_flow(flow, store, flags)
        else: # Needed only for compatability with Python 2.6
            credentials = tools.run(flow, store)
        print('Storing credentials to ' + credential_path)
    return credentials

def oneTimeRunCredentials():
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('drive', 'v2', http=http)
    results = service.files().list(maxResults=10).execute()
于 2015-09-24T06:11:19.013 に答える