Как переместить файл с общего диска 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 шаг.

Решение

По умолчанию клиент 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 > Выдача себя за пользователя с помощью учетной записи службы

Другие вопросы по тегам