按标签查询 Google Drive 文件失败

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

我需要一些帮助,因为我的头撞到墙上了。

我需要编写一个脚本来定期在 lambda 上运行,该脚本将从谷歌驱动器中的某些工作表中提取值。找到这些的最直接的方法是使用 gdrive 标签功能。我们已启用它、创建标签并标记一些文件。

然后我可以使用 api explorer 使用此查询来查询具有该标签的所有文件

'labels/LYBX-my-label-id-bFcb' in labels

我还可以获取浏览器发送的内容并在邮递员或节点/其他设备中本地运行它。它可以工作并返回预期的文件列表。

但是这是使用我的个人帐户凭据,当“真正”执行此操作时,我们当然需要使用服务帐户。因此,我们使用服务帐户创建了一个 GCP 项目,我使用的是

googleapiclient
python 包。我将该服务帐户的密钥存储在 aws Secretmanager 中,获取它,并使用它配置我的
drive
资源实例。

这一切都有效。我可以用它来调用

drive.files().get(...)
drive.files().list(...)
并使用各种查询来获取文件数据 除了我上面用于标签的查询。当我执行该查询时,我收到一个 400 错误,抱怨
q
(查询)参数。

现在我已经下降到 url 本身的级别,并且当我使用我的个人不记名令牌时,我的 python 脚本记录的 exact GET 请求 url 可以工作。因此,我非常确定这实际上并不是一个糟糕的参数问题,而只是 google 在 api 设计方面做得很糟糕并返回蹩脚的错误代码。

所以我认为这是一个权限问题,但我不知道需要什么权限才能允许帐户通过gdrive标签进行搜索,也不知道如何向服务帐户授予这些权限。

另一个可能的线索是,我

知道
有标签的文件上的drive.files().listLabels(fileId="...")似乎失败了,因此所有这些都再次表明缺少某种权限,但不清楚哪些权限以及如何在服务帐户上设置这些权限。

google-cloud-platform google-drive-api
2个回答
1
投票

建议

注意:由于我看不到您的实际脚本,因此您可以将此答案视为解决项目中问题的起点或参考。希望这能解决您的问题。

我自己进行了复制,并通过用户模拟过程使用基于服务帐户的标签 ID 的查询成功列出了文件。这应该在凭证创建阶段添加,其中包含一个

subject
参数,使服务帐户能够模拟用户 (例如超级管理员帐户或任何具有必要角色的域帐户) 进行服务帐户委派。

测试脚本

from google.oauth2 import service_account
from googleapiclient.discovery import build

# Path to the service account JSON key file
KEY_FILE = 'sa.json'

# Create credentials from the service account key file & Build the service object
credentials = service_account.Credentials.from_service_account_file(
    KEY_FILE, scopes=['https://www.googleapis.com/auth/drive',
                      'https://www.googleapis.com/auth/drive.file',
                      'https://www.googleapis.com/auth/drive.metadata',
                      'https://www.googleapis.com/auth/drive.metadata.readonly',
                      'https://www.googleapis.com/auth/drive.readonly'],
                      subject="irv@■■■■■■■■■■■■■■.■■■■");

service = build('drive', 'v3', credentials=credentials);

# List files under a label
label_id = "OTVglmjg5BxgxSevMiuLtr6VoaeDwyg66AIRNNEbbFcb";
results = service.files().list(q= f"'labels/{label_id}' in labels").execute()

results

演示

我创建了一个测试标签,并用驱动器中的两个文件对其进行了标记:

运行测试脚本后:

参考


0
投票

sputnikdrunk2,你能提供完整的代码吗?我在尝试访问标签时遇到了同样的问题,并且文档组织得不好。

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