Wget/ Curl большой файл с Google Drive

Я пытаюсь загрузить файл с Google Drive в сценарии, и у меня возникли небольшие проблемы с этим. Файлы, которые я пытаюсь загрузить, находятся здесь.

Я много смотрел в Интернете, и мне, наконец, удалось загрузить одну из них. Я получил UID файлов, и меньший (1,6 МБ) загружается нормально, однако файл большего размера (3,7 ГБ) всегда перенаправляет на страницу, которая спрашивает меня, хочу ли я продолжить загрузку без проверки на вирусы. Может ли кто-нибудь помочь мне пройти этот экран?

Вот как у меня работает первый файл -

curl -L "https://docs.google.com/uc?export=download&id=0Bz-w5tutuZIYeDU0VDRFWG9IVUE" > phlat-1.0.tar.gz

Когда я запускаю то же самое в другом файле,

curl -L "https://docs.google.com/uc?export=download&id=0Bz-w5tutuZIYY3h5YlMzTjhnbGM" > index4phlat.tar.gz

Я получаю следующий вывод -

Я заметил на третьей до последней строки в ссылке, там &confirm=JwkK которая является случайной 4-х символьной строкой, но предполагает, что есть способ добавить подтверждение в мой URL. Одна из ссылок, которые я посетил, предложила &confirm=no_antivirus но это не работает

Я надеюсь, что кто-то здесь может помочь с этим!

Заранее спасибо.

47 ответов

Решение

Посмотрите на этот вопрос: прямая загрузка с Google Drive с помощью Google Drive API

По сути, вы должны создать публичный каталог и обращаться к своим файлам по относительной ссылке с чем-то вроде

wget https://googledrive.com/host/LARGEPUBLICFOLDERID/index4phlat.tar.gz

ВНИМАНИЕ: эта функциональность устарела. Смотрите предупреждение ниже в комментариях.

Кроме того, вы можете использовать этот скрипт: https://github.com/circulosmeos/gdown.pl

Июнь 2018 года Самый простой способ, который работает для меня

file_id должен выглядеть примерно так: 0Bz8a_Dbh9QhbNU3SGlFaDg

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

Я написал фрагмент Python, который загружает файл с Google Диска, предоставляя ссылку для совместного использования. Работает с августа 2017 года.

Отрезанный не использует ни gdrive, ни Google Drive API. Он использует модуль запросов.

При загрузке больших файлов с Google Диска одного запроса GET недостаточно. Необходим второй, и у него есть дополнительный параметр URL, называемый подтверждающим, значение которого должно равняться значению определенного cookie.

import requests

def download_file_from_google_drive(id, destination):
    def get_confirm_token(response):
        for key, value in response.cookies.items():
            if key.startswith('download_warning'):
                return value

        return None

    def save_response_content(response, destination):
        CHUNK_SIZE = 32768

        with open(destination, "wb") as f:
            for chunk in response.iter_content(CHUNK_SIZE):
                if chunk: # filter out keep-alive new chunks
                    f.write(chunk)

    URL = "https://docs.google.com/uc?export=download"

    session = requests.Session()

    response = session.get(URL, params = { 'id' : id }, stream = True)
    token = get_confirm_token(response)

    if token:
        params = { 'id' : id, 'confirm' : token }
        response = session.get(URL, params = params, stream = True)

    save_response_content(response, destination)    


if __name__ == "__main__":
    import sys
    if len(sys.argv) is not 3:
        print("Usage: python google_drive.py drive_file_id destination_file_path")
    else:
        # TAKE ID FROM SHAREABLE LINK
        file_id = sys.argv[1]
        # DESTINATION FILE ON YOUR DISK
        destination = sys.argv[2]
        download_file_from_google_drive(file_id, destination)

