[使用Python上载Google云端硬盘文件会导致权限不足错误

问题描述 投票:1回答:2

我曾尝试使用python脚本从本地系统从google驱动器上载文件,但在运行python脚本时面临被禁止的问题。脚本如下:

from googleapiclient.http import MediaFileUpload
from googleapiclient import discovery
import httplib2
import auth

SCOPES = "https://www.googleapis.com/auth/drive"
CLIENT_SECRET_FILE = "client_secret.json"
APPLICATION_NAME = "test"
authInst = auth.auth(SCOPES, CLIENT_SECRET_FILE, APPLICATION_NAME)
credentials = authInst.getCredentials()
http = credentials.authorize(httplib2.Http())
drive_serivce = discovery.build('drive', 'v3', credentials=credentials)
file_metadata = {'name': 'gb1.png'}
media = MediaFileUpload('./gb.png',
                        mimetype='image/png')
file = drive_serivce.files().create(body=file_metadata,
                                    media_body=media,
                                    fields='id').execute()
print('File ID: %s' % file.get('id'))

错误是:-

googleapiclient.errors.HttpError:https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&alt=json&fields=id返回“权限不足:请求不足身份验证范围。“>

我在代码中使用正确的范围还是缺少任何内容?

我还尝试了在google上找到的脚本,它可以正常工作,但问题是它需要令牌静态令牌,该令牌令牌在一段时间后过期。所以我如何使令牌动态化?这是我的代码:-

import json
import requests
headers = {
    "Authorization": "Bearer TOKEN"}
para = {
    "name": "account.csv",
    "parents": ["FOLDER_ID"]
}
files = {
    'data': ('metadata', json.dumps(para), 'application/json; charset=UTF-8'),
    'file': ('mimeType', open("./test.csv", "rb"))
}
r = requests.post(
    "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart",
    headers=headers,
    files=files
)
print(r.text)

任何帮助都会感激。

python google-api google-drive-api google-oauth google-api-python-client
2个回答
0
投票

答案:

删除您的token.pickle文件并重新运行您的应用程序。

更多信息:

只要您具有正确的凭据集,那么更新应用程序范围时所需的全部就是重新获得令牌。删除位于应用程序根文件夹中的令牌文件,然后再次运行该应用程序。如果您具有https://www.googleapis.com/auth/drive范围,并且在开发人员控制台中启用了 Gmail API,则应该不错。

参考:


0
投票

“权限不足:请求的身份验证范围不足。”

意味着您已通过身份验证的用户未授予您的应用程序权限来执行您尝试做的事情。

Files: create方法要求您使用以下范围之一对用户进行身份验证。

files.create

而您的代码似乎确实在使用完整的驱动器范围。我怀疑发生的事情是您已经对用户进行了身份验证,然后更改了代码中的范围,而没有提升用户再次登录并授予同意。您需要从用户的应用中删除他们的同意,方法是让他们直接在其Google帐户中将其删除,或者仅删除您存储在应用中的证书。这将迫使用户再次登录。

Google登录名中也有一个批准提示强制选项,但它不是python开发人员,因此无法完全确定如何强制执行。它应该类似于下面的提示符=“同意”行。

enter image description here

同意画面

如果操作正确,用户应该会看到这样的屏幕

flow = OAuth2WebServerFlow(client_id=CLIENT_ID, client_secret=CLIENT_SECRET, scope='https://spreadsheets.google.com/feeds https://docs.google.com/feeds', redirect_uri='http://example.com/auth_return', prompt='consent')

提示他们授予您对他们的驱动器帐户的完全访问权限

代币泡菜

[如果您在此处关注Google教程enter image description here,则需要删除包含用户存储的同意的token.pickle。

如果os.path.exists('token.pickle'):使用open('token.pickle','rb')作为标记:信誉= pickle.load(令牌)

© www.soinside.com 2019 - 2024. All rights reserved.