Мне нужна помощь, так как я разбиваю голову о стену.
Мне нужно написать скрипт для периодического запуска лямбды, который будет извлекать значения из некоторых листов на диске Google. Самый простой способ найти их — использовать функцию меток gdrive. Мы включили его, создали ярлык и пометили некоторые файлы.
Затем я могу использовать проводник API для запроса всех файлов с этой меткой, используя этот запрос
'labels/LYBX-my-label-id-bFcb' in labels
Я также могу получить то, что отправил мой браузер, и запустить его локально в почтальоне или узле/что угодно. Он работает и возвращает ожидаемые списки файлов.
Однако при этом используются учетные данные моей личной учетной записи, и, делая это «по-настоящему», нам, конечно, нужно использовать учетную запись службы. Итак, мы создали проект GCP с сервисной учетной записью, и я использую пакет googleapiclient python. Я храню секрет для этой учетной записи службы в aws secretmanager, извлекаю его и настраиваю с его помощью свой экземпляр ресурса drive.
Это все работает. Я могу использовать его для вызова drive.files().get(...) и drive.files().list(...) и получения данных о файлах, используя всевозможные запросы, кроме того, который я использовал выше для метки. Когда я делаю этот запрос, я получаю ошибку 400, которая жалуется на параметр q (запрос).
Теперь я опустился до уровня самого URL-адреса и точного URL-адреса запроса GET, который регистрирует мой скрипт Python, когда я использую свой личный токен носителя. Поэтому я почти уверен, что на самом деле это не проблема с плохими параметрами, а просто случай, когда Google ужасен в дизайне API и возвращает дерьмовые коды ошибок.
Поэтому я думаю, что это должна быть проблема с разрешениями, но я понятия не имею, какие разрешения необходимы, чтобы разрешить учетной записи выполнять поиск по меткам gdrive, и как я могу предоставить эти разрешения служебной учетной записи.
Еще одна возможная подсказка заключается в том, что drive.files().listLabels(fileId = "...") в файле, который, как я знаю, имеет метки, кажется, не работает, поэтому снова все указывает на отсутствие какого-то разрешения, но неясно, какие и как их настроить для учетных записей служб.
Пояснения: является ли учетная запись Google, которую вы использовали для создания проекта GCP с служебной учетной записью, учетной записью домена Google Workspace? Если да, настроили ли вы делегирование домена?
@SputnikDrunk2 да и да. Я также поделился полным диском с учетной записью, исходя из теории, что метки сами по себе являются концепцией корневого диска, а не просто атрибутом файла, но не прогрессом. Все еще возникают те же проблемы

Примечание. Поскольку я не вижу вашего фактического сценария, вы можете рассматривать этот ответ как отправную точку или ссылку для устранения проблемы в вашем проекте. Надеюсь, это решит вашу проблему.
Я провел собственную репликацию и успешно перечислил файлы, используя запрос на основе идентификатора метки с учетной записью службы в процессе олицетворения пользователя. Это следует добавить на этапе создания учетных данных, где вы включаете параметр 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
Я создал тестовую этикетку и пометил ее двумя файлами на своем диске:
После запуска тестового скрипта:
Спасибо! Мне удалось заставить его работать. Дело было в нескольких вещах. Во-первых, наш администратор забыл предоставить делегирование службы с областью действия https://www.googleapis.com/auth/drive.labels. Во-вторых, мы неправильно подключили subject (ваш код помог). Мы использовали функцию with_subject(), но не понимали, что учетные данные неизменны, и это вернуло новый объект учетных данных для использования. Выяснил это как раз вовремя, чтобы получить новости о том, что в продукт внесены некоторые изменения, которые делают весь поиск по меткам ненужным.
Еще несколько подсказок, когда я работаю с chatgpt — он продолжает настаивать на том, что метки недоступны в API, но я знаю, что это неправда. Как я уже сказал выше, я успешно выполнил запрос через API, но не с учетной записью службы. Также. chatgpt продолжает возвращаться к совместному использованию файлов в gdrive, но они являются общими, я могу получить информацию об этих файлах, используя любой другой запрос. На самом деле, если бы они не были переданы, я бы ожидал ответа без файлов, а не 400