Я пытаюсь понять, как использовать API-интерфейс Google Drive вместе с Python для обновления прав доступа к файлам, а также прав собственности

Я взял код из страница API Google Диска для управления общими ресурсами и внес в него некоторые изменения, чтобы иметь возможность передать право собственности на определенный файл, но я продолжаю получать следующую ошибку.

from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

SCOPES = 'https://www.googleapis.com/auth/drive'
creds = None
# The file token.pickle stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.pickle'):
    with open('token.pickle', 'rb') as token:
        creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
    if creds and creds.expired and creds.refresh_token:
        creds.refresh(Request())
    else:
        flow = InstalledAppFlow.from_client_secrets_file(
            'credentials.json', SCOPES)
        creds = flow.run_local_server()
    # Save the credentials for the next run
    with open('token.pickle', 'wb') as token:
        pickle.dump(creds, token)

file_id = 'XXXXXX'
drive_service = build('drive', 'v3', credentials=creds)
def callback(request_id, response, exception):
    if exception:
        # Handle error
        print(exception)
    else:
        print("Permission Id: %s" % response.get('id'))

batch = drive_service.new_batch_http_request(callback=callback)
user_permission = {
    'type': 'user',
    'role': 'writer',
    'emailAddress': '[email protected]'
}
batch.add(drive_service.permissions().create(
        fileId=file_id,
        body=user_permission,
        fields='id',
))
domain_permission = {
    'type': 'domain',
    'role': 'reader',
    'domain': 'example.com'
}
batch.add(drive_service.permissions().create(
        fileId=file_id,
        body=domain_permission,
        fields='id',
))
batch.execute()

Ошибка, которую я получаю, заключается в том, что

<HttpError 403 when requesting https://www.googleapis.com/drive/v3/files/1w43iXVO04QhDl-eWHi75ImSdxu-_V5xp/permissions?fields=id&alt=json returned "Insufficient Permission: Request had insufficient authentication scopes.">
<HttpError 403 when requesting https://www.googleapis.com/drive/v3/files/1w43iXVO04QhDl-eWHi75ImSdxu-_V5xp/permissions?fields=id&alt=json returned "Insufficient Permission: Request had insufficient authentication scopes.">

Но я не уверен, что это проблема с самим кодом или с тем, как я устанавливаю учетные данные для API. есть ли у кого-то опыт работы с API Google Диска для Python и может ли он указать мне, что я делаю неправильно?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
674
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Может быть очевидным, но ваши учетные данные не имеют авторизации.

Убедились ли вы, что загружаете правильные учетные данные и область действия? Вы можете получить ту же ошибку, используя учетные данные быстрого запуска для разных продуктов API.

попробуйте закомментировать это при попытке загрузить правильные учетные данные и область действия.

if os.path.exists('token.pickle'):
    with open('token.pickle', 'rb') as token:
        creds = pickle.load(token)

это были длинные эти строки. в чем проблема, я ранее аутентифицировался с другой областью, а затем, когда я изменил эту область, скрипт использовал token.pickle, который был сгенерирован с предыдущей областью, которая имеет меньше полномочий. Мне пришлось удалить файл token.pickle, и он, наконец, заработал после некоторых других настроек.

modernNeo 22.04.2019 08:35

Изменить области:

SCOPES = ['https://www.googleapis.com/auth/drive.file', 'https://www.googleapis.com/auth/drive',
             'https://www.googleapis.com/auth/drive.appdata']

Удалите сгенерированный файл token.pickle. Затем перезапустите код. Конкретные разрешения можно посмотреть здесь: https://developers.google.com/drive/api/v3/reference/files/create?authuser=3#auth

Не могли бы вы отредактировать свой ответ и немного уточнить, почему это решение проблемы, и в конечном итоге указать на соответствующую документацию? Спасибо!

blami 25.04.2020 11:04

Спасибо за напоминание, адрес документа увеличен.

user8045900 27.04.2020 04:54

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