Как переместить файл с общего диска Google в корзину с помощью учетной записи службы
Я использую учетную запись службы, которая является менеджером контента. У меня нет проблем с загрузкой файлов на общий диск с помощью drive-api из python. С помощью
service.files().list(q="name='file_name'", fields="files(id)").execute()
Я получаю file_id из своего кода. Этот file_id является правильным, исходя из ссылки на файл.
Когда я выполняю следующее утверждение:
response = service.files().update(fileId=file_id, body={'trashed': True}).execute()
Я получаю
404: файл не найден.
Как решить эту проблему? С моей личной учетной записью (также как контент-менеджер) у меня нет проблем с удалением файла.
1 ответ
Требования
Если вы четко понимаете, как выдавать себя за учетную запись, можете перейти к
Solution
шаг.
В первую очередь вам понадобится сервисный аккаунт.
Делегировать полномочия на уровне домена
Убедитесь, что вы правильно вызываете API
Решение
По умолчанию клиент Python Google Drive API V3 не включает файлы общих дисков, поэтому вам необходимо явно передать параметр
supportsAllDrives
и установите для него значение True, и перед этим вы должны перечислить свои файлы, чтобы узнать параметр fileId, используя
includeItemsFromAllDrives
и
supportsAllDrives
. Вот пример, чтобы перечислить все файлы на всех ваших дисках и как удалить файл на общем диске с помощью учетной записи службы:
from googleapiclient.discovery import build
from google.oauth2 import service_account
SCOPES = ['https://www.googleapis.com/auth/drive']
SERVICE_ACCOUNT_FILE = './service_account_key.json'
credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
# Impersonate user@example.com account in my example.com domain
delegated_credentials = credentials.with_subject('user@example.com')
# Use the delegated credentials to impersonate the user
service = build('drive', 'v3', credentials=delegated_credentials)
# List all the files in your Drives (Shared Drives included)
results = service.files().list(fields="nextPageToken, files(id, name, trashed)", includeItemsFromAllDrives=True, supportsAllDrives=True).execute()
items = results.get('files', [])
if not items:
print('No files found.')
else:
print('Files:')
for item in items:
print(u'{0} ({1}) - Trashed? {2}'.format(item['name'], item['id'], item['trashed']))
# Use the filedId in order to trash your shared file
response = service.files().update(fileId=fileId, body={'trashed': True}, supportsAllDrives=True).execute()
print(response)
В противном случае, если вы уже знаете fileId, просто используйте
update
часть.
Справка
Клиент Python Google Drive API V3 > Обновить файл
Google Identity Platform > Выдача себя за пользователя с помощью учетной записи службы