Сен 2020

  • Сначала извлеките идентификатор вашего файла желаний с диска Google:

    1. В браузере перейдите на drive.google.com.

    2. Щелкните файл правой кнопкой мыши и выберите "Получить ссылку для общего доступа".

    3. Затем извлеките идентификатор файла из URL-адреса:

  • Далее устанавливаем gdown Модуль PyPI с использованием pip:

    pip install gdown

  • Наконец, загрузите файл, используя gdown и предполагаемый идентификатор:

    gdown --id <put-the-ID>


[ПРИМЕЧАНИЕ]:

  • В google-colab вы должны использовать ! до bashкоманды.
    (т.е. !gdown --id 1-1wAx7b-USG0eQwIBVwVDUl3K1_1ReCt)

Вы можете использовать инструмент командной строки Linux / Unix с открытым исходным кодом gdrive,

Чтобы установить его:

  1. Загрузите бинарный файл. Выберите тот, который подходит вашей архитектуре, например gdrive-linux-x64,

  2. Скопируйте его на свой путь.

    sudo cp gdrive-linux-x64 /usr/local/bin/gdrive;
    sudo chmod a+x /usr/local/bin/gdrive;
    

Чтобы использовать это:

  1. Определите идентификатор файла Google Диска. Для этого щелкните правой кнопкой мыши нужный файл на веб-сайте Google Диска и выберите "Получить ссылку…". Это вернет что-то вроде https://drive.google.com/open?id=0B7_OwkDsUIgFWXA1B2FPQfV5S8H, Получить строку за ?id= и скопируйте его в буфер обмена. Это идентификатор файла.

  2. Загрузите файл. Конечно, вместо этого используйте идентификатор вашего файла в следующей команде.

    gdrive download 0B7_OwkDsUIgFWXA1B2FPQfV5S8H
    

При первом использовании инструменту необходимо получить разрешения на доступ к API Google Диска. Для этого он покажет вам ссылку, которую вы должны посетить в браузере, а затем вы получите проверочный код для копирования и вставки обратно в инструмент. Загрузка начнется автоматически. Нет индикатора прогресса, но вы можете наблюдать за прогрессом в файловом менеджере или втором терминале.

Источник: комментарий Тоби к другому ответу здесь.

Дополнительный трюк: ограничение скорости. Скачать с gdrive с ограниченной максимальной скоростью (чтобы не перегружать сеть…), вы можете использовать такую ​​команду (используя PipeViewer):

gdrive download --stdout 0B7_OwkDsUIgFWXA1B2FPQfV5S8H | \
  pv -br -L 90k | \
  cat > file.ext

Это покажет количество загруженных данных (-b) и скорость загрузки (-r) и ограничить эту скорость до 90 КБ / с (-L 90k).

Вот быстрый способ сделать это.

Убедитесь, что ссылка является общей, и она будет выглядеть примерно так:

https://drive.google.com/open?id=FILEID&authuser=0

Затем скопируйте этот FILEID и используйте его следующим образом

wget --no-check-certificate 'https://docs.google.com/uc?export=download&id=FILEID' -O FILENAME

Простой способ:

(если вам это нужно для разовой загрузки)

  1. Перейдите на веб-страницу Google Drive, на которой есть ссылка для скачивания.
  2. Откройте консоль браузера и перейдите на вкладку "сеть"
  3. Нажмите на ссылку для скачивания
  4. Дождитесь начала загрузки файла и найдите соответствующий запрос (должен быть последним в списке), затем вы можете отменить загрузку
  5. Щелкните правой кнопкой мыши запрос и выберите "Копировать как cURL" (или аналогичный)

Вы должны получить что-то вроде:

curl 'https://doc-0s-80-docs.googleusercontent.com/docs/securesc/aa51s66fhf9273i....................blah blah blah...............gEIqZ3KAQ==' --compressed

Вставьте это в свою консоль, добавьте > my-file-name.extension до конца (иначе он запишет файл в вашу консоль), затем нажмите enter:)

Дополнение от марта 2018.

