【问题标题】:Error 403 when trying to upload file to google drive via python尝试通过 python 将文件上传到谷歌驱动器时出现错误 403
【发布时间】:2015-07-17 15:13:35
【问题描述】:

所以我是 python 新手(这是关于堆栈溢出的第一篇文章)。我正在尝试使用 python 向谷歌驱动器帐户上传和下载文件(并最终在定制的工作 tiki wiki 上引用来自该驱动器的文件)。下面的代码来自谷歌的 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()

【问题讨论】:

    标签: python upload


    【解决方案1】:

    您的 Google 云端硬盘范围是

    范围 = 'https://www.googleapis.com/auth/drive.metadata.readonly'

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

    范围 = 'https://www.googleapis.com/auth/drive'

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

    【讨论】:

      【解决方案2】:
      1. 将此代码另存为 quickstart.py
      2. 使用 sudo 从命令行运行它。 [sudo python quickstart.py]
      3. 使用您的 Windows 密码
      4. quickstart.py 将尝试在您的默认浏览器中打开一个新窗口或选项卡。如果失败,请从控制台复制 URL,然后在浏览器中手动打开它。
      5. 点击接受按钮
      6. 完成

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多