Загрузите всю общедоступную папку с Google-Диска с помощью Python или wget / curl без аутентификации

Я хотел бы загрузить всю общедоступную папку с Google-диска из скрипта (python, wget, терминал и т. Д.).
Процедура должна выполняться без аутентификации, так как это общедоступная папка, доступная для всех, у кого есть связь.

Пример ссылки: https://drive.google.com/drive/folders/1Gt-W8jMrADizXYGF5QZwJh_Gc8QpKflX

В случае, если невозможно напрямую загрузить всю папку, тогда будет достаточно просто указать ее содержимое (файлы) без аутентификации, и тогда я смогу загружать каждый файл отдельно. Как получить такую ​​возможность листинга?

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


person Shahar Gino    schedule 12.06.2021    source источник
comment
В вашей ситуации, например, полезен ли этот инструмент CLI? github.com/tanaikech/goodls Но, когда файлы в общей папке, по крайней мере, требуется для использования ключа API, поскольку список файлов необходимо получить из общей папки. Если это не помогло, прошу прощения.   -  person Tanaike    schedule 12.06.2021
comment
Привет, Танаике, это определенно кажется актуальным, и я не знал об этом интерфейсе командной строки. Я попробую, спасибо!   -  person Shahar Gino    schedule 12.06.2021
comment
Спасибо за ответ. Если это не помогло в вашей ситуации, прошу прощения. И, если вы не можете использовать ключ API, например, как насчет создания списка файлов из общей папки вручную или с помощью скрипта Google Apps? Таким образом, вы можете скачивать файлы без ключа API.   -  person Tanaike    schedule 12.06.2021
comment
Отличная идея, спасибо Танаике. Я также нашел этот скрипт Google Apps, вдохновленный вами, спасибо - ›gist.github.com/mesgarpour/ 07317e81e9ee2b3f1699   -  person Shahar Gino    schedule 12.06.2021
comment
Спасибо за ответ. Если ваша проблема была решена, вы можете опубликовать ее в качестве ответа? Таким образом, это будет полезно для других пользователей, у которых есть такая же проблема.   -  person Tanaike    schedule 13.06.2021


Ответы (1)


В итоге я применил следующий код (протестирован, работает хорошо):

import urllib.request
from getfilelistpy import getfilelist
from os import path, makedirs, remove, rename

def download_googledrive_folder(remote_folder, local_dir, gdrive_api_key, debug_en):

    success = True

    if debug_en:
        print('[DEBUG] Downloading: %s --> %s' % (remote_folder, local_dir))
    else:
        try:
            resource = {
                "api_key": gdrive_api_key,
                "id": remote_folder.split('/')[-1].split('?')[0],
                "fields": "files(name,id)",
            }
            res = getfilelist.GetFileList(resource)
            print('Found #%d files' % res['totalNumberOfFiles'])
            destination = local_dir
            if not path.exists(destination):
                makedirs(destination)
            for file_dict in res['fileList'][0]['files']:
                print('Downloading %s' % file_dict['name'])
                if gdrive_api_key:
                    source = "https://www.googleapis.com/drive/v3/files/%s?alt=media&key=%s" % (file_dict['id'], gdrive_api_key)
                else:
                    source = "https://drive.google.com/uc?id=%s&export=download" % file_dict['id']  # only works for small files (<100MB)
                destination_file = path.join(destination, file_dict['name'])
                urllib.request.urlretrieve(source, destination_file)

        except Exception as err:
            print(err)
            success = False

    return success

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

Обратите внимание, что здесь есть 2 варианта: ›с предоставлением или без предоставления ключа API Google (gdrive_api_key) для исходного URL.
По моему опыту, вариант без ключа API хорошо работает для небольшие файлы (‹~ 100 МБ), в то время как вариант с ключом API кажется более надежным и работает для любого размера.

person Shahar Gino    schedule 06.07.2021