Jak zautomatyzować regularne kopie zapasowe Google Takeout w chmurze

42

Chciałbym tworzyć regularne kopie zapasowe Google Takeout (powiedzmy co 3 miesiące) i przechowywać je zaszyfrowane w innym magazynie w chmurze, takim jak DropBox lub S3.

Nie musi to być rozwiązanie chmurowe, choć preferowane. Nie musi być w 100% zautomatyzowany, jednak im więcej, tym lepiej.

Z góry dziękuję za wszelkie pomysły.

Michał Šrajer
źródło

Odpowiedzi:

2

Zamiast bezpośrednich interfejsów API do tworzenia kopii zapasowych Google Takeout (co wydaje się prawie niemożliwe do wykonania na teraz), możesz wykonać kopię zapasową swoich danych na zewnętrznych rozwiązaniach do przechowywania danych za pośrednictwem Dysku Google. Wiele usług Google zezwala na tworzenie kopii zapasowych na Dysku Google, a możesz tworzyć kopie zapasowe Dysku Google za pomocą następujących narzędzi:

GoogleCL - GoogleCL przenosi usługi Google do wiersza polecenia.

gdatacopier - Narzędzia do zarządzania dokumentami z linii poleceń dla dokumentów Google.

FUSE Google Drive - system plików użytkownika FUSE dla Dysku Google, napisany w C.

Grive - Niezależna implementacja klienta Dysku Google typu open source. Używa interfejsu API Google Document List do komunikowania się z serwerami w Google. Kod jest napisany w C ++.

gdrive-cli - Interfejs wiersza poleceń dla GDrive. Korzysta z interfejsu API GDrive, a nie interfejsu API GDocs, co jest interesujące. Aby z niego skorzystać, musisz zarejestrować aplikację chrome. Musi być przynajmniej zainstalowany przez Ciebie, ale nie musi być publikowany. W repozytorium znajduje się aplikacja typu plateplate, której można użyć jako punktu wyjścia.

przykład bezpiecznika python - Zawiera niektóre slajdy i przykłady systemów plików FUSE Pythona.

Większość z nich wydaje się znajdować w repozytoriach Ubuntu. Sam korzystałem z Fuse, gdrive i GoogleCL i wszystkie działają dobrze. W zależności od pożądanego poziomu kontroli będzie to naprawdę łatwe lub bardzo złożone. To zależy od Ciebie. Powinno to być łatwe do zrobienia z serwera EC2 / S3. Po prostu znajdź polecenia jeden po drugim, aby uzyskać wszystko, czego potrzebujesz i umieść je w skrypcie w zadaniu cron.

Jeśli nie chcesz tak ciężko pracować, możesz także skorzystać z usługi takiej jak Spinbackup . Jestem pewien, że są inne równie dobre, ale nie próbowałem żadnych.

krowe
źródło
20
Google wynos to najlepsze narzędzie do tego, ponieważ obsługuje więcej usług niż te inne narzędzia. Pytanie jest poprawne.
jl6
6
@krowe: Twoja odpowiedź jest naprawdę przydatna, niezależnie od tego, czy dotyczy tylko dysku Google. Google takeout umożliwia pobranie wszystkich danych z 25 różnych usług Google, nie tylko z dysku Google.
Bjarke Freund-Hansen,
@ BjarkeFreund-Hansen 1) Wiele z tych 25 usług można zapisać w GDrive i utworzyć ich kopię zapasową automatycznie w ramach automatycznej kopii zapasowej GDrive. 2) Większość pozostałych usług nie ma sensu tworzyć kopii zapasowych (+ 1s, kółka itp.) Lub nie działa (kod Google). 3) Mam dość wyjaśniania tego ludziom, którzy nie mają lepszej odpowiedzi. Jestem całkiem pewien, że nie ma sposobu na zautomatyzowanie wynos (oprócz używania makr po stronie klienta, które i tak nie są zbyt wiarygodne). 4) Jeśli możesz udowodnić, że się mylę, opublikuj swoje lepsze rozwiązanie i możemy porozmawiać. Jeśli nie, zapoznaj się z moim poprzednim komentarzem na ten sam temat.
krowe
6
@krowe: Gmail, Kalendarz, Kontakty, Zdjęcia, Historia Hangoutów i Historia lokalizacji to usługi, z których często korzystam i które chciałbym zabezpieczyć przed utratą danych w Google. Żadne z danych tych usług nie są zawarte na dysku Google. Tylko dlatego, że nie znam lepszego rozwiązania lub w ogóle istnieje jedno, nie sprawia, że ​​odpowiadasz bardziej poprawnie. Ponownie nie twierdzę, że odpowiedź jest zła, po prostu nie odpowiada na rzeczywiste pytanie.
Bjarke Freund-Hansen
@ BjarkeFreund-Hansen Rozumiem twoją frustrację i niektóre z tych usług MOGĄ zostać zsynchronizowane z twoją GDrive (więc będą tworzyć kopie zapasowe wraz z nią). Na przykład Zdjęcia Google mogą to zrobić: Kopie zapasowe zdjęć . Uważam, że kalendarz i kontakty można synchronizować w ten sam sposób. Można również wykonać kopię zapasową Gmaila : Kopia zapasowa Gmaila . Innych rzeczy, o których wspominasz, o których nie wiem, ale to głównie dlatego, że osobiście nie zawracałbym sobie głowy ich tworzeniem.
krowe
2