Я пробовал различные методы, приведенные в других ответах, чтобы загрузить мой файл (6 ГБ) непосредственно с диска Google в мой экземпляр AWS ec2, но ни один из них не работает (возможно, потому, что он старый).

Итак, для информации других, вот как я сделал это успешно:

  1. Щелкните правой кнопкой мыши по файлу, который вы хотите загрузить, щелкните "Поделиться", в разделе "Обмен ссылками" выберите "любой пользователь, имеющий эту ссылку, может редактировать".
  2. Скопируйте ссылку. Он должен быть в следующем формате: https://drive.google.com/file/d/FILEIDENTIFIER/view?usp=sharing
  3. Скопируйте часть FILEIDENTIFIER из ссылки (это похоже на некоторые случайные символы).
  4. Скопируйте приведенный ниже скрипт в файл. Он использует curl и обрабатывает cookie для автоматизации загрузки файла.

    #!/bin/bash fileid="FILEIDENTIFIER" filename="FILENAME" curl -c ./cookie -s -L "https://drive.google.com/uc?export=download&id=${fileid}" > /dev/null curl -Lb ./cookie "https://drive.google.com/uc?export=download&confirm=`awk '/download/ {print $NF}' ./cookie`&id=${fileid}" -o ${filename}

  5. Как показано выше, вставьте ФАЙЛИДЕНТИФИКАТОР в скрипт. Не забудьте сохранить двойные кавычки.

  6. Дайте имя вашему выходному файлу вместо FILENAME. Не забудьте сохранить двойные кавычки, а также включить расширение в FILENAME (например, "myfile.zip").
  7. Теперь сохраните файл и сделайте его исполняемым, выполнив эту команду в терминале "sudo chmod +x download-script.sh". Замените "download-script.sh" именем вашего скрипта.
  8. Запустите скрипт, используя "./download-script.sh". Снова замените "download-script.sh" именем вашего скрипта.

PS: Вот суть Github для приведенного выше сценария: https://gist.github.com/amit-chahar/db49ce64f46367325293e4cce13d2424

ggID='put_googleID_here'  
ggURL='https://drive.google.com/uc?export=download'  
filename="$(curl -sc /tmp/gcokie "${ggURL}&id=${ggID}" | grep -o '="uc-name.*</span>' | sed 's/.*">//;s/<.a> .*//')"  
getcode="$(awk '/_warning_/ {print $NF}' /tmp/gcokie)"  
curl -Lb /tmp/gcokie "${ggURL}&confirm=${getcode}&id=${ggID}" -o "${filename}"  

Как это работает?
Получить файл cookie и HTML-код с помощью curl.
Передайте html в grep и sed и найдите имя файла.
Получить код подтверждения из файла cookie с помощью awk.
Наконец загрузите файл с включенным файлом cookie, подтвердите код и имя файла.

curl -Lb /tmp/gcokie "https://drive.google.com/uc?export=download&confirm=Uq6r&id=0B5IRsLTwEO6CVXFURmpQZ1Jxc0U" -o "SomeBigFile.zip"

Если вам не нужна переменная имени файла, curl может угадать это
-L Следить за редиректом
-O Remote-имя
-J Remote-header-name

curl -sc /tmp/gcokie "${ggURL}&id=${ggID}" >/dev/null  
getcode="$(awk '/_warning_/ {print $NF}' /tmp/gcokie)"  
curl -LOJb /tmp/gcokie "${ggURL}&confirm=${getcode}&id=${ggID}" 

Чтобы извлечь идентификатор файла Google из URL, вы можете использовать:

echo "gURL" | egrep -o '(\w|-){26,}'  
# match more than 26 word characters  

ИЛИ ЖЕ

echo "gURL" | sed 's/[^A-Za-z0-9_-]/\n/g' | sed -rn '/.{26}/p'  
# replace non-word characters with new line,   
# print only line with more than 26 word characters 

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

