3

我已经为Google云端硬盘写入了Python代码,它将图像文件上传到我的驱动器应用程序。我有三个疑问。这里是我的代码:在Mac OS X中使用Python对Google云端硬盘进行自动授权

#!/usr/bin/python 

import httplib2 
import pprint 

from apiclient.discovery import build 
from apiclient.http import MediaFileUpload 
from oauth2client.client import OAuth2WebServerFlow 
from apiclient import errors 
import sys 


CLIENT_ID = 'CLIENT_ID' 
CLIENT_SECRET = 'CLIENT_SECRET' 

OAUTH_SCOPE = ['https://www.googleapis.com/auth/drive.readonly', 'https://www.googleapis.com/auth/drive.file'] 

REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob' 

FILENAME = "filepath/filename.png" 

flow = OAuth2WebServerFlow(CLIENT_ID, CLIENT_SECRET, OAUTH_SCOPE, REDIRECT_URI) 
flow.params['access_type'] = 'offline' 
flow.params['approval_prompt'] = 'force' 
authorize_url = flow.step1_get_authorize_url() 
print 'Go to the following link in your browser: ' + authorize_url 
code = raw_input('Enter verification code: ').strip() 

credentials = flow.step2_exchange(code) 

http = httplib2.Http() 
http = credentials.authorize(http) 

drive_service = build('drive', 'v2', http=http) 

media_body = MediaFileUpload(FILENAME, mimetype='image/png', resumable=True) 
body = { 
    'title': 'Screen Shot 2013-11-03 at 3.54.08 AM', 
    'description': 'A test screenshot', 
    'mimeType': 'image/png' 
} 

file = drive_service.files().insert(body=body, media_body=media_body).execute() 

new_permission = { 
     'type': 'anyone', 
     'role': 'reader' 
} 

try: 
    drive_service.permissions().insert(
     fileId=file['id'], body=new_permission).execute() 
except errors.HttpError, error: 
    print 'An error occurred: %s' % error 

pprint.pprint(file) 

我的查询:

  1. 这一计划将所有的图像上传到我给出的CLIENT_ID和client_secret。
    如何让用户使用我的应用并将他们的图片上传到他们自己的Google Drive?

  2. 我想自动执行此任务。每当我在终端上运行这个应用程序时,它总是要求我提供我不想要的授权码。这可以绕过吗?

  3. 我阅读了关于refresh_tokens的信息,但无法找到如何在我的应用程序中实现此功能以自动执行授权。
    那么,refresh_tokens用于那个?如果是,那么我如何在我的程序中实现它?
    如果没有,那么我怎样才能确保一旦我的应用程序被加载,该特定的文件直接上传到谷歌驱动器,没有任何授权,或以任何自动授权的方式,以便用户交互完全被卡住。

回答

2

“这项计划将所有的图像上传到我给出的CLIENT_ID和client_secret。”

不,它会将图片上传到Drive以获得通过授权流程的帐户。您的程序的客户端ID和客户端秘密身份,他们不识别特定的用户。

“我要自动执行此任务。每当我运行终端这个应用程序,它总是问我的授权码,我不想要的。这能绕过?”

存储在存储凭据:

https://developers.google.com/api-client-library/python/guide/aaa_oauth#storage

的oauth2client库会为你刷新令牌,你缺的是存储器中存储的凭据片。用户仍然需要首次运行授权过程,但在此之后,它应该仅在没有任何交互的情况下运行。看看tools.run_flow()来处理这个最适合你:

http://google-api-python-client.googlecode.com/hg/docs/epy/oauth2client.tools-module.html#run_flow

请参阅如何使用此方法的样本:

https://code.google.com/p/google-api-python-client/source/browse/samples/plus/plus.py#32

+1

嘿乔, 谢谢回复! 它对我很好.... 不幸的是,我无法表决你的答案,由于缺乏声誉... 再次感谢.. :) – user2927391

+1

嘿乔,有没有什么办法,我们可以删除复制粘贴授权码的用户干预? 我们可以通过编程实现吗?正如在用户登录他/她的帐户并接受并允许我们的应用程序访问并连接他的帐户之后,下一个,即生成的授权码被以编程方式读取。可能吗? – user2927391

+0

是的,run_flow()代码将启动本地Web服务器并接受其中的代码重定向,不应该有任何剪切 - 粘贴。如果代码无法在端口8080或8090上启动Web服务器,则该代码将回退到剪切-n粘贴。 –

相关问题