Google Drive API, ошибка аутентификации Python Desktop App - PullRequest
0 голосов
/ 09 июля 2019

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

Фоновая и ожидаемая функциональность:

Приложение Python Desktop для Windows, позволяющее пользователям загружать файл в свои учетные записи Google Drive после проверки подлинности.Подозреваю, что это может быть связано с определениями области, но не очень точно, поскольку изменение области с https://www.googleapis.com/auth/drive на что-то менее чувствительное, такое как https://www.googleapis.com/auth/drive.file, все еще показывает ту же ошибку.

Код для этогооснован на официальной документации Drive API и других источниках, перечисленных ниже.

Код ссылки:

https://github.com/samlopezf/google-drive-api-tutorial/blob/master/google-drive-api-tutorial-project/main.py

Справочник по видеоруководству:

https://www.youtube.com/watch?v=9OYYgJUAw-w

a) При выполнении кода для первой аутентификации браузер отображает сообщение об ошибке: Это приложение не проверено.Я попытался обойти эту проблему, перейдя по ссылке «Дополнительно» и вручную установив доступ к конфигурации, приводит к появлению в браузере сообщения «Процесс аутентификации завершен».

b) При повторном запуске приложения вместо загрузки файла на Google Drive результат выполнения такой же, как в шаге а).

Я вижусоздается подпапка с именем «.credentials», но не создается файл .json с необходимым файлом доступа.

auth.py

from __future__ import print_function
import httplib2
import os

from apiclient import discovery
from oauth2client import client
from oauth2client import tools
from oauth2client.file import Storage

try:
    import argparse
    flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
    flags = None


class auth:
    def __init__(self,SCOPES,CLIENT_SECRET_FILE,APPLICATION_NAME):
        self.SCOPES = SCOPES
        self.CLIENT_SECRET_FILE = CLIENT_SECRET_FILE
        self.APPLICATION_NAME = APPLICATION_NAME
    def getCredentials(self):
    """Gets valid user credentials from storage.

    If nothing has been stored, or if the stored credentials are invalid,
    the OAuth2 flow is completed to obtain the new credentials.

    Returns:
        Credentials, the obtained credential.
    """
        cwd_dir = os.getcwd()
        credential_dir = os.path.join(cwd_dir, '.credentials')
        if not os.path.exists(credential_dir):
            os.makedirs(credential_dir)
        credential_path = os.path.join(credential_dir, 'client_secret.json')

        store = Storage(credential_path)
        credentials = store.get()
        if not credentials or credentials.invalid:
            flow = client.flow_from_clientsecrets(self.CLIENT_SECRET_FILE, self.SCOPES)
            flow.user_agent = self.APPLICATION_NAME
            if flags:
                credentials = tools.run_flow(flow, store, flags)
            else: # Needed only for compatibility with Python 2.6
                credentials = tools.run(flow, store)
            print('Storing credentials to ' + credential_path)
        return credentials

main.py

from __future__ import print_function
import httplib2
import os, io

from apiclient import discovery
from oauth2client import client
from oauth2client import tools
from oauth2client.file import Storage
from apiclient.http import MediaFileUpload, MediaIoBaseDownload
try:
    import argparse
    flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
    flags = None
import auth

    # If modifying these scopes, delete your previously saved credentials
    # at ~/.credentials/drive-python-quickstart.json
    SCOPES = 'https://www.googleapis.com/auth/drive'
    # CLIENT_SECRET_FILE = 'client_secret.json'
    THIS_FOLDER = os.path.dirname(os.path.abspath(__file__))
    CLIENT_SECRET_FILE = os.path.join(THIS_FOLDER, 'client_secret.json')
    APPLICATION_NAME = 'Drive API Python Quickstart'
    authInst = auth.auth(SCOPES,CLIENT_SECRET_FILE,APPLICATION_NAME)
    credentials = authInst.getCredentials()

    http = credentials.authorize(httplib2.Http())
    drive_service = discovery.build('drive', 'v3', http=http)

    def uploadFile(filename,filepath,mimetype):
        file_metadata = {'name': filename}
        media = MediaFileUpload(filepath,
                            mimetype=mimetype)
        file = drive_service.files().create(body=file_metadata,
                                        media_body=media,
                                        fields='id').execute()
        print('File ID: %s' % file.get('id'))

Настройка учетных данных и согласия в консоли API и вывод

  1. Учетные данные создаются следующим образом

enter image description here

Введен только экран согласия. Имя приложения, идентификатор электронной почты, определения областей оставлены пустыми.Файл Json загружается и перемещается в рабочий каталог.

Отображение сообщения об ошибке в браузере.

enter image description here

4,5 и 6 - попытка обойти и вручную предоставить доступ, заканчивается сообщением «Процесс аутентификации завершен», но невозможно загрузить файл на диск.

enter image description here

Я прочитал другую документацию по этой теме на SO и других сайтах, но не могу найти причину, по которой аутентификация не работает, на экране согласия отображается статус проверки - Не опубликовано и нет сообщений о том, чтотребуется проверка.Поймите, это длинный пост, спасибо за ваше терпение заранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...