отображение вложенных папок на диске Google с использованием Python API - PullRequest
1 голос
/ 05 марта 2019

Я пытаюсь перечислить все папки (и подпапки) на диске Google.

В моей корневой папке шесть вложенных папок. но мой код показывает только файлы.

def credentials_from_file():
    """Load credentials from a service account file
    Args:
        None
    Returns: service account credential object

    https://developers.google.com/identity/protocols/OAuth2ServiceAccount
    """

    # https://developers.google.com/identity/protocols/googlescopes#drivev3
    SCOPES = [
        'https://www.googleapis.com/auth/drive'
    ]
    SERVICE_ACCOUNT_FILE = './auth_creds.json'

    credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)


    return credentials

credentials = credentials_from_file()
service = discovery.build('drive', 'v3', credentials=credentials)


results = service.files().list(pageSize=10, fields="nextPageToken, files(id, name)").execute()
items = results.get('files', [])

if not items:
    print('No files found.')
else:
    print('Files:')
    for item in items:
        print(u'{0} ({1})'.format(item['name'], item['id']))

Как мне получить информацию о подпапках? Спасибо!

ОБНОВЛЕНИЕ № 1. Это версия OAuth. Он позволяет браузеру создать токен, а затем должен запуститься, но после того, как токен создан, он зависает при выполнении:

from httplib2 import Http
from oauth2client import file, client, tools
from getfilelistpy import getfilelist

SCOPES = 'https://www.googleapis.com/auth/drive.metadata.readonly'

store = file.Storage('token.json')
creds = store.get()
if not creds or creds.invalid:
    flow = client.flow_from_clientsecrets('rrc_crds.json', SCOPES)
    creds = tools.run_flow(flow, store)

resource = {
    "oauth2": creds.authorize(Http()),
    "fields": "files(name,id)",
}
res = getfilelist.GetFileList(resource)  # or r = getfilelist.GetFolderTree(resource)
print(res)

1 Ответ

1 голос
/ 06 марта 2019

Я хотел бы предложить следующую модификацию.

Очки модификации:

  • В вашем сценарии вы используете служебную учетную запись. Из вашего комментария я понял, что вы хотите получить файлы на своем собственном Google Диске. Поэтому я предлагаю использовать OAuth2 для этой ситуации, поскольку учетная запись Drive of Service отличается от того диска, на котором вы входите с помощью своей учетной записи Google.
  • Что касается скрипта, чтобы получить все файлы и папки в определенной папке, я опубликовал для этого библиотеку. Вот и я хотел бы предложить это.
    • Библиотека https://github.com/tanaikech/getfilelistpy. Эта библиотека использует метод списка в Drive API v3.
    • Вы можете установить $ pip install getfilelistpy.

Пример сценария:

Пример сценария с использованием OAuth2 выглядит следующим образом. В этом примере сценария процесс OAuth2 использует быстрый запуск Google . Пожалуйста, проверьте это перед запуском скрипта.

from httplib2 import Http
from oauth2client import file, client, tools
from getfilelistpy import getfilelist

SCOPES = 'https://www.googleapis.com/auth/drive.metadata.readonly'

store = file.Storage('token.json')
creds = store.get()
if not creds or creds.invalid:
    flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
    creds = tools.run_flow(flow, store)

resource = {
    "oauth2": creds.authorize(Http()),
    "id": "### Folder ID ###",
    "fields": "files(name,id)",
}
res = getfilelist.GetFileList(resource)  # or r = getfilelist.GetFolderTree(resource)
print(res)
  • Если вы не используете "id": "### Folder ID ###", будут восстановлены все файлы на собственном Google Диске. Поэтому, когда на диске много файлов, это займет много времени. Поэтому сначала используйте тестовый идентификатор папки, в которой содержится небольшое количество файлов и папок.

Ссылки:

...