Cara mengotomatiskan cadangan Google Takeout reguler ke penyimpanan cloud

42

Saya ingin membuat cadangan Google Takeout reguler (misalkan setiap 3 bulan) dan menyimpannya dienkripsi di beberapa penyimpanan cloud lain seperti DropBox atau S3.

Itu tidak harus menjadi solusi cloud-to-cloud, meskipun lebih disukai. Tidak harus 100% terotomatisasi, namun semakin banyak semakin baik.

Terima kasih sebelumnya atas ide.

Michał Šrajer
sumber

Jawaban:

2

Alih-alih API Langsung untuk mencadangkan Google Takeout (yang tampaknya hampir mustahil dilakukan seperti sekarang), Anda dapat mencadangkan data Anda ke solusi penyimpanan pihak ketiga melalui Google Drive. Banyak layanan Google memungkinkan pencadangan ke Google Drive, dan Anda dapat mencadangkan Google Drive menggunakan alat berikut:

GoogleCL - GoogleCL membawa layanan Google ke baris perintah.

gdatacopier - Utilitas manajemen dokumen baris perintah untuk Google docs.

FUSE Google Drive - Sistem file ruang-pengguna FUSE untuk Google Drive, ditulis dalam C.

Grive - Implementasi sumber terbuka independen dari klien Google Drive. Ini menggunakan API Daftar Dokumen Google untuk berbicara dengan server di Google. Kode ditulis dalam C ++.

gdrive-cli - Antarmuka baris perintah untuk GDrive. Ini menggunakan API GDrive, bukan API GDocs, yang menarik. Untuk menggunakannya, Anda harus mendaftarkan aplikasi chrome. Paling tidak harus diinstal oleh Anda, tetapi tidak perlu dipublikasikan. Ada aplikasi boilerplate di repo yang dapat Anda gunakan sebagai titik awal.

python-fuse example - Berisi beberapa slide dan contoh sistem file Python FUSE.

Sebagian besar dari ini tampaknya berada di repositori Ubuntu. Saya telah menggunakan Fuse, gdrive dan GoogleCL sendiri dan semuanya bekerja dengan baik. Tergantung pada tingkat kontrol yang Anda inginkan, ini akan sangat mudah atau sangat kompleks. Terserah kamu. Itu harus langsung dilakukan dari server EC2 / S3. Cukup tentukan perintah satu per satu untuk semua yang Anda butuhkan dan letakkan dalam skrip pada tugas cron.

Jika Anda tidak ingin bekerja terlalu keras, Anda juga bisa menggunakan layanan seperti Spinbackup . Saya yakin ada orang lain yang sama baiknya tetapi saya belum mencobanya.

Krowe
sumber
20
Google takeout adalah alat terbaik untuk ini karena mendukung lebih banyak layanan daripada alat lainnya. Pertanyaannya valid.
jl6
6
@krowe: Jawaban Anda sangat berguna, namun itu hanya terkait dengan google drive. Google takeout memungkinkan Anda mengunduh semua data Anda dari 25 layanan Google yang berbeda, bukan hanya Google drive.
Bjarke Freund-Hansen
@ BjarkeFreund-Hansen 1) Banyak dari 25 layanan tersebut dapat disimpan ke GDrive dan dicadangkan secara otomatis sebagai bagian dari cadangan GDrive otomatis. 2) Sebagian besar layanan yang tersisa tidak ada gunanya untuk dicadangkan (+1, Lingkaran, dll) atau tidak berfungsi (Google Code). 3) Saya lelah menjelaskan hal ini kepada orang-orang yang tidak memiliki jawaban yang lebih baik. Saya cukup yakin bahwa tidak ada cara untuk mengotomatisasi takeout (selain menggunakan makro sisi klien; yang toh tidak terlalu dapat diandalkan). 4) Jika Anda dapat membuktikan saya salah, kirimkan solusi yang lebih baik dan kami dapat berbicara. Jika tidak, lihat komentar saya sebelumnya tentang masalah yang sama.
krowe
6
@krowe: Gmail, Kalender, Kontak, Foto, riwayat Hangout, dan Riwayat lokasi adalah layanan yang saya gunakan secara luas dan ingin memastikan terhadap hilangnya data di Google. Tidak satu pun dari data layanan tersebut yang disertakan dalam Google drive. Hanya karena saya tidak tahu solusi yang lebih baik, atau ada sama sekali, tidak membuat Anda menjawab lebih benar. Sekali lagi, saya tidak mengatakan bahwa jawaban Anda buruk, itu hanya tidak menjawab pertanyaan yang sebenarnya.
Bjarke Freund-Hansen
@ BjarkeFreund-Hansen Saya memahami frustrasi Anda dan beberapa layanan tersebut BISA disinkronkan dengan GDrive Anda (sehingga mereka akan membuat cadangan bersama dengan itu). Misalnya, Foto Google dapat melakukannya: Cadangkan Foto . Saya percaya bahwa Kalender dan Kontak dapat disinkronkan dengan cara yang sama. GMail juga dapat didukung: Cadangan GMail . Hal-hal lain yang Anda sebutkan tidak saya ketahui tetapi itu terutama karena saya pribadi tidak akan repot-repot mendukungnya.
krowe
2

