Я пытаюсь использовать Google Drive API v3 с Python 3, чтобы автоматически загружать файлы, делать их «общедоступными» и получать общедоступную ссылку, которую любой, вне зависимости от того, вошел ли он в учетную запись Google, может просматривать и загружать (но не изменять).
Я близко, но не могу понять это! Соблюдайте мой код. Для этого требуется, чтобы текстовый файл с именем «testing.txt» находился в том же каталоге, что и скрипт:
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
from apiclient.http import MediaFileUpload
from apiclient import errors
# https://developers.google.com/drive/api/v2/about-auth#requesting_full_drive_scope_during_app_development
SCOPES = 'https://www.googleapis.com/auth/drive' # https://stackoverflow.com/a/32309750
# https://developers.google.com/drive/api/v2/reference/permissions/update
def update_permission(service, file_id, permission_id, new_role, type):
"""Update a permission's role.
Args:
service: Drive API service instance.
file_id: ID of the file to update permission for.
permission_id: ID of the permission to update.
new_role: The value 'owner', 'writer' or 'reader'.
Returns:
The updated permission if successful, None otherwise.
"""
try:
# First retrieve the permission from the API.
permission = service.permissions().get(fileId=file_id, permissionId=permission_id).execute()
permission['role'] = new_role
permission['type'] = type
return service.permissions().update(fileId=file_id, permissionId=permission_id, body=permission).execute()
except errors.HttpError as error:
print('An error occurred:', error)
return None
if __name__ == '__main__':
# credential things
store = file.Storage('token.json')
creds = store.get()
if not creds or creds.invalid:
flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
creds = tools.run_flow(flow, store)
drive_service = build('drive', 'v3', http=creds.authorize(Http()))
# create and upload file
file_metadata = {'name': 'testing.txt'}
media = MediaFileUpload('testing.txt',
mimetype='text/txt')
file = drive_service.files().create(body=file_metadata,
media_body=media,
fields='id, webViewLink, permissions').execute()
# get information needed to update permissions
file_id = file['id']
permission_id = file['permissions'][0]['id']
print(file_id)
print(permission_id)
# update permissions? It doesn't work!
update_permission(drive_service, file_id, permission_id, 'reader', 'anyone') # https://stackoverflow.com/a/11669565
print(file.get('webViewLink'))
Когда я запускаю этот код, я получаю следующее:
1quyzYHc0uCQIEt88gqd4h_jWtlBaoHHH
01486072639937946874
An error occurred: <HttpError 403 when requesting https://www.googleapis.com/drive/v3/files/1quyzYHc0uCQIEt88gqd4h_jWtlBaoHHH/permissions/01486072639937946874?alt=json returned "The resource body includes fields which are not directly writable.">
https://drive.google.com/file/d/1quyzYHc0uCQIEt88gqd4h_jWtlBaoHHH/view?usp=drivesdk
Когда я копирую и вставляю последнюю ссылку в другой браузер, она недоступна, поэтому очевидно, что не удалось изменить права доступа к файлу. Но я не понимаю, почему это не удалось. Упоминается, что The resource body includes fields which are not directly writable
, но я не знаю, что это значит.
Может кто-нибудь помочь мне понять, что я делаю неправильно и что мне нужно изменить, чтобы это исправить? Спасибо.