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 ответов

Для всех, кто наткнется на эту тему, по состоянию на май 2022 года следующее работает, чтобы обойти антивирусную проверку больших файлов:

      #!/bin/bash
fileid="FILEIDENTIFIER"
filename="FILENAME"
html=`curl -c ./cookie -s -L "https://drive.google.com/uc?export=download&id=${fileid}"`
curl -Lb ./cookie "https://drive.google.com/uc?export=download&`echo ${html}|grep -Po '(confirm=[a-zA-Z0-9\-_]+)'`&id=${fileid}" -o ${filename}

Вот обходной путь, по которому я подошел, загрузив файлы с Google Drive в мою оболочку Google Cloud Linux.

  1. Предоставьте общий доступ к файлу в PUBLIC и с правами редактирования, используя расширенный доступ.
  2. Вы получите ссылку для обмена, которая будет иметь идентификатор. Смотрите ссылку:- drive.google.com/file/d/[ID]/view?usp=sharing
  3. Скопируйте этот идентификатор и вставьте его по следующей ссылке: -

googledrive.com/host/[ID]

  1. Приведенная выше ссылка будет нашей ссылкой для скачивания.
  2. Используйте wget для загрузки файла: -

wget https://googledrive.com/host/[ID]

  1. Эта команда загрузит файл с именем [ID] без расширения и с тем же размером файла в том же месте, где вы выполнили команду wget.
  2. На самом деле, я скачал заархивированную папку в моей практике. поэтому я переименовал этот неловкий файл, используя: -

mv [ID] 1.zip

  1. затем с помощью

распаковать 1.zip

мы получим файлы.

Вы можете установить « lynx », и с помощью « lynx » вы можете легко скачать файл.

      yum install lynx

замените ID_OF_FILE на идентификатор вашего файла

      lynx https://drive.google.com/u/0/uc?id=ID_OF_FILE&export=download

Затем выберите «скачать» или «все равно скачать».

вот и все

Вам просто нужно использовать wget с:

 https://drive.google.com/uc?authuser=0&id=[your ID without brackets]&export=download

Оплаченный Файл должен быть общедоступным.

Май 2018 РАБОТАЕТ

Привет, основываясь на этих комментариях... я создаю bash для экспорта списка URL из файла URLS.txt в URLS_DECODED.txt, который используется в некоторых ускорителях, таких как flashget (я использую cygwin для объединения окон и linux)

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

Команда GREP HEAD и CUT, обработка и получение окончательной ссылки, Основана на испанском языке, может быть, вы могли бы быть портированы на АНГЛИЙСКИЙ ЯЗЫК

echo -e "$URL_TO_DOWNLOAD\r" вероятно, \ r только cywin и должно быть заменено на \ n (разрывная строка)

**********user*********** это папка пользователя

*******Localización*********** на испанском языке, уберите звездочки и дайте слово на английском. Местоположение и адаптируйте ГОЛОВУ и СОЛНЕЧНЫЕ числа, чтобы соответствовать подходу.