На данный момент единственный обходной путь, который я нашел, - это поделиться файлом с Интернетом и создать веб-ресурс.

Цитата со страницы справки Google Drive:

С помощью Drive вы можете сделать веб-ресурсы - такие как файлы HTML, CSS и Javascript - видимыми как веб-сайт.

Чтобы разместить веб-страницу с помощью Drive:

  1. Откройте диск на drive.google.com и выберите файл.
  2. Нажмите кнопку " Поделиться" в верхней части страницы.
  3. Нажмите " Дополнительно" в правом нижнем углу окна обмена.
  4. Нажмите Изменить....
  5. Выберите On - Public в Интернете и нажмите Save.
  6. Перед закрытием поля для обмена скопируйте идентификатор документа с URL-адреса в поле ниже "Ссылка для обмена". Идентификатор документа представляет собой строку прописных и строчных букв и цифр между косыми чертами в URL.
  7. Поделитесь URL-адресом, который выглядит как "www.googledrive.com/host/[doc id], где [doc id] заменяется идентификатором документа, который вы скопировали на шаге 6.
    Любой может теперь просматривать вашу веб-страницу.

Найдено здесь: https://support.google.com/drive/answer/2881970?hl=en

Так, например, когда вы публикуете файл на диске Google публично, sharelink выглядит так:

https://drive.google.com/file/d/0B5IRsLTwEO6CVXFURmpQZ1Jxc0U/view?usp=sharing

Затем вы копируете идентификатор файла и создаете линк googledrive.com, который выглядит следующим образом:

https://www.googledrive.com/host/0B5IRsLTwEO6CVXFURmpQZ1Jxc0U

На основании ответа от Рошана Сетия

Май 2018

Использование WGET:

  1. Создайте скрипт оболочки с именем wgetgdrive.sh, как показано ниже:

    #!/bin/bash
    
    # Get files from Google Drive
    
    # $1 = file ID
    # $2 = file name
    
    URL="https://docs.google.com/uc?export=download&id=$1"
    
    wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate $URL -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=$1" -O $2 && rm -rf /tmp/cookies.txt
    
  2. Дайте права доступа для выполнения скрипта

  3. В терминале запустите:

    ./wgetgdrive.sh <file ID> <filename>
    

    например:

    ./wgetgdrive.sh 1lsDPURlTNzS62xEOAIG98gsaW6x2PYd2 images.zip
    

С 2022 года вы можете использовать это решение:

https://drive.google.com/uc?export=download&amp;amp;id=FILE_ID&amp;amp;confirm=t


Источник «страницы с предупреждением о сканировании на вирусы»:

форма «Все равно скачать» отправляет сообщение на тот же URL-адрес, но с тремя дополнительными параметрами:

  • t
  • confirm
  • uuid

Если вы измените исходный URL-адрес и добавите один из них: , он загрузит файл без страницы с предупреждением.

Так что просто измените свой URL на

      https://drive.google.com/uc?export=download&id=FILE_ID&confirm=t 

Например:

      $ curl -L 'https://drive.google.com/uc?export=download&id=FILE_ID' > large_video.mp4
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                             Dload  Upload   Total   Spent    Left  Speed
100  2263    0  2263    0     0   5426      0 --:--:-- --:--:-- --:--:--  5453

После добавленияconfirm=t, результат:

      $ curl -L 'https://drive.google.com/uc?export=download&id=FILE_ID&confirm=t' > large_video.mp4
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                             Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  128M  100  128M    0     0  10.2M      0  0:00:12  0:00:12 --:--:-- 10.9M

Получить пакет.

youtube-dl: https://rg3.github.io/youtube-dl/download.html

или же

sudo python2.7 -m pip install --upgrade youtube_dl /// sudo python3.6 -m pip install --upgrade youtube_dl

Создайте общую ссылку, как указано выше

Link sharing on