To częściowa odpowiedź z częściową automatyzacją. Może przestać działać w przyszłości, jeśli Google zdecyduje się na zautomatyzowany dostęp do Google Takeout. Funkcje obecnie obsługiwane w tej odpowiedzi:

+ --------------------------------------------- + --- --------- + --------------------- +
| Funkcja automatyzacji | Zautomatyzowany? | Obsługiwane platformy |
+ --------------------------------------------- + --- --------- + --------------------- +
| Logowanie do konta Google | Nie | |
| Pobierz pliki cookie z Mozilla Firefox | Tak | Linux |
| Pobierz pliki cookie z Google Chrome | Tak | Linux, macOS |
| Poproś o utworzenie archiwum | Nie | |
| Zaplanuj tworzenie archiwum | Rodzaj | Witryna na wynos |
| Sprawdź, czy archiwum jest utworzone | Nie | |
| Pobierz listę archiwów | Tak | Międzyplatformowy |
| Pobierz wszystkie pliki archiwów | Tak | Linux, macOS |
| Szyfruj pobrane pliki archiwów | Nie | |
| Prześlij pobrane pliki archiwum do Dropbox | Nie | |
| Prześlij pobrane pliki archiwów do AWS S3 | Nie | |
+ --------------------------------------------- + --- --------- + --------------------- +

Po pierwsze, rozwiązanie typu chmura do chmury nie może naprawdę działać, ponieważ nie ma interfejsu między Google Takeout a żadnym znanym dostawcą obiektów do przechowywania danych. Musisz przetworzyć pliki kopii zapasowej na własnym komputerze (który może być przechowywany w chmurze publicznej, jeśli chcesz) przed wysłaniem ich do dostawcy przechowywania obiektów.

Po drugie, ponieważ nie ma interfejsu API Google Takeout, skrypt automatyzacji musi udawać użytkownika z przeglądarką, aby przejść przez proces tworzenia i pobierania archiwum Google Takeout.


Funkcje automatyzacji

Logowanie do konta Google

To nie jest jeszcze zautomatyzowane. Skrypt musiałby udawać przeglądarkę i poruszać się po możliwych przeszkodach, takich jak uwierzytelnianie dwuskładnikowe, CAPTCHA i inne zwiększone zabezpieczenia.

Pobierz pliki cookie z Mozilla Firefox

Mam skrypt dla użytkowników systemu Linux, aby pobrać pliki cookie Google Takeout z Mozilla Firefox i wyeksportować je jako zmienne środowiskowe. Aby to zadziałało, powinien istnieć tylko jeden profil Firefox, a profil musi odwiedzać https://takeout.google.com po zalogowaniu.

Jako jedna linijka:

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"

Jako ładniejszy skrypt Bash:

#!/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"

Pobierz pliki cookie z Google Chrome

Mam skrypt dla systemu Linux i prawdopodobnie użytkowników systemu macOS, aby pobrać pliki cookie Google Takeout z Google Chrome i wyeksportować je jako zmienne środowiskowe. Skrypt działa przy założeniu, że Python 3 venvjest dostępny, a Defaultprofil Chrome odwiedził https://takeout.google.com po zalogowaniu.

Jako jedna linijka:

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

Jako ładniejszy skrypt Bash:

#!/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"

Oczyść pobrane pliki:

rm -rf "$venv_path"

Poproś o utworzenie archiwum

To nie jest jeszcze zautomatyzowane. Skrypt musiałby wypełnić formularz Google Takeout, a następnie go przesłać.

Zaplanuj tworzenie archiwum

