отображение вложенных папок на Google диске с использованием python api

#python #google-drive-api #google-api-python-client

#python #google-drive-api #google-api-python-client

Вопрос:

Я пытаюсь составить список всех папок (и вложенных папок) на 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. Полезна ли эта библиотека в вашей ситуации? github.com/tanaikech/getfilelistpy

2. Спасибо. по-прежнему не отображаются вложенные папки. Хотя я ценю вашу проницательность. хороший список.

3. Спасибо за ответ. Хотя я не уверен, смог ли я правильно понять вашу ситуацию, как насчет этого? В вашем скрипте вы используете учетную запись службы. Если вы хотите получить список папок на своем собственном Google Диске, пожалуйста, используйте OAuth2, поскольку диск учетной записи службы отличается от вашего диска, на который вы входите с помощью учетной записи Google. Если я неправильно понял вашу ситуацию, я приношу извинения.

4. Это сделало это. Я получил папки, которые я ищу. Большое спасибо!

5. не могли бы вы, пожалуйста, изложить все это так, чтобы я мог выставить вам баллы за ответ? Спасибо

Ответ №1:

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

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

  • В вашем скрипте вы используете учетную запись службы. Из вашего комментария я понял, что вы хотите получить файлы с вашего собственного Google Диска. Поэтому я предлагаю использовать OAuth2 для этой ситуации, потому что диск учетной записи службы отличается от вашего диска, на который вы входите с помощью своей учетной записи Google.
  • Что касается скрипта, для извлечения всех файлов и папок из определенной папки я опубликовал библиотеку для этого. Итак, здесь я хотел бы предложить это.
    • Библиотека является https://github.com/tanaikech/getfilelistpy. Эта библиотека использует метод list в 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 Диске. Поэтому, когда на вашем диске много файлов, это займет много времени. Итак, сначала, пожалуйста, используйте конкретный идентификатор папки, в которой содержится небольшое количество файлов и папок, в качестве тестового запуска.

Ссылки: