615 Stimmen

Wget/curl große Datei von Google Drive herunterladen

Ich versuche, eine Datei von Google Drive in einem Skript herunterzuladen, und habe dabei ein kleines Problem. Die Dateien, die ich herunterladen möchte, sind hier.

Ich habe online intensiv nach Informationen gesucht und es schließlich geschafft, eine davon herunterzuladen. Ich habe die UIDs der Dateien bekommen und die kleinere (1,6 MB) wird ohne Probleme heruntergeladen, jedoch wird die größere Datei (3,7 GB) immer auf eine Seite umgeleitet, die mich fragt, ob ich den Download ohne Virenscan fortsetzen möchte. Kann mir jemand helfen, diese Seite zu umgehen?

So habe ich die erste Datei zum Laufen gebracht -

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

Wenn ich dasselbe mit der anderen Datei mache,

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

Bekomme ich die folgende Ausgabe - enter image description here

Ich bemerke auf der vorletzten Zeile des Links, dass ein &confirm=JwkK vorhanden ist, was eine zufällige 4-Zeichenfolge ist, aber darauf hinweist, dass es einen Weg gibt, eine Bestätigung zu meiner URL hinzuzufügen. Einer der Links, den ich besucht habe, schlug &confirm=no_antivirus vor, aber das funktioniert nicht.

1voto

justadev Punkte 868

Wenn Sie lieber ein Bash-Skript verwenden, hat dies für mich funktioniert (5Gb-Datei, öffentlich verfügbar):

