Cómo automatizar las copias de seguridad regulares de Google Takeout para el almacenamiento en la nube

42

Me gustaría crear Google Takeout regular copias de seguridad (digamos cada 3 meses) y almacenarlas encriptadas en algún otro almacenamiento en la nube como DropBox o S3.

No tiene que ser una solución de nube a nube, aunque es preferible. No tiene que ser 100% automatizado, sin embargo, cuanto más mejor.

Gracias de antemano por cualquier idea.

Michał Šrajer
fuente

Respuestas:

2

En lugar de las API directas para hacer una copia de seguridad de Google Takeout (que parece ser casi imposible de hacer a partir de ahora), puede hacer una copia de seguridad de sus datos en soluciones de almacenamiento de terceros a través de Google Drive. Muchos servicios de Google permiten hacer copias de seguridad en Google Drive, y usted puede hacer copias de seguridad de Google Drive utilizando las siguientes herramientas:

GoogleCL : GoogleCL lleva los servicios de Google a la línea de comando.

gdatacopier : utilidades de administración de documentos de línea de comandos para documentos de Google.

FUSE Google Drive : un sistema de archivos de espacio de usuario FUSE para Google Drive, escrito en C.

Grive : una implementación independiente de código abierto de un cliente de Google Drive. Utiliza la API de Lista de documentos de Google para comunicarse con los servidores de Google. El código está escrito en C ++.

gdrive-cli : una interfaz de línea de comandos para GDrive. Esto utiliza la API de GDrive, no la API de GDocs, que es interesante. Para usarlo, debe registrar una aplicación de Chrome. Debe ser al menos instalable por usted, pero no necesita ser publicado. Hay una aplicación repetitiva en el repositorio que puede usar como punto de partida.

Ejemplo de python-fuse : contiene algunas diapositivas y ejemplos de sistemas de archivos Python FUSE.

La mayoría de estos parecen estar en los repositorios de Ubuntu. Yo mismo he usado Fuse, gdrive y GoogleCL y todos funcionan bien. Dependiendo del nivel de control que desee, esto será realmente fácil o realmente complejo. Eso depende de usted. Debe ser sencillo hacerlo desde un servidor EC2 / S3. Simplemente calcule los comandos uno por uno para todo lo que necesita y póngalo en un script en un trabajo cron.

Si no quieres trabajar tan duro, también puedes usar un servicio como Spinbackup . Estoy seguro de que hay otros igual de buenos, pero no he probado ninguno.

krowe
fuente
20
Google Takeout es la mejor herramienta para esto porque admite más servicios que estas otras herramientas. La pregunta es válida.
jl6
66
@krowe: Su respuesta es realmente útil, sin embargo, solo se relaciona con Google Drive. Google Takeout le permite descargar todos sus datos de 25 servicios diferentes de Google, no solo Google Drive.
Bjarke Freund-Hansen
@ BjarkeFreund-Hansen 1) Muchos de esos 25 servicios se pueden guardar en GDrive y realizar copias de seguridad automáticamente como parte de una copia de seguridad automática de GDrive. 2) La mayoría de los servicios restantes no tienen sentido para hacer copias de seguridad (+ 1s, círculos, etc.) o caducan (Código de Google). 3) Estoy cansado de explicar esto a las personas que no tienen una mejor respuesta. Estoy bastante seguro de que no hay forma de automatizar la extracción (aparte de usar macros del lado del cliente; que de todos modos no son muy confiables). 4) Si puede demostrar que estoy equivocado, publique su mejor solución y podemos hablar. De lo contrario, consulte mi comentario anterior sobre este mismo problema.
krowe
66
@krowe: Gmail, Calendario, Contactos, Fotos, Historial de Hangouts e Historial de ubicaciones son servicios que uso ampliamente y me gustaría asegurar contra la pérdida de datos en Google. Ninguno de los datos de esos servicios están incluidos en Google Drive. El hecho de que no conozca una solución mejor, o que exista una, no hace que responda más correctamente. Nuevamente, no estoy diciendo que su respuesta sea mala, simplemente no responde a la pregunta real.
Bjarke Freund-Hansen
@ BjarkeFreund-Hansen Entiendo su frustración y algunos de esos servicios PUEDEN sincronizarse con su GDrive (para que lo respalden). Por ejemplo, Google Photos puede hacer eso: Copia de seguridad de fotos . Creo que Calendario y Contactos se pueden sincronizar de la misma manera. GMail también puede ser respaldado: Backup GMail . Las otras cosas que mencionas no las conozco, pero eso es principalmente porque personalmente no me molestaría en respaldarlas de todos modos.
krowe
2

Esta es una respuesta parcial con automatización parcial. Puede dejar de funcionar en el futuro si Google decide tomar medidas enérgicas contra el acceso automático a Google Takeout. Características actualmente admitidas en esta respuesta:

+ --------------------------------------------- + --- --------- + --------------------- +
El | Característica de automatización | Automatizado? El | Plataformas compatibles |
+ --------------------------------------------- + --- --------- + --------------------- +
El | Acceso a la cuenta de Google | No | El |
El | Obtenga cookies de Mozilla Firefox | Sí | Linux |
El | Obtenga cookies de Google Chrome | Sí | Linux, macOS |
El | Solicitar creación de archivo | No | El |
El | Programar creación de archivo | Un poco | Sitio web para llevar |
El | Compruebe si se crea el archivo | No | El |
El | Obtener lista de archivos | Sí | Multiplataforma |
El | Descargar todos los archivos | Sí | Linux, macOS |
El | Cifrar archivos descargados | No | El |
El | Subir archivos descargados a Dropbox | No | El |
El | Cargue archivos descargados en AWS S3 | No | El |
+ --------------------------------------------- + --- --------- + --------------------- +