rm -rf /home/**********user***********/URLS_DECODED.txt
COUNTER=0
while read p; do 
    string=$p
    hash="${string#*id=}"
    hash="${hash%&*}"
    hash="${hash#*file/d/}"
    hash="${hash%/*}"
    let COUNTER=COUNTER+1
    echo "Enlace "$COUNTER" id="$hash
    URL_TO_DOWNLOAD=$(wget --spider --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='$hash -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id="$hash 2>&1 | grep *******Localización***********: | head -c-13 | cut -c16-)
    rm -rf /tmp/cookies.txt
    echo -e "$URL_TO_DOWNLOAD\r" >> /home/**********user***********/URLS_DECODED.txt
    echo "Enlace "$COUNTER" URL="$URL_TO_DOWNLOAD
done < /home/**********user***********/URLS.txt

ИЮЛЬ 2020 - Пакетное решение для пользователей Windows

Я хотел бы добавить простое решение для пакетных файлов для пользователей Windows, так как я нашел только решения для Linux, и мне потребовалось несколько дней, чтобы изучить все это для создания решения для Windows. Итак, чтобы уберечь эту работу от других, которым она может понадобиться, вот она.

Необходимые инструменты

  1. wget для Windows (небольшая программа размером 5 КБ, установка не требуется) Загрузите ее отсюда.https://eternallybored.org/misc/wget/

  2. jrepl для Windows (небольшая программа с пакетным файлом 117 КБ, установка не требуется). Этот инструмент похож на инструмент sed для linux. Загрузите его отсюда:https://www.dostips.com/forum/viewtopic.php?t=6044

Предполагая

%filename% - имя файла, в который будет сохранена загрузка.
% fileid% = идентификатор файла Google (как уже объяснялось здесь ранее)

Пакетный код для загрузки небольшого файла с Google Диска

wget -O "%filename%" "https://docs.google.com/uc?export=download&id=%fileid%"        

Пакетный код для загрузки большого файла с Google Диска

set cookieFile="cookie.txt"
set confirmFile="confirm.txt"
   
REM downlaod cooky and message with request for confirmation
wget --quiet --save-cookies "%cookieFile%" --keep-session-cookies --no-check-certificate "https://docs.google.com/uc?export=download&id=%fileid%" -O "%confirmFile%"
   
REM extract confirmation key from message saved in confirm file and keep in variable resVar
jrepl ".*confirm=([0-9A-Za-z_]+).*" "$1" /F "%confirmFile%" /A /rtn resVar
   
REM when jrepl writes to variable, it adds carriage return (CR) (0x0D) and a line feed (LF) (0x0A), so remove these two last characters
set confirmKey=%resVar:~0,-2%
   
REM download the file using cookie and confirmation key
wget --load-cookies "%cookieFile%" -O "%filename%" "https://docs.google.com/uc?export=download&id=%fileid%&confirm=%confirmKey%"
   
REM clear temporary files 
del %cookieFile%
del %confirmFile%

Ноя 2020

Если вы предпочитаете использовать сценарий bash, у меня это сработало: (файл 5 ГБ, общедоступный)

#!/bin/bash
if [ $# != 2 ]; then
echo "Usage: googledown.sh ID save_name"
exit 0
fi
confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id='$1 -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')
echo $confirm
wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$confirm&id=$1" -O $2 && rm -rf /tmp/cookies.txt

Получить идентификатор файла:

1. Перейдите на свой Google Диск в браузере.

2. Щелкните правой кнопкой мыши файл, который хотите загрузить, и щелкните Get shareable link. Ссылка выглядит так: https://drive.google.com/file/d/XXX/view?usp=sharing. Обратите внимание на file ID; он понадобится вам ниже.

Получите токен OAuth:

1. Перейдите на игровую площадку OAuth 2.0 .

2.В Select & authorize APIsполе, прокрутить вниз, развернуть Drive API v3и выберите https://www.googleapis.com/auth/drive.readonly.

3.Нажмите Authorize APIsа потом Exchange authorization code for tokens. Скопируйте Access token; он понадобится вам ниже.

Загрузите файл из командной строки:

При использовании OS X или Linux откройте программу «Терминал» и введите следующую команду.

      curl -H "Authorization: Bearer YYY" https://www.googleapis.com/drive/v3/files/XXX?alt=media -o ZZZ 

Если вы используете Windows, откройте программу «PowerShell» и введите следующую команду.

      Invoke-RestMethod -Uri https://www.googleapis.com/drive/v3/files/XXX?alt=media -Method Get Headers @{"Authorization"="Bearer YYY"} -OutFile ZZZ

В вашей команде замените XXXс идентификатором файла сверху, YYYс токеном доступа сверху, и ZZZс именем файла, который будет сохранен (например, «myFile.zip», если вы загружаете zip-файл).

Май 2018

Если вы хотите использовать curl чтобы загрузить файл с Google Диска, в дополнение к идентификатору файла на диске вам также понадобится OAuth2 access_token для Google Drive API. Получение токена включает в себя несколько этапов с Google API Framework. Шаги регистрации в Google (в настоящее время) бесплатны.

OAuth2 access_token потенциально разрешает все виды деятельности, поэтому будьте осторожны с ним. Кроме того, токен истекает через некоторое время (1 час?), Но не настолько короткий, чтобы предотвратить злоупотребление, если кто-то его перехватит.

Когда у вас есть access_token и fileid, это будет работать:

AUTH="Authorization: Bearer the_access_token_goes_here"
FILEID="fileid_goes_here"
URL=https://www.googleapis.com/drive/v3/files/$FILEID?alt=media
curl --header "$AUTH" $URL >myfile.ext

См. Также: Google Drive API - REST - Скачать файлы

Решение с использованием только Google Drive API

Перед запуском приведенного ниже кода вы должны активировать Google Drive API, установить зависимости и пройти аутентификацию с помощью своей учетной записи. Инструкции можно найти на исходной странице руководства по API Google Диска.

import io
import os
import pickle
import sys, argparse
from googleapiclient.discovery import build
from google.auth.transport.requests import Request
from googleapiclient.http import MediaIoBaseDownload
from google_auth_oauthlib.flow import InstalledAppFlow

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/drive.readonly']


def _main(file_id, output):
    """ Shows basic usage of the Drive v3 API.
        Prints the names and ids of the first 10 files the user has access to.
    """
    if not file_id:
        sys.exit('\nMissing arguments. Correct usage:\ndrive_api_download.py --file_id <file_id> [--output output_name]\n')
    elif not output:
        output = "./" + file_id
    
    creds = None
    # The file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('drive', 'v3', credentials=creds)

    # Downloads file
    request = service.files().get_media(fileId=file_id)
    fp = open(output, "wb")
    downloader = MediaIoBaseDownload(fp, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk(num_retries=3)
        print("Download %d%%." % int(status.progress() * 100))

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-i', '--file_id')
    parser.add_argument('-o', '--output')
    args = parser.parse_args()
    
    _main(args.file_id, args.output)

Skicka - это инструмент Cli для загрузки, загрузки файлов доступа с Google-диска.

пример -

skicka download /Pictures/2014 ~/Pictures.copy/2014
10 / 10 [=====================================================] 100.00 % 
skicka: preparation time 1s, sync time 6s
skicka: updated 0 Drive files, 10 local files
skicka: 0 B read from disk, 16.18 MiB written to disk
skicka: 0 B uploaded (0 B/s), 16.18 MiB downloaded (2.33 MiB/s)
skicka: 50.23 MiB peak memory used

Я использую этот небольшой скрипт, который получает только URL-адрес, скопированный с Google Диска:

      #!/bin/bash

name=`curl $1 |  grep -w \"name\" | sed 's/.*"name" content="//' | 
sed 's/".*//'`
id=`echo $1 | sed 's#.*/d/##; s#/view.*##'`
curl -L https://drive.google.com/uc?id=$id > $name
# or
# wget -O $name https://drive.google.com/uc?id=$id

Получите доступную ссылку и откройте ее в режиме инкогнито (очень важно). Он скажет, что не может сканировать.

Откройте инспектор и отследите сетевой трафик. Нажмите кнопку "Все равно скачать".

Скопируйте URL-адрес последнего сделанного запроса. Это ваша ссылка. Используйте это в wget.

Я сделал это с помощью скрипта python и api диска Google, вы можете попробовать этот фрагмент:

//using chunk download

file_id = 'someid'
request = drive_service.files().get_media(fileId=file_id)
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
    status, done = downloader.next_chunk()
    print "Download %d%%." % int(status.progress() * 100)

метод без сценариев для получения прямой ссылки

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

Шаг 1. Создайте прямую ссылку обычным образом с помощью существующих инструментов.

Во-первых, вы используете все другие существующие решения для создания прямой ссылки из вашей общей ссылки. Вы можете использовать https://sites.google.com/site/gdocs2direct/, https://www.wonderplugin.com/online-tools/google-drive-direct-link-generator/ или https://chrome.google. .com/webstore/detail/drive-direct-download/mpfdlhhpbhgghplbambikplcfpbjiail .
Я проигнорирую эту часть.

Сгенерированная прямая ссылка выглядит так:https://drive.google.com/u/0/uc?id=1Gjvcfj-8xxxxxxx8G8_jpgjcyorQ7BX5&export=download

Прямая ссылка работает для большинства небольших файлов, но не работает для больших файлов. Он покажет предупреждение о вирусе, а не просто загрузит файл. Теперь давайте решим этот вопрос.

Шаг 2. Исправьте неработающую прямую ссылку, чтобы обойти предупреждение о вирусе.

Откройте неработающую «прямую» ссылку в браузере, вы увидите «Google Диск не может проверить этот файл на наличие вирусов». Теперь щелкните правой кнопкой мыши иview page source, вы увидите следующий текст:

      <form id="downloadForm" action="https://drive.google.com/u/0/uc?id=1Gjvcfj-8xxxxxxx8G8_jpgjcyorQ7BX5&amp;export=download&amp;confirm=t&amp;uuid=5a0dd46b-521e-4ae7-8b41-0912e88b7782" method="post">

Вы нашли последнюю ссылку! Заменить все&amp;к&и наслаждаться:

      https://drive.google.com/uc?id=1Gjvcfj-8xxxxxxx8G8_jpgjcyorQ7BX5&export=download&confirm=t&uuid=c953a94e-b844-479f-8386-1ec83770fffb

Другое решение для большого файла: Google Drive API

Для этого решения уже есть отличный ответ!

Вы можете получить URL-ссылку для скачивания из Google каки извлеките часть FILEID. Затем замените его следующим (он там дважды).

      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

Замените FILENAME на то, что файл должен называться в приведенной выше строке, и наслаждайтесь.

Самый простой способ - положить то, что вы хотите скачать, в папку. Предоставьте общий доступ к этой папке, а затем получите идентификатор папки из строки URL.

Затем перейдите по https://googledrive.com/host/[ID] (замените идентификатор на идентификатор вашей папки). Вы должны увидеть список всех файлов в этой папке, щелкните тот, который хотите загрузить. Затем загрузка должна перейти на вашу страницу загрузки (Ctrl+J на ​​Chrome), затем вы хотите скопировать ссылку на скачивание, а затем использовать wget "ссылка для скачивания".

Наслаждаться:)

Другие вопросы по тегам