Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Google Drive SDK 2和Python获得OAuth凭据而无需人工交互_Python_Google Drive Api - Fatal编程技术网

如何使用Google Drive SDK 2和Python获得OAuth凭据而无需人工交互

如何使用Google Drive SDK 2和Python获得OAuth凭据而无需人工交互,python,google-drive-api,Python,Google Drive Api,我有一个Python应用程序,它从第三方源获取数据,选择一个子集,并将其写入CSV文件,然后上传到Google Drive并转换为电子表格。我想将其作为cron作业运行,但目前SDK需要一个人与浏览器交互以获取OAuth凭据 我搜索了驱动器SDK文档,没有找到任何帮助。我还尝试使用mechanize库自动化OAuth过程,但没有成功。我肯定我错过了什么。我不敢相信驱动API需要人工交互。建议 我咨询过,这就是我尝试过的 flow = OAuth2WebServerFlow(settings.CL

我有一个Python应用程序,它从第三方源获取数据,选择一个子集,并将其写入CSV文件,然后上传到Google Drive并转换为电子表格。我想将其作为cron作业运行,但目前SDK需要一个人与浏览器交互以获取OAuth凭据

我搜索了驱动器SDK文档,没有找到任何帮助。我还尝试使用mechanize库自动化OAuth过程,但没有成功。我肯定我错过了什么。我不敢相信驱动API需要人工交互。建议

我咨询过,这就是我尝试过的

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(授权url)


但是响应主体是一个没有代码的HTML文档

您是否查看了Google Drive API上的授权部分?()


如果这还不能满足你的需要,那就看看图书馆吧。它使用起来非常简单,应该可以让您非常轻松地获得OAuth凭据。

我之前也有同样的问题

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

我将我的脚本推送到github,在脚本中我将重用凭据来创建新的令牌

免责声明:

我不是一个安全专家,也不知道我可怕的问题解决方案所涉及的风险。。。但它将使您的代码成为Cron可运行的

如果您愿意对您的应用程序进行一次手动访问验收,在给定的范围内,如google quickstart示例(答案底部张贴了有用的部分):

然后,您可以将一次生成的
CLIENT\u SECRET\u文件
drive quickstart.json
文件添加到存储库中。然后,如果你有一个GoogleDrive帐户,你总是想让你的代码库的任何副本都能访问它,那么就不会有第二次凭证检查了

再次声明:

从直觉上看,这种解决方案对安全性来说是可怕的,一旦你的代码库以任何方式公开,那么你的谷歌驱动器就完全有被破坏、删除、禁止等的风险

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()

我读过了,它有这样的例子:
code=self.request.get('code')
但是请求的结构是什么呢?好的,我明白了。那么,您是否已转到,并使用“服务器密钥”设置项目?默认键是一个“浏览器键”,它是供人在键盘上使用的。。。python请求模块仍然可以伪造。但是,如果要在Cron上设置,正确的方法是使用“服务器密钥”。您仍然需要在第一次和凭据过期时以交互方式获取凭据,不是吗?从API文档中的示例可以看出,您应该能够得到一个响应,其中包含上面我的初始示例中提到的代码。只要用户没有撤销授予应用程序的访问权限,我们就不需要人工交互。一旦您运行了这个脚本一次,然后将所有三个文件添加到您的代码库->您的cron,以及在其他机器上使用这个代码库->的cron的任何其他副本应该可以正常运行。
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()