Ini adalah jawaban parsial dengan otomatisasi parsial. Mungkin berhenti bekerja di masa depan jika Google memilih untuk menindak akses otomatis ke Google Takeout. Fitur yang saat ini didukung dalam jawaban ini:

+ --------------------------------------------- + --- --------- + --------------------- +
| Fitur Otomasi | Otomatis? | Platform yang Didukung |
+ --------------------------------------------- + --- --------- + --------------------- +
| Akun Google masuk | Tidak | |
| Dapatkan cookie dari Mozilla Firefox | Ya | Linux |
| Dapatkan cookie dari Google Chrome | Ya | Linux, macOS |
| Minta pembuatan arsip | Tidak | |
| Jadwalkan pembuatan arsip | Agak | Situs web Bawa Pulang |
| Periksa apakah arsip dibuat | Tidak | |
| Dapatkan daftar arsip | Ya | Lintas-platform |
| Unduh semua file arsip | Ya | Linux, macOS |
| Enkripsi file arsip yang diunduh | Tidak | |
| Unggah file arsip yang diunduh ke Dropbox | Tidak | |
| Unggah file arsip yang diunduh ke AWS S3 | Tidak | |
+ --------------------------------------------- + --- --------- + --------------------- +

Pertama, solusi cloud-to-cloud tidak bisa benar-benar berfungsi karena tidak ada antarmuka antara Google Takeout dan penyedia penyimpanan objek yang dikenal. Anda harus memproses file cadangan di mesin Anda sendiri (yang dapat di-host di cloud publik, jika Anda mau) sebelum mengirimnya ke penyedia penyimpanan objek Anda.

Kedua, karena tidak ada Google Takeout API, skrip otomatisasi perlu berpura-pura menjadi pengguna dengan browser untuk berjalan melalui pembuatan dan aliran pengunduhan arsip Google Takeout.


Fitur Otomasi

Masuk Akun Google

Ini belum otomatis. Skrip harus berpura-pura sebagai browser dan menavigasi rintangan yang mungkin terjadi seperti otentikasi dua faktor, CAPTCHA, dan penyaringan keamanan lainnya yang ditingkatkan.

Dapatkan cookie dari Mozilla Firefox

Saya memiliki skrip untuk pengguna Linux untuk mengambil cookie Google Takeout dari Mozilla Firefox dan mengekspornya sebagai variabel lingkungan. Agar ini berfungsi, seharusnya hanya ada satu profil Firefox, dan profil tersebut harus telah mengunjungi https://takeout.google.com saat login.

Sebagai one-liner:

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"

Sebagai skrip Bash yang lebih cantik:

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

Dapatkan cookie dari Google Chrome

Saya memiliki skrip untuk Linux dan mungkin pengguna macOS untuk mengambil cookie Google Takeout dari Google Chrome dan mengekspornya sebagai variabel lingkungan. Skrip berfungsi dengan asumsi bahwa Python 3 venvtersedia dan Defaultprofil Chrome dikunjungi https://takeout.google.com saat masuk.

Sebagai one-liner:

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

Sebagai skrip Bash yang lebih cantik:

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

Bersihkan file yang diunduh:

rm -rf "$venv_path"

Minta pembuatan arsip

