在Mac OS X中使用Python自动授权Google云端硬盘

时间:2013-11-04 19:06:08

标签: python google-drive-api google-oauth google-api-client google-api-python-client

我为Google云端硬盘编写了Python代码,用于将图像文件上传到我的云端硬盘应用。我有三个问题。这是我的代码:

#!/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云端硬盘?

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

  3. 我读过有关refresh_tokens的内容,但无法找到如何在我的应用中实现此功能以实现授权自动化。
    那么,refresh_tokens用于此吗?如果是,那么我该如何在我的程序中实现它? 如果没有,那么我怎样才能确保一旦我的应用程序被加载,该特定文件就会直接上传到谷歌硬盘上,无需任何授权,或者使用任何自动授权方式,这样就可以完全清除用户交互。

1 个答案:

答案 0 :(得分:2)

  

“此程序会将所有图像上传到我给定的client_id和client_secret。”

不,它会将图像上传到云端硬盘,以获取通过授权流程的帐户。客户端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