#!/bin/bash
if [ $# != 2 ]; then
echo "Verwendung: googledown.sh ID speichern_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

1voto

audi02 Punkte 529

JULY 2020 - Lösung für Windows-Benutzer mit Batchdatei

Ich möchte eine einfache Batchdateilösung für Windows-Benutzer hinzufügen, da ich nur Lösungen für Linux gefunden habe und es mich mehrere Tage gekostet hat, all diese Dinge zu lernen, um eine Lösung für Windows zu erstellen. Also, um anderen Arbeit zu ersparen, die es vielleicht benötigen, hier ist sie.

Benötigte Tools

  1. wget für Windows (kleines 5KB exe-Programm, keine Installation erforderlich) Laden Sie es hier herunter. https://eternallybored.org/misc/wget/

  2. jrepl für Windows (kleines 117KB Batchdateiprogramm, keine Installation erforderlich) Dieses Tool ist ähnlich dem Linux-Tool sed. Laden Sie es hier herunter: https://www.dostips.com/forum/viewtopic.php?t=6044

Vorausgesetzt

  • %dateiname%: Der Dateiname, unter dem der Download gespeichert werden soll.
  • %dateiid%: Google-Datei-ID (wie bereits zuvor hier erklärt)

Batchcode zum Herunterladen einer kleinen Datei von Google Drive

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

Batchcode zum Herunterladen einer großen Datei von Google Drive.

set cookieFile="cookie.txt"
set confirmFile="confirm.txt"

REM cooky und Nachricht mit Bestätigungsanfrage herunterladen
wget --quiet --save-cookies "%cookieFile%" --keep-session-cookies --no-check-certificate "https://docs.google.com/uc?export=download&id=%dateiid%" -O "%confirmFile%"

REM Bestätigungsschlüssel aus der in der Bestätigungsdatei gespeicherten Nachricht extrahieren und in der Variablen resVar speichern
jrepl ".*confirm=([0-9A-Za-z_]+).*" "$1" /F "%confirmFile%" /A /rtn resVar

REM Wenn jrepl in eine Variable schreibt, fügt es ein Wagenrücklauf (CR) (0x0D) und einen Zeilenumbruch (LF) (0x0A) hinzu, also entfernen Sie diese beiden letzten Zeichen
set confirmKey=%resVar:~0,-2%

REM Datei mit Cookie- und Bestätigungsschlüssel herunterladen
wget --load-cookies "%cookieFile%" -O "%dateiname%" "https://docs.google.com/uc?export=download&id=%dateiid%&confirm=%confirmKey%"

REM Temporäre Dateien löschen
del %cookieFile%
del %confirmFile%

1voto

Sk. Punkte 460

Mai 2018 IN ARBEIT

Hallo basierend auf diesen Kommentaren ... habe ich ein Bash-Skript erstellt, um eine Liste von URLs aus der Datei URLS.txt in eine URLS_DECODED.txt zu exportieren und in Beschleunigern wie flashget zu verwenden (ich verwende cygwin, um Windows & Linux zu kombinieren)

Das Befehlsskript wurde eingeführt, um das Herunterladen zu vermeiden und den endgültigen Link direkt zu erhalten

Der Befehl GREP HEAD und CUT, verarbeiten und erhalten den endgültigen Link, basiert auf der spanischen Sprache, vielleicht könnte er in die ENGLISCHE SPRACHE übertragen werden

echo -e "$URL_TO_DOWNLOAD\r" wahrscheinlich ist das \r nur in Cygwin und muss durch ein \n (Zeilenumbruch) ersetzt werden

**********Benutzer*********** ist der Benutzerordner

*******Ort*********** ist in spanischer Sprache, entfernen Sie die Sterne und lassen Sie das Wort in englisch als Location und passen Sie die HEAD- und CUT-Zahlen für den geeigneten Ansatz an

rm -rf /home/**********Benutzer***********/URLS_DECODED.txt
ZÄHLER=0
while read p; do 
    string=$p
    hash="${string#*id=}"
    hash="${hash%&*}"
    hash="${hash#*file/d/}"
    hash="${hash%/*}"
    let ZÄHLER=ZÄHLER+1
    echo "Link "$ZÄHLER" 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 *******Ort***********: | head -c-13 | cut -c16-)
    rm -rf /tmp/cookies.txt
    echo -e "$URL_TO_DOWNLOAD\r" >> /home/**********Benutzer***********/URLS_DECODED.txt
    echo "Link "$ZÄHLER" URL="$URL_TO_DOWNLOAD
done < /home/**********Benutzer***********/URLS.txt

0voto

Paul Punkte 24268

Wenn Sie curl verwenden möchten, um eine Datei von Google Drive herunterzuladen, benötigen Sie neben der Datei-ID im Laufwerk auch einen OAuth2 access_token für die Google Drive API. Das Abrufen des Tokens umfasst mehrere Schritte mit dem Google API-Framework. Die Anmeldeschritte bei Google sind (derzeit) kostenlos.

Ein OAuth2 access_token ermöglicht potenziell alle Arten von Aktivitäten, daher seien Sie vorsichtig damit. Außerdem läuft das Token nach kurzer Zeit ab (1 Stunde?), aber nicht kurz genug, um Missbrauch zu verhindern, wenn es jemand abfängt.

Wenn Sie einmal einen access_token und die Datei-ID haben, funktioniert dies:

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

Siehe auch: Google Drive APIs -- REST -- Dateien herunterladen

0voto

ottovon Punkte 333

Lösung, die nur die Google Drive API verwendet

Bevor Sie den folgenden Code ausführen, müssen Sie die Google Drive API aktivieren, Abhängigkeiten installieren und sich mit Ihrem Konto authentifizieren. Anweisungen finden Sie auf der originalen Google Drive API Anleitung:

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

# Wenn Sie diese Bereiche modifizieren, löschen Sie die Datei token.pickle.
SCOPES = ['https://www.googleapis.com/auth/drive.readonly']

def _main(file_id, output):
    """ Zeigt die grundlegende Verwendung der Drive v3 API.
        Gibt die Namen und IDs der ersten 10 Dateien aus, auf die der Benutzer Zugriff hat.
    """
    if not file_id:
        sys.exit('\nFehlende Argumente. Richtige Verwendung:\ndrive_api_download.py --file_id  [--output output_name]\n')
    elif not output:
        output = "./" + file_id

    creds = None
    # Die Datei token.pickle speichert die Zugriffs- und Aktualisierungstoken des Benutzers und wird
    # automatisch erstellt, wenn der Autorisierungsablauf beim ersten Mal abgeschlossen ist.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # Wenn keine (gültigen) Anmeldeinformationen verfügbar sind, lassen Sie den Benutzer sich einloggen.
    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)
        # Speichern Sie die Anmeldeinformationen für den nächsten Start
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

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

    # Datei herunterladen
    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)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X