Nie ma jeszcze w pełni zautomatyzowanego sposobu, aby to zrobić, ale w maju 2019 r. Google Takeout wprowadził funkcję, która automatyzuje tworzenie 1 kopii zapasowej co 2 miesiące przez 1 rok (łącznie 6 kopii zapasowych). Należy to zrobić w przeglądarce na stronie https://takeout.google.com , wypełniając formularz wniosku o archiwum:

Google Takeout: Dostosuj format archiwum

Sprawdź, czy archiwum jest utworzone

To nie jest jeszcze zautomatyzowane. Jeśli zostało utworzone archiwum, Google czasami wysyła wiadomość e-mail do skrzynki odbiorczej Gmaila użytkownika, ale w moich testach nie zawsze dzieje się tak z nieznanych przyczyn.

Jedynym innym sposobem sprawdzenia, czy archiwum zostało utworzone, jest okresowe odpytywanie Google Takeout.

Pobierz listę archiwów

Mam polecenie, aby to zrobić, zakładając, że pliki cookie zostały ustawione jako zmienne środowiskowe w sekcji „Pobierz pliki cookie” powyżej:

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]++'

Dane wyjściowe to rozdzielana wierszami lista adresów URL, które prowadzą do pobierania wszystkich dostępnych archiwów.
Jest analizowany z HTML za pomocą wyrażenia regularnego .

Pobierz wszystkie pliki archiwów

Oto kod w Bash, aby uzyskać adresy URL plików archiwów i pobrać je wszystkie, zakładając, że pliki cookie zostały ustawione jako zmienne środowiskowe w sekcji „Pobierz pliki cookie” powyżej:

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};" {}

Przetestowałem to na Linuksie, ale składnia również powinna być kompatybilna z macOS.

Objaśnienie każdej części:

  1. curl polecenie z uwierzytelniającymi plikami cookie:

    curl -sL -H "Cookie: SID=${SID}; HSID=${HSID}; SSID=${SSID}; OSID=${OSID};" \
  2. Adres URL strony z linkami do pobrania

    'https://takeout.google.com/settings/takeout/downloads' | \
  3. Filtruj dopasowania tylko linki do pobrania

    grep -Po '(?<=")https://storage\.cloud\.google\.com/[^"]+(?=")' | \
  4. Odfiltruj duplikaty linków

    awk '!x[$0]++' \ |
  5. Pobierz każdy plik z listy, jeden po drugim:

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

    Uwaga: Równoległe pobieranie (zmiana -P1na wyższą liczbę) jest możliwe, ale Google zdaje się ograniczać wszystkie połączenia oprócz jednego.

    Uwaga: -C - pomija pliki, które już istnieją, ale może nie zostać pomyślnie wznowione pobieranie istniejących plików.

Szyfruj pobrane pliki archiwów

To nie jest zautomatyzowane. Implementacja zależy od tego, jak chcesz szyfrować pliki, a zużycie lokalnego miejsca na dysku musi zostać podwojone dla każdego szyfrowanego pliku.

Prześlij pobrane pliki archiwów do Dropbox

To nie jest jeszcze zautomatyzowane.

Prześlij pobrane pliki archiwów do AWS S3

Nie jest to jeszcze zautomatyzowane, ale powinno po prostu polegać na iteracji listy pobranych plików i uruchomieniu polecenia takiego jak:

aws s3 cp TAKEOUT_FILE "s3://MYBUCKET/Google Takeout/"
Deltik
źródło
0

Znalazłem to pytanie podczas wyszukiwania, jak naprawić moje zdjęcia google, które nie wyświetlają się poprawnie na dysku google (które już automatycznie tworzę kopię zapasową!).

Tak więc, aby Twoje zdjęcia pojawiały się na dysku Google, przejdź do https://photos.google.com , ustawień i ustaw je tak, aby wyświetlały zdjęcia w folderze na dysku.

Następnie użyj https://github.com/ncw/rclone, aby sklonować cały dysk google (który teraz zawiera zdjęcia jako „normalny” katalog) do lokalnego magazynu.

djsmiley2k - CoW
źródło
rclone wygląda świetnie, wydaje się dojrzałym projektem. Właśnie rozwiązanie, którego szukałem.
steampowered
To naprawdę NAPRAWDĘ fajnie. choć moje tysiące zdjęć zajmuje teraz chwilę, żeby je przejrzeć. Zastanawiam się, czy mogę po prostu ślepo pobrać wszystko, zamiast sprawdzać duplikaty.
djsmiley2k - CoW