Ini belum otomatis. Script harus mengisi formulir Google Takeout dan kemudian mengirimkannya.

Jadwalkan pembuatan arsip

Belum ada cara yang sepenuhnya otomatis untuk melakukan ini, tetapi pada Mei 2019, Google Takeout memperkenalkan fitur yang mengotomatiskan pembuatan 1 cadangan setiap 2 bulan selama 1 tahun (total 6 cadangan). Ini harus dilakukan di browser di https://takeout.google.com saat mengisi formulir permintaan arsip:

Google Takeout: Kustomisasi format arsip

Periksa apakah arsip dibuat

Ini belum otomatis. Jika arsip telah dibuat, Google terkadang mengirim email ke kotak masuk Gmail pengguna, tetapi dalam pengujian saya, ini tidak selalu terjadi karena alasan yang tidak diketahui.

Satu-satunya cara lain untuk memeriksa apakah arsip telah dibuat adalah dengan mem-polling Google Takeout secara berkala.

Dapatkan daftar arsip

Saya memiliki perintah untuk melakukan ini, dengan asumsi bahwa cookie telah ditetapkan sebagai variabel lingkungan di bagian "Dapatkan cookie" di atas:

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

Outputnya adalah daftar URL yang dibatasi garis yang mengarah ke unduhan semua arsip yang tersedia.
Itu diuraikan dari HTML dengan regex .

Unduh semua file arsip

Berikut adalah kode di Bash untuk mendapatkan URL file arsip dan unduh semuanya, dengan asumsi cookie telah ditetapkan sebagai variabel lingkungan di bagian "Dapatkan cookie" di atas:

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

Saya sudah mengujinya di Linux, tetapi sintaksnya juga harus kompatibel dengan macOS.

Penjelasan setiap bagian:

  1. curl perintah dengan cookie otentikasi:

    curl -sL -H "Cookie: SID=${SID}; HSID=${HSID}; SSID=${SSID}; OSID=${OSID};" \
  2. URL halaman yang memiliki tautan unduhan

    'https://takeout.google.com/settings/takeout/downloads' | \
  3. Filter hanya cocok dengan tautan unduhan

    grep -Po '(?<=")https://storage\.cloud\.google\.com/[^"]+(?=")' | \
  4. Saring tautan rangkap

    awk '!x[$0]++' \ |
  5. Unduh setiap file dalam daftar, satu per satu:

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

    Catatan: Memparalelkan unduhan (mengubah -P1ke jumlah yang lebih tinggi) dimungkinkan, tetapi Google tampaknya mencekik semua kecuali satu koneksi.

    Catatan: -C - melompati file yang sudah ada, tetapi mungkin tidak berhasil melanjutkan unduhan untuk file yang ada.

Enkripsi file arsip yang diunduh

Ini tidak otomatis. Implementasinya tergantung pada bagaimana Anda ingin mengenkripsi file Anda, dan konsumsi ruang disk lokal harus digandakan untuk setiap file yang Anda enkripsi.

Unggah file arsip yang diunduh ke Dropbox

Ini belum otomatis.

Unggah file arsip yang diunduh ke AWS S3

Ini belum terotomatisasi, tetapi seharusnya hanya soal pengulangan daftar file yang diunduh dan menjalankan perintah seperti:

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

Saya menemukan pertanyaan ini ketika mencari cara memperbaiki foto google saya tidak muncul dengan benar di google drive (yang saya sudah secara otomatis membuat cadangan!).

Jadi, untuk membuat foto Anda muncul di google drive, buka https://photos.google.com , setting dan atur untuk menampilkan foto di folder dalam drive.

Kemudian gunakan https://github.com/ncw/rclone untuk mengkloning seluruh google drive Anda (yang sekarang menyertakan foto sebagai direktori 'normal') ke penyimpanan lokal Anda.

djsmiley2k - Kontrak Karya
sumber
rclone tampak hebat, sepertinya proyek yang matang. Hanya solusi yang saya cari.
dikemudikan
Ini benar-benar SANGAT bagus. tho dengan ribuan foto saya sekarang butuh beberapa saat untuk mengacak-acaknya. Saya bertanya-tanya apakah saya bisa membuatnya membutakan segalanya secara membabi buta, daripada memeriksa dupes.
djsmiley2k - Kontrak Karya