Anyone with the link can access

  1. Скопируйте ссылку в окно в режиме инкогнито: https://drive.google.com/a/hostname_here.com/file/d/kfjsdlkfjskljfkjskfjsskljfsjfklsjdf/view?usp=sharing

  2. Будет изменена ссылка на: https://drive.google.com/file/d/yuituyituiyuityuiutiuyituitiyuituiyuituyit/view

  3. Нажмите на Загрузить

  4. Новая страница появится

  5. Щелкните правой кнопкой мыши на имени файла и скопируйте его адрес

  6. Перейти к терминалу

  7. Тип:

youtube-dl https://drive.google.com/open?id=opopopopoppopop_nmnmnmnmnmnmnmn
[GoogleDrive] opopopopoppopop_nmnmnmnmnmnmnmn: Downloading webpage
[GoogleDrive] opopopopoppopop_nmnmnmnmnmnmnmn: Requesting source file
[download] Destination: your_file_name_here.zip-opopopopoppopop_nmnmnmnmnmnmnmn.zip
[download] 100% of 61.51MiB in 01:10

Надеюсь, поможет

Я использовал curl-фрагмент @ Amit Chahar, который опубликовал хороший ответ в этой теме. Я счел полезным поместить его в функцию bash, а не в отдельный.sh файл

function curl_gdrive {

    GDRIVE_FILE_ID=$1
    DEST_PATH=$2

    curl -c ./cookie -s -L "https://drive.google.com/uc?export=download&id=${GDRIVE_FILE_ID}" > /dev/null
    curl -Lb ./cookie "https://drive.google.com/uc?export=download&confirm=`awk '/download/ {print $NF}' ./cookie`&id=${GDRIVE_FILE_ID}" -o ${DEST_PATH}
    rm -fr cookie
}

которые могут быть включены, например, в ~/.bashrc (разумеется, после получения, если не получен автоматически) и используется следующим образом

   $ curl_gdrive 153bpzybhfqDspyO_gdbcG5CMlI19ASba imagenet.tar

Все приведенные выше ответы, кажется, затемняют простоту ответа или имеют некоторые нюансы, которые не объясняются.

Если файл является общедоступным, вы можете создать прямую ссылку для скачивания, просто зная идентификатор файла. URL-адрес должен иметь вид " https://drive.google.com/uc?id=[FILEID]&export=download visible&export=download". Это работает с 22.11.2019. Это не требует от получателя входа в систему Google, но требует, чтобы файл был общедоступным.

  1. В браузере перейдите на drive.google.com.

  2. Щелкните файл правой кнопкой мыши и выберите "Получить ссылку для общего доступа".

  1. Откройте новую вкладку, выберите адресную строку и вставьте содержимое буфера обмена, который будет общей ссылкой. Вы увидите файл, отображаемый программой просмотра Google. Идентификатор - это номер прямо перед компонентом "Просмотр" URL:

  1. Измените URL-адрес, чтобы он имел следующий формат, заменив "[FILEID]" идентификатором вашего общего файла:

    https://drive.google.com/uc?id=[FILEID]&export=download

  2. Это ваша прямая ссылка для скачивания. Если вы щелкнете по нему в своем браузере, файл теперь будет "отправлен" в ваш браузер, откроется диалоговое окно загрузки, позволяющее сохранить или открыть файл. Вы также можете использовать эту ссылку в своих сценариях загрузки.

  3. Таким образом, эквивалентная команда curl будет такой:

curl -L "https://drive.google.com/uc?id=AgOATNfjpovfFrft9QYa-P1IeF9e7GWcH&export=download" > phlat-1.0.tar.gz

Самый простой способ это:

  1. Создать ссылку для скачивания и скопировать fileID
  2. Скачать с WGET: wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=FILEID' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=FILEID" -O FILENAME && rm -rf /tmp/cookies.txt

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

