Como automatizar backups regulares do Google Takeout para armazenamento em nuvem


42

Gostaria de criar backups regulares do Google Takeout (digamos a cada 3 meses) e armazená-los criptografados em outros armazenamentos na nuvem, como DropBox ou S3.

Não precisa ser uma solução de nuvem para nuvem, apesar de preferida. Não precisa ser 100% automatizado; no entanto, quanto mais, melhor.

Agradecemos antecipadamente por todas as idéias.

Respostas:


2

Em vez de APIs diretas para fazer backup do Google Takeout (o que parece ser quase impossível a partir de agora), você pode fazer backup de seus dados em soluções de armazenamento de terceiros via Google Drive. Muitos serviços do Google permitem backup no Google Drive, e você pode fazer o backup do Google Drive usando as seguintes ferramentas:

GoogleCL - GoogleCL traz serviços do Google para a linha de comando.

gdatacopier - Utilitários de gerenciamento de documentos de linha de comando para documentos do Google.

FUSE Google Drive - Um sistema de arquivos do espaço do usuário do FUSE para o Google Drive, escrito em C.

Grive - uma implementação de código aberto independente de um cliente do Google Drive. Ele usa a API da lista de documentos do Google para conversar com os servidores no Google. O código está escrito em C ++.

gdrive-cli - Uma interface de linha de comando para o GDrive. Isso usa a API GDrive, não a API GDocs, o que é interessante. Para usá-lo, você precisa registrar um aplicativo chrome. Deve ser pelo menos instalável por você, mas não precisa ser publicado. Há um aplicativo padrão no repositório que você pode usar como ponto de partida.

Exemplo de python-fuse - contém alguns slides e exemplos de sistemas de arquivos Python FUSE.

A maioria deles parece estar nos repositórios do Ubuntu. Eu usei Fuse, gdrive e GoogleCL e todos eles funcionam bem. Dependendo do nível de controle desejado, isso será muito fácil ou muito complexo. Isso é contigo. Deve ser fácil fazer isso a partir de um servidor EC2 / S3. Apenas imagine os comandos um por um para tudo o que você precisa e coloque-o em um script em um trabalho cron.

Se você não quer trabalhar tanto, também pode usar um serviço como o Spinbackup . Tenho certeza de que há outros igualmente bons, mas ainda não tentei.


20
O Google takeout é a melhor ferramenta para isso, pois suporta mais serviços do que essas outras ferramentas. A pergunta é válida.
Jl6 #

6
@ krowe: Sua resposta é realmente útil, no entanto, está relacionada apenas ao Google Drive. O Google Takeout permite que você baixe todos os seus dados de 25 serviços diferentes do Google, não apenas do Google Drive.
Bjarke Freund-Hansen

@ BjarkeFreund-Hansen 1) Muitos desses 25 serviços podem ser salvos no GDrive e armazenados em backup automaticamente como parte de um backup automatizado do GDrive. 2) A maioria dos serviços restantes é inútil para backup (+ 1s, círculos etc.) ou extinta (código do Google). 3) Estou cansado de explicar isso para pessoas que não têm uma resposta melhor. Estou bastante certo de que não há como automatizar a retirada (além de usar macros do lado do cliente; que não são muito confiáveis ​​de qualquer maneira). 4) Se você pode me provar que está errado, poste sua melhor solução e podemos conversar. Caso contrário, consulte o meu comentário anterior sobre esse mesmo problema.
krowe

6
@krowe: Gmail, Calendário, Contatos, Fotos, histórico de Hangouts e Histórico de localização são serviços que eu uso amplamente e gostaria de garantir a perda de dados no Google. Nenhum desses dados do serviço está incluído no Google drive. Só porque não conheço uma solução melhor, ou existe alguma, não faz com que você responda mais corretamente. Mais uma vez, não estou dizendo que sua resposta é ruim, apenas não responde à pergunta real.
Bjarke Freund-Hansen

@ BjarkeFreund-Hansen Entendo sua frustração e alguns desses serviços podem ser sincronizados com o seu GDrive (para que eles façam backup junto com ele). Por exemplo, o Google Fotos pode fazer isso: Fotos de backup . Acredito que o Calendário e os Contatos possam ser sincronizados da mesma maneira. O GMail também pode ser apoiado: Backup GMail . As outras coisas que você menciona eu não sei, mas isso é principalmente porque eu pessoalmente não me incomodaria em fazer backup delas de qualquer maneira.
krowe

2

Esta é uma resposta parcial com automação parcial. Pode parar de funcionar no futuro se o Google optar por reprimir o acesso automatizado ao Google Takeout. Recursos atualmente suportados nesta resposta:

+ --------------------------------------------- + --- --------- + --------------------- +
| Recurso de automação | Automatizado? | Plataformas Suportadas |
+ --------------------------------------------- + --- --------- + --------------------- +
| Login na Conta do Google | Não |
| Obtenha cookies do Mozilla Firefox | Sim Linux
| Obtenha cookies do Google Chrome | Sim Linux, macOS |
| Solicitar criação de arquivo | Não |
| Agendar criação de arquivo | Meio que | Site para viagem |
| Verifique se o arquivo morto foi criado | Não |
| Obter lista de arquivos | Sim Plataforma cruzada |
| Baixe todos os arquivos compactados | Sim Linux, macOS |
| Criptografar arquivos baixados | Não |
| Carregar arquivos baixados para o Dropbox | Não |
| Carregar arquivos compactados baixados para o AWS S3 | Não |
+ --------------------------------------------- + --- --------- + --------------------- +

