我需要一些帮助,因为我的头撞到墙上了。
我需要编写一个脚本来定期在 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="...")
似乎失败了,因此所有这些都再次表明缺少某种权限,但不清楚哪些权限以及如何在服务帐户上设置这些权限。
注意:由于我看不到您的实际脚本,因此您可以将此答案视为解决项目中问题的起点或参考。希望这能解决您的问题。
我自己进行了复制,并通过用户模拟过程使用基于服务帐户的标签 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
我创建了一个测试标签,并用驱动器中的两个文件对其进行了标记:
运行测试脚本后:
sputnikdrunk2,你能提供完整的代码吗?我在尝试访问标签时遇到了同样的问题,并且文档组织得不好。