尝试通过python将文件上传到谷歌驱动器时出现错误403

时间:2015-07-17 15:13:35

标签: python upload

所以我是python的新手(这是堆栈溢出的第一篇文章)。我正在尝试使用python从google驱动器帐户上传和下载文件(最终在定制的工作tiki wiki上引用此驱动器中的文件)。下面的代码来自google的python api资源。它将成功列出我的驱动器上的文件(应该如此)。但是,当我尝试上传文件时(请参见下面的第10行),我收到以下错误:

An error occured: <HttpError 403 "Insufficient Permission">

我一直在寻找几个小时,我无法弄清楚如何解决这个问题。我想我需要请求某种令牌。不太确定。再说一遍,我是新手。任何帮助将不胜感激!

import httplib2
import os

from apiclient import discovery
import oauth2client
from oauth2client import client
from oauth2client import tools

try:
    import argparse
    flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
    flags = None

SCOPES = 'https://www.googleapis.com/auth/drive.metadata.readonly'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Drive API Quickstart'


def get_credentials():
    """Gets valid user credentials from storage.

    If nothing has been stored, or if the stored credentials are invalid,
    the OAuth2 flow is completed to obtain the new credentials.

    Returns:
        Credentials, the obtained credential.
    """
    home_dir = os.path.expanduser('~')
    credential_dir = os.path.join(home_dir, '.credentials')
    if not os.path.exists(credential_dir):
        os.makedirs(credential_dir)
    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

from apiclient import errors
from apiclient.http import MediaFileUpload
# ...

def insert_file(service, title, description, parent_id, mime_type, filename):
  """Insert new file.

  Args:
    service: Drive API service instance.
    title: Title of the file to insert, including the extension.
    description: Description of the file to insert.
    parent_id: Parent folder's ID.
    mime_type: MIME type of the file to insert.
    filename: Filename of the file to insert.
  Returns:
    Inserted file metadata if successful, None otherwise.
  """
  media_body = MediaFileUpload(filename, mimetype=mime_type, resumable=True)
  body = {
    'title': title,
    'description': description,
    'mimeType': mime_type
  }
  # Set the parent folder.
  if parent_id:
    body['parents'] = [{'id': parent_id}]

  try:
    file = service.files().insert(
        body=body,
        media_body=media_body).execute()

    # Uncomment the following line to print the File ID
    # print 'File ID: %s' % file['id']

    return file
  except errors.HttpError, error:
    print 'An error occured: %s' % error
    return None

def main():
    """Shows basic usage of the Google Drive API.

    Creates a Google Drive API service object and outputs the names and IDs
    for up to 10 files.
    """
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('drive', 'v2', http=http)

    insert_file(service, 'picture.jpg', 'no_description', False, 'image/jpeg', '/Users/ethankay/Documents/Work/Current_Work/Astrophysics/Code/Logger_Program/Master/TestUploadFiles/test3.jpg')

    results = service.files().list(maxResults=10).execute()
    items = results.get('items', [])
    if not items:
        print 'No files found.'
    else:
        print 'Files:'
        for item in items:
            print '{0} ({1})'.format(item['title'], item['id'])




if __name__ == '__main__':
    main()

2 个答案:

答案 0 :(得分:1)

您的Google云端硬盘范围

SCOPES =&#39; https://www.googleapis.com/auth/drive.metadata.readonly&#39;

没有上传文件的权限。您需要将其更改为

SCOPES =&#39; https://www.googleapis.com/auth/drive&#39;

能够管理文件。尝试使用您的Google API项目重新进行身份验证。

答案 1 :(得分:0)

  1. 将此代码另存为quickstart.py
  2. 使用sudo从命令行运行它。 [sudo python quickstart.py]
  3. 使用Windows密码
  4. quickstart.py将尝试在默认浏览器中打开新窗口或标签。如果失败,请从控制台复制URL并在浏览器中手动打开它。
  5. 点击“接受”按钮
  6. DONE