Работающие с апреля 2020 г. на macOS 10.15.4 для общедоступных документов:

# this is used for drive directly downloads
function download-google(){
  echo "https://drive.google.com/uc?export=download&id=$1"
  mkdir -p .tmp
  curl -c .tmp/$1cookies "https://drive.google.com/uc?export=download&id=$1" > .tmp/$1intermezzo.html;
  curl -L -b .tmp/$1cookies "$(egrep -o "https.+download" .tmp/$1intermezzo.html)" > $2;
}

# some files are shared using an indirect download
function download-google-2(){
  echo "https://drive.google.com/uc?export=download&id=$1"
  mkdir -p .tmp
  curl -c .tmp/$1cookies "https://drive.google.com/uc?export=download&id=$1" > .tmp/$1intermezzo.html;
  code=$(egrep -o "confirm=(.+)&amp;id=" .tmp/$1intermezzo.html | cut -d"=" -f2 | cut -d"&" -f1)
  curl -L -b .tmp/$1cookies "https://drive.google.com/uc?export=download&confirm=$code&id=$1" > $2;
}

# used like this
download-google <id> <name of item.extension>

Нет ответа предлагает то, что работает для меня по состоянию на декабрь 2016 года ( источник):

curl -L https://drive.google.com/uc?id={FileID}

при условии, что файл Google Диска был передан тем, у кого есть ссылка и {FileID} это строка позади ?id= в общем URL.

Хотя я не проверял с большими файлами, я думаю, что это может быть полезно знать.

У меня была такая же проблема с Google Drive.

Вот как я решил проблему, используя Ссылки 2.

  1. Откройте браузер на вашем ПК, перейдите к файлу на Google Диске. Дайте вашему файлу публичную ссылку.

  2. Скопируйте общедоступную ссылку в буфер обмена (например, щелкните правой кнопкой мыши, скопируйте адрес ссылки)

  3. Откройте Терминал. Если вы загружаете на другой компьютер / сервер / компьютер, вы должны использовать SSH, как показано ниже.

  4. Установите ссылки 2 (метод debian/ubuntu, используйте ваш дистрибутив или аналог ОС)

    sudo apt-get install links2

  5. Вставьте ссылку в свой терминал и откройте ее с помощью ссылок следующим образом:

    links2 "paste url here"

  6. Перейдите к ссылке на скачивание в ссылках, используя клавиши со стрелками, и нажмите Enter

  7. Выберите имя файла, и он загрузит ваш файл

Используйте YouTube-DL!

youtube-dl https://drive.google.com/open?id=ABCDEFG1234567890

Вы также можете пройти --get-url чтобы получить URL для прямой загрузки.

Вот так в 2023 году:

      FILEID="unique_google_drive_id"
FILENAME="output_filename"

wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=${FILEID}' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=${FILEID}" -O ${FILENAME} && rm -rf /tmp/cookies.txt

Простой способ скачать файл с диска Google, вы также можете скачать файл на colab

pip install gdown

import gdown

потом

url = 'https://drive.google.com/uc?id=0B9P1L--7Wd2vU3VUVlFnbTgtS2c'
output = 'spam.txt'
gdown.download(url, output, quiet=False)

или

fileid='0B9P1L7Wd2vU3VUVlFnbTgtS2c'

gdown https://drive.google.com/uc?id=+fileid

Документ https://pypi.org/project/gdown/

Мне не удалось заставить работать perl-скрипт Nanoix или другие примеры curl, которые я видел, поэтому я сам начал изучать API в python. Это работало хорошо для маленьких файлов, но большие файлы заполняли доступный оперативный памяти, поэтому я нашел другой хороший код, который использует API для частичной загрузки. Гист здесь: https://gist.github.com/csik/c4c90987224150e4a0b2

Обратите внимание на загрузку json-файла client_secret из интерфейса API в локальный каталог.