En primer lugar, una solución de nube a nube realmente no puede funcionar porque no hay una interfaz entre Google Takeout y cualquier proveedor de almacenamiento de objetos conocido. Debe procesar los archivos de copia de seguridad en su propia máquina (que podría alojarse en la nube pública, si lo desea) antes de enviarlos a su proveedor de almacenamiento de objetos.

En segundo lugar, como no hay una API de Google Takeout, un script de automatización debe pretender ser un usuario con un navegador para recorrer el flujo de creación y descarga de archivos de Google Takeout.


Funciones de automatización

Acceso a la cuenta de Google

Esto aún no está automatizado. El script necesitaría pretender ser un navegador y navegar posibles obstáculos como la autenticación de dos factores, CAPTCHA y otras pruebas de seguridad mejoradas.

Obtener cookies de Mozilla Firefox

Tengo un script para que los usuarios de Linux tomen las cookies de Google Takeout de Mozilla Firefox y las exporten como variables de entorno. Para que esto funcione, solo debe haber un perfil de Firefox, y el perfil debe haber visitado https://takeout.google.com al iniciar sesión.

Como una línea:

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"

Como un script de Bash más bonito:

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

Obtenga cookies de Google Chrome

Tengo un script para Linux y posiblemente usuarios de macOS para tomar las cookies de Google Takeout de Google Chrome y exportarlas como variables de entorno. El script funciona asumiendo que Python 3 venvestá disponible y que el Defaultperfil de Chrome visitó https://takeout.google.com mientras estaba conectado.

Como una línea:

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

Como un script de Bash más bonito:

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

Limpia los archivos descargados:

rm -rf "$venv_path"

Solicitar creación de archivo

Esto aún no está automatizado. El script debería completar el formulario Google Takeout y luego enviarlo.

Programar creación de archivo

Todavía no existe una forma totalmente automatizada de hacerlo, pero en mayo de 2019, Google Takeout introdujo una función que automatiza la creación de 1 copia de seguridad cada 2 meses durante 1 año (6 copias de seguridad en total). Esto debe hacerse en el navegador en https://takeout.google.com mientras completa el formulario de solicitud de archivo:

Google Takeout: personaliza el formato de archivo

Compruebe si se crea el archivo

Esto aún no está automatizado. Si se creó un archivo, Google a veces envía un correo electrónico a la bandeja de entrada de Gmail del usuario, pero en mis pruebas, esto no siempre sucede por razones desconocidas.

La única otra forma de verificar si se ha creado un archivo es sondeando Google Takeout periódicamente.

Obtener lista de archivo

Tengo un comando para hacer esto, suponiendo que las cookies se hayan configurado como variables de entorno en la sección "Obtener cookies" anterior:

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

El resultado es una lista delimitada por líneas de URL que conducen a descargas de todos los archivos disponibles.
Se analiza desde HTML con regex .

Descargar todos los archivos

Aquí está el código en Bash para obtener las URL de los archivos y descargarlos todos, suponiendo que las cookies se hayan configurado como variables de entorno en la sección "Obtener cookies" anterior:

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

Lo probé en Linux, pero la sintaxis también debería ser compatible con macOS.

Explicación de cada parte:

  1. curl comando con cookies de autenticación:

    curl -sL -H "Cookie: SID=${SID}; HSID=${HSID}; SSID=${SSID}; OSID=${OSID};" \
  2. URL de la página que tiene los enlaces de descarga

    'https://takeout.google.com/settings/takeout/downloads' | \
  3. Filtrar coincidencias solo enlaces de descarga

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

    awk '!x[$0]++' \ |
  5. Descargue cada archivo de la lista, uno por uno:

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

    Nota:-P1 es posible poner en paralelo las descargas (cambiar a un número mayor), pero Google parece limitar todas las conexiones menos una.

    Nota: -C - omite los archivos que ya existen, pero es posible que no reanude correctamente las descargas de los archivos existentes.

Cifrar archivos descargados

Esto no está automatizado. La implementación depende de cómo desee cifrar sus archivos, y el consumo de espacio en disco local debe duplicarse para cada archivo que está cifrando.

Subir archivos descargados a Dropbox

Esto aún no está automatizado.

Subir archivos descargados a AWS S3

Esto aún no está automatizado, pero debería ser simplemente una cuestión de iterar sobre la lista de archivos descargados y ejecutar un comando como:

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

Encontré esta pregunta mientras buscaba cómo solucionar que mis fotos de Google no se mostraran correctamente en Google Drive (¡lo cual ya estoy haciendo copias de seguridad automáticamente!).

Entonces, para que sus fotos se muestren en Google Drive, vaya a https://photos.google.com , configuración y configúrelo para mostrar fotos en una carpeta en Drive.

Luego use https://github.com/ncw/rclone para clonar toda su unidad de Google (que ahora incluye fotos como un directorio 'normal') en su almacenamiento local.

djsmiley2k - Vaca
fuente
rclone se ve muy bien, parece un proyecto maduro. Justo la solución que estaba buscando.
impulsado por vapor
Es realmente REALMENTE agradable. Aunque con mis miles de fotos ahora me toma un tiempo atravesarlas. Me pregunto si puedo hacer que descargue ciegamente todo, en lugar de buscar engaños.
djsmiley2k - CoW