So automatisieren Sie regelmäßige Google Takeout-Sicherungen im Cloud-Speicher

42

Ich möchte regelmäßige Google Takeout- Backups erstellen (etwa alle 3 Monate) und diese verschlüsselt in einem anderen Cloud-Speicher wie DropBox oder S3 speichern.

Es muss keine Cloud-to-Cloud-Lösung sein, auch wenn sie bevorzugt wird. Es muss nicht zu 100% automatisiert sein, je mehr desto besser.

Vielen Dank im Voraus für alle Ideen.

Michał Šrajer
quelle

Antworten:

2

Anstelle von direkten APIs zum Sichern von Google Takeout (was derzeit fast unmöglich zu sein scheint) können Sie Ihre Daten auch über Google Drive auf Speicherlösungen von Drittanbietern sichern. Viele Google-Dienste ermöglichen das Sichern in Google Drive. Sie können Google Drive mit den folgenden Tools sichern:

GoogleCL - GoogleCL bringt Google-Dienste zur Befehlszeile.

gdatacopier - Dienstprogramme zur Verwaltung von Befehlszeilendokumenten für Google-Dokumente.

FUSE Google Drive - Ein in C geschriebenes FUSE-Dateisystem für den Benutzerbereich für Google Drive.

Grive - Eine unabhängige Open-Source-Implementierung eines Google Drive-Clients. Es verwendet die Google Document List API, um mit den Servern in Google zu kommunizieren. Der Code ist in C ++ geschrieben.

gdrive-cli - Eine Befehlszeilenschnittstelle für GDrive. Dies verwendet die GDrive-API, nicht die GDocs-API, was interessant ist. Um es zu verwenden, müssen Sie eine Chrome-Anwendung registrieren. Es muss mindestens von Ihnen installierbar sein, muss aber nicht veröffentlicht werden. Es gibt eine Boilerplate-App im Repo, die Sie als Ausgangspunkt verwenden können.

python-fuse-Beispiel - Enthält einige Folien und Beispiele für Python FUSE-Dateisysteme.

Die meisten davon scheinen sich in den Ubuntu-Repositories zu befinden. Ich habe selbst Fuse, gdrive und GoogleCL verwendet und alle funktionieren einwandfrei. Abhängig von der gewünschten Steuerungsebene ist dies sehr einfach oder sehr komplex. Das liegt an dir. Dies sollte von einem EC2 / S3-Server aus problemlos möglich sein. Finden Sie die Befehle nacheinander für alles heraus, was Sie brauchen, und schreiben Sie sie in ein Skript für einen Cron-Job.

Wenn Sie nicht so hart arbeiten möchten, können Sie auch einfach einen Dienst wie Spinbackup verwenden . Ich bin mir sicher, dass es andere gibt, aber ich habe keine ausprobiert.

krowe
quelle
20
Google takeout ist hierfür das beste Tool, da es mehr Dienste als diese anderen Tools unterstützt. Die Frage ist gültig.
jl6
6
@krowe: Deine Antwort ist wirklich nützlich, egal, ob es sich nur um Google Drive handelt. Mit Google takeout können Sie alle Ihre Daten von 25 verschiedenen Google-Diensten herunterladen, nicht nur von Google Drive.
Bjarke Freund-Hansen
@ BjarkeFreund-Hansen 1) Viele dieser 25 Dienste können auf GDrive gespeichert und im Rahmen einer automatisierten GDrive-Sicherung automatisch gesichert werden. 2) Die meisten der verbleibenden Dienste sind entweder sinnlos für Backups (+1, Kreise usw.) oder nicht mehr verfügbar (Google Code). 3) Ich bin es leid, es Leuten zu erklären, die keine bessere Antwort haben. Ich bin mir ziemlich sicher, dass es keine Möglichkeit gibt, das Herausnehmen zu automatisieren (abgesehen von clientseitigen Makros, die sowieso nicht sehr zuverlässig sind). 4) Wenn du mir das Gegenteil beweisen kannst, poste deine bessere Lösung und wir können reden. Wenn nicht, lesen Sie meinen vorherigen Kommentar zu diesem Thema.
Krowe
6
@krowe: Google Mail, Kalender, Kontakte, Fotos, Hangout-Verlauf und Standortverlauf sind Dienste, die ich ausgiebig nutze und gegen Datenverlust bei Google schützen möchte. Keine der Daten dieses Dienstes ist in Google Drive enthalten. Nur weil ich keine bessere Lösung kenne oder es überhaupt eine gibt, ist die Antwort nicht korrekter. Wiederum sage ich nicht, dass Ihre Antwort schlecht ist, sie beantwortet nur nicht die eigentliche Frage.
Bjarke Freund-Hansen
@ BjarkeFreund-Hansen Ich verstehe Ihre Frustration und einige dieser Dienste KÖNNEN mit Ihrem GDrive synchronisiert werden (damit sie zusammen mit ihm sichern). Zum Beispiel kann Google Fotos dies tun: Fotos sichern . Ich glaube, dass Kalender und Kontakte auf die gleiche Weise synchronisiert werden können. GMail kann ebenfalls gesichert werden: GMail sichern . Die anderen Dinge, die Sie erwähnen, weiß ich nicht, aber das liegt hauptsächlich daran, dass ich persönlich sowieso nicht die Mühe hätte, sie zu sichern.
Krowe
2