Источник
$ cat gdrive_dl.py
from pydrive.auth import GoogleAuth  
from pydrive.drive import GoogleDrive    

"""API calls to download a very large google drive file.  The drive API only allows downloading to ram 
   (unlike, say, the Requests library's streaming option) so the files has to be partially downloaded
   and chunked.  Authentication requires a google api key, and a local download of client_secrets.json
   Thanks to Radek for the key functions: http://stackru.com/questions/27617258/memoryerror-how-to-download-large-file-via-google-drive-sdk-using-python
"""

def partial(total_byte_len, part_size_limit):
    s = []
    for p in range(0, total_byte_len, part_size_limit):
        last = min(total_byte_len - 1, p + part_size_limit - 1)
        s.append([p, last])
    return s

def GD_download_file(service, file_id):
  drive_file = service.files().get(fileId=file_id).execute()
  download_url = drive_file.get('downloadUrl')
  total_size = int(drive_file.get('fileSize'))
  s = partial(total_size, 100000000) # I'm downloading BIG files, so 100M chunk size is fine for me
  title = drive_file.get('title')
  originalFilename = drive_file.get('originalFilename')
  filename = './' + originalFilename
  if download_url:
      with open(filename, 'wb') as file:
        print "Bytes downloaded: "
        for bytes in s:
          headers = {"Range" : 'bytes=%s-%s' % (bytes[0], bytes[1])}
          resp, content = service._http.request(download_url, headers=headers)
          if resp.status == 206 :
                file.write(content)
                file.flush()
          else:
            print 'An error occurred: %s' % resp
            return None
          print str(bytes[1])+"..."
      return title, filename
  else:
    return None          


gauth = GoogleAuth()
gauth.CommandLineAuth() #requires cut and paste from a browser 

FILE_ID = 'SOMEID' #FileID is the simple file hash, like 0B1NzlxZ5RpdKS0NOS0x0Ym9kR0U

drive = GoogleDrive(gauth)
service = gauth.service
#file = drive.CreateFile({'id':FILE_ID})    # Use this to get file metadata
GD_download_file(service, FILE_ID) 

Я нашел рабочее решение для этого... Просто используйте следующее

wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1HlzTR1-YVoBPlXo0gMFJ_xY4ogMnfzDi' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1HlzTR1-YVoBPlXo0gMFJ_xY4ogMnfzDi" -O besteyewear.zip && rm -rf /tmp/cookies.txt

Это работает с ноября 2017 года https://gist.github.com/ppetraki/258ea8240041e19ab258a736781f06db

#!/bin/bash

SOURCE="$1"
if [ "${SOURCE}" == "" ]; then
    echo "Must specify a source url"
    exit 1
fi

DEST="$2"
if [ "${DEST}" == "" ]; then
    echo "Must specify a destination filename"
    exit 1
fi

FILEID=$(echo $SOURCE | rev | cut -d= -f1 | rev)
COOKIES=$(mktemp)

