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 venv
tersedia dan Default
profil 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:
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:
curl
perintah dengan cookie otentikasi:
curl -sL -H "Cookie: SID=${SID}; HSID=${HSID}; SSID=${SSID}; OSID=${OSID};" \
URL halaman yang memiliki tautan unduhan
'https://takeout.google.com/settings/takeout/downloads' | \
Filter hanya cocok dengan tautan unduhan
grep -Po '(?<=")https://storage\.cloud\.google\.com/[^"]+(?=")' | \
Saring tautan rangkap
awk '!x[$0]++' \ |
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 -P1
ke 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/"