Dies ist eine Teilantwort mit Teilautomatisierung. Möglicherweise funktioniert es in Zukunft nicht mehr, wenn Google den automatisierten Zugriff auf Google Takeout einschränkt. Funktionen, die derzeit in dieser Antwort unterstützt werden:

+ --------------------------------------------- + --- --------- + --------------------- +
| Automatisierungsfunktion | Automatisiert? | Unterstützte Plattformen |
+ --------------------------------------------- + --- --------- + --------------------- +
| Google-Konto anmelden | Nein | |
| Holen Sie sich Cookies von Mozilla Firefox | Ja | Linux |
| Holen Sie sich Cookies von Google Chrome | Ja | Linux, macOS |
| Archiverstellung anfordern | Nein | |
| Archivierungserstellung einplanen | Ein bisschen | Website zum Mitnehmen |
| Überprüfen Sie, ob das Archiv erstellt wurde Nein | |
| Archivliste abrufen | Ja | Plattformübergreifend |
| Alle Archivdateien herunterladen Ja | Linux, macOS |
| Verschlüsseln Sie heruntergeladene Archivdateien Nein | |
| Laden Sie heruntergeladene Archivdateien in Dropbox | hoch Nein | |
| Laden Sie heruntergeladene Archivdateien in AWS S3 | hoch Nein | |
+ --------------------------------------------- + --- --------- + --------------------- +

Erstens kann eine Cloud-to-Cloud-Lösung nicht wirklich funktionieren, da es keine Schnittstelle zwischen Google Takeout und einem bekannten Objektspeicheranbieter gibt. Sie müssen die Sicherungsdateien auf Ihrem eigenen Computer verarbeiten (der auf Wunsch in der öffentlichen Cloud gehostet werden kann), bevor Sie sie an Ihren Objektspeicheranbieter senden.

Zweitens muss ein Automatisierungsskript, da es keine Google Takeout-API gibt, so tun, als wäre es ein Benutzer mit einem Browser, um die Erstellung des Google Takeout-Archivs und den Download-Ablauf zu durchlaufen.


Automatisierungsfunktionen

Google-Konto anmelden

Dies ist noch nicht automatisiert. Das Skript muss sich als Browser ausgeben und mögliche Hürden wie Zwei-Faktor-Authentifizierung, CAPTCHAs und andere verstärkte Sicherheitsüberprüfungen überwinden.

Holen Sie sich Cookies von Mozilla Firefox

Ich habe ein Skript, mit dem Linux-Benutzer die Google Takeout-Cookies von Mozilla Firefox abrufen und als Umgebungsvariablen exportieren können. Damit dies funktioniert, sollte es nur ein Firefox-Profil geben, und das Profil muss https://takeout.google.com besucht haben, während Sie angemeldet waren.

Als Einzeiler:

cookie_jar_path=$(mktemp) ; source_path=$(mktemp) ; cp ~/.mozilla/firefox/*.default/cookies.sqlite "$cookie_jar_path" ; sqlite3 "$cookie_jar_path" "SELECT name,value FROM moz_cookies WHERE baseDomain LIKE 'google.com' AND (name LIKE 'SID' OR name LIKE 'HSID' OR name LIKE 'SSID' OR (name LIKE 'OSID' AND host LIKE 'takeout.google.com')) AND originAttributes LIKE '^userContextId=1' ORDER BY creationTime ASC;" | sed -e 's/|/=/' -e 's/^/export /' | tee "$source_path" ; source "$source_path" ; rm -f "$source_path" ; rm -f "$cookie_jar_path"

Als schöneres Bash-Skript:

#!/bin/bash
# Extract Google Takeout cookies from Mozilla Firefox and export them as envvars
#
# The browser must have visited https://takeout.google.com as an authenticated user.

# Warn the user if they didn't run the script with `source`
[[ "${BASH_SOURCE[0]}" == "${0}" ]] && \
       echo 'WARNING: You should source this script to ensure the resulting environment variables get set.'

cookie_jar_path=$(mktemp)
source_path=$(mktemp)

# In case the cookie database is locked, copy the database to a temporary file.
# Only supports one Firefox profile.
# Edit the asterisk below to select a specific profile.
cp ~/.mozilla/firefox/*.default/cookies.sqlite "$cookie_jar_path"

# Get the cookies from the database
sqlite3 "$cookie_jar_path" \
       "SELECT name,value
        FROM moz_cookies
        WHERE baseDomain LIKE 'google.com'
        AND (
                name LIKE 'SID' OR
                name LIKE 'HSID' OR
                name LIKE 'SSID' OR
                (name LIKE 'OSID' AND host LIKE 'takeout.google.com')
        ) AND
        originAttributes LIKE '^userContextId=1'
        ORDER BY creationTime ASC;" | \
                # Reformat the output into Bash exports
                sed -e 's/|/=/' -e 's/^/export /' | \
                # Save the output into a temporary file
                tee "$source_path"

# Load the cookie values into environment variables
source "$source_path"

# Clean up
rm -f "$source_path"
rm -f "$cookie_jar_path"

Holen Sie sich Cookies von Google Chrome

Ich habe ein Skript für Linux- und möglicherweise MacOS-Benutzer, mit dem ich die Google Takeout-Cookies von Google Chrome abrufen und als Umgebungsvariablen exportieren kann. Das Skript geht davon aus, dass Python 3 venvverfügbar ist und das DefaultChrome-Profil https://takeout.google.com besuchte, während es angemeldet war.

Als Einzeiler:

if [ ! -d "$venv_path" ] ; then venv_path=$(mktemp -d) ; fi ; if [ ! -f "${venv_path}/bin/activate" ] ; then python3 -m venv "$venv_path" ; fi ; source "${venv_path}/bin/activate" ; python3 -c 'import pycookiecheat, dbus' ; if [ $? -ne 0 ] ; then pip3 install git+https://github.com/n8henrie/pycookiecheat@dev dbus-python ; fi ; source_path=$(mktemp) ; python3 -c 'import pycookiecheat, json; cookies = pycookiecheat.chrome_cookies("https://takeout.google.com") ; [print("export %s=%s;" % (key, cookies[key])) for key in ["SID", "HSID", "SSID", "OSID"]]' | tee "$source_path" ; source "$source_path" ; rm -f "$source_path" ; deactivate

Als schöneres Bash-Skript:

#!/bin/bash
# Extract Google Takeout cookies from Google Chrome and export them as envvars
#
# The browser must have visited https://takeout.google.com as an authenticated user.

# Warn the user if they didn't run the script with `source`
[[ "${BASH_SOURCE[0]}" == "${0}" ]] && \
       echo 'WARNING: You should source this script to ensure the resulting environment variables get set.'

# Create a path for the Chrome cookie extraction library
if [ ! -d "$venv_path" ]
then
       venv_path=$(mktemp -d)
fi

# Create a Python 3 venv, if it doesn't already exist
if [ ! -f "${venv_path}/bin/activate" ]
then
        python3 -m venv "$venv_path"

fi

# Enter the Python virtual environment
source "${venv_path}/bin/activate"

# Install dependencies, if they are not already installed
python3 -c 'import pycookiecheat, dbus'
if [ $? -ne 0 ]
then
        pip3 install git+https://github.com/n8henrie/pycookiecheat@dev dbus-python
fi

# Get the cookies from the database
source_path=$(mktemp)
read -r -d '' code << EOL
import pycookiecheat, json
cookies = pycookiecheat.chrome_cookies("https://takeout.google.com")
for key in ["SID", "HSID", "SSID", "OSID"]:
        print("export %s=%s" % (key, cookies[key]))
EOL
python3 -c "$code" | tee "$source_path"

# Clean up
source "$source_path"
rm -f "$source_path"
deactivate
[[ "${BASH_SOURCE[0]}" == "${0}" ]] && rm -rf "$venv_path"

Bereinigen Sie heruntergeladene Dateien:

rm -rf "$venv_path"

Archivierung anfordern

Dies ist noch nicht automatisiert. Das Skript muss das Google Takeout-Formular ausfüllen und dann senden.

Planen Sie die Erstellung des Archivs

Es gibt noch keine vollständig automatisierte Methode, aber im Mai 2019 hat Google Takeout eine Funktion eingeführt, die die Erstellung von 1 Backup alle 2 Monate für 1 Jahr (insgesamt 6 Backups) automatisiert. Dies muss im Browser unter https://takeout.google.com erfolgen, während das Archivierungsanforderungsformular ausgefüllt wird:

Google Takeout: Passen Sie das Archivformat an

Überprüfen Sie, ob das Archiv erstellt wurde

Dies ist noch nicht automatisiert. Wenn ein Archiv erstellt wurde, sendet Google manchmal eine E-Mail an den Google Mail-Posteingang des Nutzers. In meinen Tests geschieht dies jedoch nicht immer aus unbekannten Gründen.

Die einzige andere Möglichkeit, um zu überprüfen, ob ein Archiv erstellt wurde, besteht darin, Google Takeout regelmäßig abzufragen.

Archivliste abrufen

Ich habe einen Befehl, um dies zu tun, vorausgesetzt, dass die Cookies als Umgebungsvariablen im Abschnitt "Cookies abrufen" oben festgelegt wurden:

curl -sL -H "Cookie: SID=${SID}; HSID=${HSID}; SSID=${SSID}; OSID=${OSID};" \
'https://takeout.google.com/settings/takeout/downloads' | \
grep -Po '(?<=")https://storage\.cloud\.google\.com/[^"]+(?=")' | \
awk '!x[$0]++'

Die Ausgabe ist eine zeilenbegrenzte Liste von URLs, die zum Herunterladen aller verfügbaren Archive führen.
Es wird aus HTML mit Regex analysiert .

Laden Sie alle Archivdateien herunter

Hier ist der Code in Bash, mit dem die URLs der Archivdateien abgerufen und alle heruntergeladen werden können, vorausgesetzt, die Cookies wurden im obigen Abschnitt "Cookies abrufen" als Umgebungsvariablen festgelegt:

curl -sL -H "Cookie: SID=${SID}; HSID=${HSID}; SSID=${SSID}; OSID=${OSID};" \
'https://takeout.google.com/settings/takeout/downloads' | \
grep -Po '(?<=")https://storage\.cloud\.google\.com/[^"]+(?=")' | \
awk '!x[$0]++' | \
xargs -n1 -P1 -I{} curl -LOJ -C - -H "Cookie: SID=${SID}; HSID=${HSID}; SSID=${SSID}; OSID=${OSID};" {}

Ich habe es unter Linux getestet, aber die Syntax sollte auch mit macOS kompatibel sein.

Erklärung der einzelnen Teile:

  1. curl Befehl mit Authentifizierungs-Cookies:

    curl -sL -H "Cookie: SID=${SID}; HSID=${HSID}; SSID=${SSID}; OSID=${OSID};" \
  2. URL der Seite mit den Download-Links

    'https://takeout.google.com/settings/takeout/downloads' | \
  3. Nur Download-Links für Übereinstimmungen filtern

    grep -Po '(?<=")https://storage\.cloud\.google\.com/[^"]+(?=")' | \
  4. Filtern Sie doppelte Links heraus

    awk '!x[$0]++' \ |
  5. Laden Sie jede Datei in der Liste nacheinander herunter:

    xargs -n1 -P1 -I{} curl -LOJ -C - -H "Cookie: SID=${SID}; HSID=${HSID}; SSID=${SSID}; OSID=${OSID};" {}

    Hinweis: Das Parallelisieren der Downloads (Ändern -P1auf eine höhere Nummer) ist möglich, aber Google scheint alle Verbindungen bis auf eine zu drosseln.

    Hinweis: -C - Überspringt bereits vorhandene Dateien, setzt den Download für vorhandene Dateien jedoch möglicherweise nicht erfolgreich fort.

Verschlüsseln Sie heruntergeladene Archivdateien

Dies ist nicht automatisiert. Die Implementierung hängt davon ab, wie Sie Ihre Dateien verschlüsseln möchten. Der lokale Speicherplatzbedarf muss für jede zu verschlüsselnde Datei verdoppelt werden.

Laden Sie heruntergeladene Archivdateien in Dropbox hoch

Dies ist noch nicht automatisiert.

Laden Sie heruntergeladene Archivdateien in AWS S3 hoch

Dies ist noch nicht automatisiert, aber es sollte einfach darum gehen, die Liste der heruntergeladenen Dateien zu durchlaufen und einen Befehl wie den folgenden auszuführen:

aws s3 cp TAKEOUT_FILE "s3://MYBUCKET/Google Takeout/"
Deltik
quelle
0

Ich habe diese Frage gefunden, als ich gesucht habe, wie ich meine Google-Fotos beheben kann, die in Google Drive nicht richtig angezeigt werden (was ich bereits automatisch sichere!).

Damit Ihre Fotos in Google Drive angezeigt werden, gehen Sie zu https://photos.google.com , Einstellungen, und legen Sie fest, dass Fotos in einem Ordner auf dem Laufwerk angezeigt werden.

Verwenden Sie dann https://github.com/ncw/rclone , um Ihr gesamtes Google-Laufwerk (das jetzt Fotos als "normales" Verzeichnis enthält) in Ihren lokalen Speicher zu klonen.

djsmiley2k - CoW
quelle
rclone sieht gut aus und scheint ein ausgereiftes Projekt zu sein. Genau die Lösung, nach der ich gesucht habe.
Steampowered
Es ist wirklich sehr schön. Bei meinen vielen tausend Fotos dauert es nun eine Weile, bis sie durchgearbeitet sind. Ich frage mich, ob ich einfach alles blind herunterladen kann, anstatt nach Dupes zu suchen.
djsmiley2k - CoW