CODE=$(wget --save-cookies $COOKIES --keep-session-cookies --no-check-certificate "https://docs.google.com/uc?export=download&id=${FILEID}" -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/Code: \1\n/p')

# cleanup the code, format is 'Code: XXXX'
CODE=$(echo $CODE | rev | cut -d: -f1 | rev | xargs)

wget --load-cookies $COOKIES "https://docs.google.com/uc?export=download&confirm=${CODE}&id=${FILEID}" -O $DEST

rm -f $COOKIES

После возни с этим мусором. Я нашел способ загрузить мой сладкий файл с помощью инструментов разработчика Chrome.

  1. На вкладке "Документы" Google Ctr+Shift+J (Настройка -> Инструменты разработчика)
  2. Переключиться на вкладки сети
  3. В файле документации нажмите "Загрузить" -> Загрузить как CSV, xlsx,....
  4. Он покажет вам запрос в консоли "Сеть"

  5. Щелкните правой кнопкой мыши -> Копировать -> Копировать как завиток

  6. Ваша команда Curl будет такой, и добавьте -o создать экспортированный файл. curl 'https://docs.google.com/spreadsheets/d/1Cjsryejgn29BDiInOrGZWvg/export?format=xlsx&id=1Cjsryejgn29BDiInOrGZWvg' -H 'authority: docs.google.com' -H 'upgrade-insecure-requests: 1' -H 'user-agent: Mozilla/5.0 (X..... -o server.xlsx

Решено!

Есть мультиплатформенный клиент с открытым исходным кодом, написанный на Go: drive. Это довольно красиво и полнофункционально, а также находится в активной разработке.

$ drive help pull
Name
        pull - pulls remote changes from Google Drive
Description
        Downloads content from the remote drive or modifies
         local content to match that on your Google Drive

Note: You can skip checksum verification by passing in flag `-ignore-checksum`

* For usage flags: `drive pull -h`

Есть более простой способ.

Установите cliget/CURLWGET из расширения Firefox/ Chrome.

Загрузите файл из браузера. Это создает ссылку curl/wget, которая запоминает файлы cookie и заголовки, используемые при загрузке файла. Используйте эту команду из любой оболочки для загрузки

Альтернативный метод, 2020

Хорошо работает для безголовых серверов. Я пытался загрузить частный файл размером ~200 ГБ, но не смог заставить работать ни один из других методов, упомянутых в этом потоке.

Решение

  1. (Пропустите этот шаг, если файл уже находится на вашем собственном диске Google). Сделайте копию файла, который вы хотите загрузить из общей / общей папки, в свою учетную запись Google Диска. Выберите Файл -> Щелкните правой кнопкой мыши -> Сделать копию

  1. Установите и настройте Rclone, инструмент командной строки с открытым исходным кодом, для синхронизации файлов между вашим локальным хранилищем и Google Диском. Вот краткое руководство по установке и настройке rclone для Google Диска.

  2. Скопируйте файл с Google Диска на свой компьютер с помощью Rclone

       rclone copy mygoogledrive:path/to/file /path/to/file/on/local/machine -P

-P Аргумент помогает отслеживать прогресс загрузки и позволяет узнать, когда она завершена.

Вот небольшой скрипт bash, который я написал, который делает работу сегодня. Он работает с большими файлами и может восстанавливать частично извлеченные файлы. Он принимает два аргумента: первый - file_id, а второй - имя выходного файла. Основные улучшения по сравнению с предыдущими ответами здесь заключаются в том, что он работает с большими файлами и нуждается только в общедоступных инструментах: bash, curl, tr, grep, du, cut и mv.

#!/usr/bin/env bash
fileid="$1"
destination="$2"

# try to download the file
curl -c /tmp/cookie -L -o /tmp/probe.bin "https://drive.google.com/uc?export=download&id=${fileid}"
probeSize=`du -b /tmp/probe.bin | cut -f1`

# did we get a virus message?
# this will be the first line we get when trying to retrive a large file
bigFileSig='<!DOCTYPE html><html><head><title>Google Drive - Virus scan warning</title><meta http-equiv="content-type" content="text/html; charset=utf-8"/>'
sigSize=${#bigFileSig}

if (( probeSize <= sigSize )); then
  virusMessage=false
else
  firstBytes=$(head -c $sigSize /tmp/probe.bin)
  if [ "$firstBytes" = "$bigFileSig" ]; then
    virusMessage=true
  else
    virusMessage=false
  fi
fi

if [ "$virusMessage" = true ] ; then
  confirm=$(tr ';' '\n' </tmp/probe.bin | grep confirm)
  confirm=${confirm:8:4}
  curl -C - -b /tmp/cookie -L -o "$destination" "https://drive.google.com/uc?export=download&id=${fileid}&confirm=${confirm}"
else
  mv /tmp/probe.bin "$destination"
fi
Другие вопросы по тегам