Python Google Drive API - Получить идентификатор папки «Мой диск» - PullRequest
0 голосов
/ 15 января 2020

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

Этот код из документов Drive API V3 изменен для поиска для папок, а не для файлов, получит КАЖДУЮ папку, владельцем которой является пользователь, включая папки на командных дисках - несмотря на то, что в документации API для файлов (). в списке сказано, что нет / не будет до 1 июня 2020 года

def GetFolderListFromGoogle(GDrive):
    page_token = None
    while True:
        response = GDrive.files().list(q="mimeType='application/vnd.google-apps.folder' and 'me' in owners and trashed = false",spaces='drive',fields='nextPageToken, files(id, name, mimeType, parents, sharingUser)',pageToken=page_token).execute()
        for file in response.get('files', []):
            # Process change
            print('Found file: %s  with id %s of type %s with parent %s and shared by is %s' % (file.get('name'), file.get('id'),file.get('mimeType'),file.get('parents'), file.get('sharingUser.displayName')))
        page_token = response.get('nextPageToken', None)
        if page_token is None:
            break
    print(response)
    return response

Затем я мог бы выполнить итерацию результатов, чтобы найти папку с именем «Мой диск», однако, откровенно говоря, Слишком много времени уходит слишком долго, чтобы получить список папок (рассматриваемый пользователь создал метрику * 1021). * тонны папок в Team Drives с момента, когда мы перенесли наши общие диски в Google).

Итак, пытаясь обойти эту проблему, я попытался сделать следующее:

def GetMyDriveFolderIDFromGoogle(GDrive):
    page_token = None
    while True:
        response = GDrive.files().list(q="name = 'My Drive'",spaces='drive',fields='nextPageToken, files(id, name, mimeType, parents, sharingUser)',pageToken=page_token).execute()
        for file in response.get('files', []):
            # Process change
            print('Found file: %s  with id %s' % (file.get('name'), file.get('id')))
            parent = file.get('parents')
            if parent:
                while True:
                    folder = GDrive.files().get(fileId=parent[0], fields='id, name, parents').execute()
                    print("ID: "+parent[0]+ " name: "+folder.get('name'))
                    parent = folder.get('parents')
                    if parent is None:
                        break
                    page_token = response.get('nextPageToken', None)
                    if page_token is None:
                        break

        break
    print(response)
    return response

Кроме того, ничего не возвращается. Если я затем go войду в Google Drive моей тестовой учетной записи и создам папку «Root Папка» прямо на root накопителя, а затем произведу поиск по этому запросу в приведенной выше функции:

response = GDrive.files().list(q="mimeType='application/vnd.google-apps.folder' and name = 'Root Folder' and trashed = false",spaces='drive',fields='nextPageToken, files(id, name, mimeType, parents, sharingUser)',pageToken=page_token).execute()

При запросе родителя созданной мною «Root Папки» возвращается следующее:

Found file: Root Folder  with id <ID OF TEST FOLDER HERE> of type application/vnd.google-apps.folder with parent ['<ID OF MY DRIVE FOLDER HERE>'] and shared by is None
ID: <ID OF MY DRIVE FOLDER HERE> name: My Drive

Таким образом, Drive API знает, что папка My Drive существует, она с именем «Мой диск», имеет идентификатор и может получить его, но просто не позволяет получить к нему прямой доступ?

Поскольку папок, которые я могу гарантировать каждому пользователю, нет, есть ли лучший способ получить идентификатор папки My Drive?

1 Ответ

0 голосов
/ 16 января 2020

Возможно, это не самый элегантный способ, но если вы хотите получить идентификатор "My Drive", почему бы вам не создать папку в My Drive, найдите ее родительский id (то есть идентификатор "My Drive" ) а затем удалить эту папку? Например, это:

file_metadata = {
    'name': 'temporary folder',
    'mimeType': 'application/vnd.google-apps.folder'
}
tempFolderId = GDrive.files().create(body=file_metadata, fields='id').execute()["id"] # Create temporary folder
myDriveId = GDrive.files().get(fileId=tempFolderId, fields='parents').execute()["parents"][0] # Get parent ID
GDrive.files().delete(fileId=tempFolderId).execute() # Delete temporary folder
return myDriveId

Я надеюсь, что это поможет.

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