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