Em primeiro lugar, uma solução de nuvem para nuvem não pode realmente funcionar porque não há interface entre o Google Takeout e qualquer provedor de armazenamento de objetos conhecido. É necessário processar os arquivos de backup em sua própria máquina (que podem ser hospedados na nuvem pública, se você desejar) antes de enviá-los ao seu provedor de armazenamento de objetos.

Em segundo lugar, como não há API do Google Takeout, um script de automação precisa fingir ser um usuário com um navegador para percorrer o fluxo de download e criação de arquivos do Google Takeout.


Recursos de automação

Login da Conta do Google

Isso ainda não está automatizado. O script precisaria fingir ser um navegador e navegar por possíveis obstáculos, como autenticação de dois fatores, CAPTCHAs e outra triagem de segurança aumentada.

Obtenha cookies do Mozilla Firefox

Eu tenho um script para usuários do Linux pegar os cookies do Google Takeout do Mozilla Firefox e exportá-los como variáveis ​​de ambiente. Para que isso funcione, deve haver apenas um perfil do Firefox e o perfil deve ter visitado https://takeout.google.com enquanto estiver conectado.

Como uma linha:

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 um script Bash mais 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"

Obter cookies do Google Chrome

Eu tenho um script para Linux e possivelmente usuários do macOS para pegar os cookies do Google Takeout no Google Chrome e exportá-los como variáveis ​​de ambiente. O script funciona no pressuposto de que o Python 3 venvesteja disponível e o Defaultperfil do Chrome visitou https://takeout.google.com enquanto estiver conectado.

Como uma linha:

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 um script Bash mais 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"

Limpe os arquivos baixados:

rm -rf "$venv_path"

Solicitar criação de arquivo

Isso ainda não está automatizado. O script precisaria preencher o formulário do Google Takeout e enviá-lo.

Agendar criação de arquivo morto

Ainda não há uma maneira totalmente automatizada de fazer isso, mas em maio de 2019, o Google Takeout introduziu um recurso que automatiza a criação de 1 backup a cada 2 meses por 1 ano (total de 6 backups). Isso deve ser feito no navegador em https://takeout.google.com ao preencher o formulário de solicitação de arquivamento:

Google Takeout: personalizar o formato de arquivo

Verifique se o arquivo morto foi criado

Isso ainda não está automatizado. Se um arquivo foi criado, o Google às vezes envia um email para a caixa de entrada do Gmail do usuário, mas nos meus testes, isso nem sempre acontece por motivos desconhecidos.

A única outra maneira de verificar se um arquivo foi criado é pesquisando periodicamente o Google Takeout.

Obter lista de arquivos

Eu tenho um comando para fazer isso, supondo que os cookies tenham sido definidos como variáveis ​​de ambiente na seção "Obter cookies" acima:

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

A saída é uma lista delimitada por linha de URLs que levam a downloads de todos os arquivos disponíveis.
É analisado do HTML com regex .

Faça o download de todos os arquivos compactados

Aqui está o código no Bash para obter os URLs dos arquivos e baixá-los todos, assumindo que os cookies foram definidos como variáveis ​​de ambiente na seção "Obter cookies" acima:

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

Eu testei no Linux, mas a sintaxe também deve ser compatível com o macOS.

Explicação de cada parte:

  1. curl comando com cookies de autenticação:

    curl -sL -H "Cookie: SID=${SID}; HSID=${HSID}; SSID=${SSID}; OSID=${OSID};" \
  2. URL da página que possui os links para download

    'https://takeout.google.com/settings/takeout/downloads' | \
  3. O filtro corresponde apenas aos links para download

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

    awk '!x[$0]++' \ |
  5. Faça o download de cada arquivo da lista, um por um:

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

    Nota:-P1 é possível paralelizar os downloads (mudar para um número maior), mas o Google parece limitar todas as conexões, exceto uma.

    Nota: -C - ignora arquivos que já existem, mas pode não retomar com êxito os downloads de arquivos existentes.

Criptografar arquivos baixados

Isso não é automatizado. A implementação depende de como você deseja criptografar seus arquivos e o consumo de espaço em disco local deve ser dobrado para cada arquivo que você está criptografando.

Carregar arquivos baixados para o Dropbox

Isso ainda não está automatizado.

Carregar arquivos compactados baixados para o AWS S3

Isso ainda não está automatizado, mas deve ser apenas uma questão de iterar sobre a lista de arquivos baixados e executar um comando como:

aws s3 cp TAKEOUT_FILE "s3://MYBUCKET/Google Takeout/"

0

Encontrei essa pergunta ao pesquisar como corrigir minhas fotos do google que não aparecem corretamente no google drive (que eu já estou fazendo backup automaticamente!).

Portanto, para que suas fotos sejam exibidas no google drive, acesse https://photos.google.com , configurações e defina-o para mostrar fotos em uma pasta na unidade.

Em seguida, use https://github.com/ncw/rclone para clonar todo o seu Google Drive (que agora inclui fotos como um diretório 'normal') para o armazenamento local.


O rclone parece ótimo, parece um projeto maduro. Apenas a solução que eu estava procurando.
steampowered

É realmente MUITO legal. Entretanto, com minhas milhares de fotos, agora leva um tempo para analisá-las. Eu me pergunto se consigo fazer o download cego de tudo, em vez de procurar por bobagens.
Djsmiley2k - CoW
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.