4

我有一个 Python 应用程序,它从第三方来源获取数据,选择一个子集,并将其写入一个 CSV 文件,然后将其上传到 Google Drive 并转换为电子表格。我想将此作为 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

然后使用我发出的请求库:
r = req.get(authorize_url)

但响应正文是一个没有代码的 HTML 文档。

4

3 回答 3

1

我之前也有同样的问题。

解决方案:保存凭据以备将来使用。参考以下网址:

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 上的授权部分?(https://developers.google.com/drive/examples/python#authorization

如果这不能满足您的需求,请查看requests库。它使用起来非常简单,应该可以让您轻松获得 OAuth 凭据。

于 2012-12-27T22:08:29.950 回答
0

免责声明:

我不是安全专家,也不知道我可怕的问题解决方案所涉及的风险......但它会让你的代码成为 Cron 可运行的。

如果您愿意在一定范围内对您的应用进行一次手动访问接受,如谷歌快速入门示例(有用部分发布在答案底部):https ://developers.google.com/drive/web /快速入门/蟒蛇

然后,您可以将您生成CLIENT_SECRET_FILE 的文件和文件都添加到您的存储库中。drive-quickstart.json然后,如果您有一些谷歌驱动器帐户,您总是希望您的代码库的任何副本都可以访问它,那么永远不会再检查凭据。

再次免责声明:

直观地说,这个解决方案的安全性很糟糕,一旦你的代码库以任何方式公开,那么你的谷歌驱动器就完全有被破坏、删除、禁止等的风险......

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 回答