如何将常规的Google Takeout备份自动化到云存储


42

我想创建常规的Google Takeout备份(假设每3个月一次),并将其加密存储在Dropbox或S3等其他云存储中。

尽管首选,但它不一定是云到云的解决方案。它不必是100%自动化的,但是越多越好。

预先感谢您的任何想法。

Answers:


2

您可以通过Google云端硬盘将数据备份到第三方存储解决方案,而不是直接备份Google Takeout的Direct API。许多Google服务都允许备份到Google云端硬盘,并且您可以使用以下工具备份Google云端硬盘:

GoogleCL -GoogleCL将Google服务带到命令行。

gdatacopier-用于Google文档的命令行文档管理实用程序。

FUSE Google Drive-用C编写的Google Drive FUSE用户空间文件系统。

Grive -Google云端硬盘客户端的独立开源实现。它使用Google Document List API与Google中的服务器通信。该代码用C ++编写。

gdrive-cli -GDrive的命令行界面。这使用的是GDrive API,而不是GDocs API,这很有趣。要使用它,您需要注册一个Chrome应用程序。它必须至少可以由您安装,但无需发布。回购中有一个样板应用程序,您可以将其用作起点。

python-fuse示例 -包含一些Python FUSE文件系统的幻灯片和示例。

其中大多数似乎都在Ubuntu存储库中。我自己使用过Fuse,gdrive和GoogleCL,它们都可以正常工作。根据您希望的控制级别,这将非常容易或非常复杂。随你(由你决定。从EC2 / S3服务器执行此操作应该很简单。只需一一列出所需命令,然后将其放在cron作业的脚本中即可。

如果您不想这么努力,也可以使用Spinbackup之类的服务。我敢肯定还有其他人也一样,但是我还没有尝试过。


20
Google外卖最好的工具,因为它比其他工具支持更多的服务。这个问题是有效的。
jl6

6
@krowe:您的答案非常有用,但是它仅与Google驱动器有关。Google外卖服务可让您从25种不同的Google服务下载所有数据,而不仅仅是Google云端硬盘。
Bjarke Freund-Hansen

@ BjarkeFreund-Hansen 1)这25项服务中的许多都可以保存到GDrive并作为自动GDrive备份的一部分自动备份。2)其余大多数服务对于备份(+1,圈子等)或取消备份(Google代码)毫无意义。3)我厌倦了向没有更好答案的人解释这一点。我相当确定,没有办法使外卖自动化(除了使用客户端宏;反过来也不是很可靠)。4)如果您可以证明我错了,请发布更好的解决方案,我们可以谈谈。如果没有,请参考我以前对同一问题的评论。
krowe

6
@krowe:Gmail,日历,联系人,照片,环聊历史记录和位置记录是我广泛使用的服务,并希望确保不会造成Google数据丢失。这些服务的数据均未包含在Google云端硬盘中。仅仅因为我不知道一种更好的解决方案,或者根本不存在一种解决方案,就无法使您回答任何更正确的问题。再说一次,我并不是说您的回答是不好的,只是没有回答实际的问题。
Bjarke Freund-Hansen

@ BjarkeFreund-Hansen我了解您的无奈,并且其中一些服务可以与您的GDrive同步(因此它们将与之一起备份)。例如,Google相册可以做到这一点:备份照片。我相信可以用相同的方式同步日历和联系人。也可以支持GMail备份GMail。您提到的其他我不知道的事情,但这主要是因为我个人也不会理会它们。
krowe

2

这是部分自动化的部分答案。如果Google选择打击对Google Takeout的自动访问,将来可能会停止工作。此答案当前支持的功能:

+ --------------------------------------------- + --- --------- + --------------------- +
| 自动化功能| 自动化了吗?| 支持的平台|
+ --------------------------------------------- + --- --------- + --------------------- +
| Google帐户登录| 没有 |
| 从Mozilla Firefox获取cookie | 是的 Linux |
| 从Google Chrome浏览器获取Cookie | 是的 Linux,macOS |
| 请求存档创建| 没有 |
| 计划存档创建| 金田| 外卖网站|
| 检查是否创建了存档| 没有 |
| 获取存档列表| 是的 跨平台|
| 下载所有存档文件| 是的 Linux,macOS |
| 加密下载的存档文件| 没有 |
| 将下载的存档文件上传到Dropbox | 没有 |
| 将下载的存档文件上传到AWS S3 | 没有 |
+ --------------------------------------------- + --- --------- + --------------------- +

首先,云到云的解决方案实际上无法工作,因为Google Takeout与任何已知的对象存储提供商之间都没有接口。您必须先在自己的计算机上处​​理备份文件(如果需要,可以将其托管在公共云中),然后再将备份文件发送给对象存储提供商。

其次,由于没有Google Takeout API,因此需要假装自动化脚本成为浏览器用户,以逐步完成Google Takeout归档文件的创建和下载流程。


自动化功能

Google帐户登录

这还没有自动化。该脚本需要伪装成浏览器并浏览可能的障碍,例如两因素身份验证,CAPTCHA和其他增强的安全性筛选。

从Mozilla Firefox获取Cookie

我有一个Linux用户脚本,可从Mozilla Firefox抓取Google Takeout cookie并将其导出为环境变量。为此,只能有一个Firefox配置文件,并且该配置文件在登录时必须已访问https://takeout.google.com

作为单线:

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"

作为更漂亮的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"

从Google Chrome获取Cookie

我有一个针对Linux的脚本,可能还有macOS用户的脚本,可以从Google Chrome浏览器获取Google Takeout cookie并将其导出为环境变量。该脚本假定Python 3 venv可用并且登录时DefaultChrome配置文件已访问https://takeout.google.com

作为单线:

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

作为更漂亮的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"

清理下载的文件:

rm -rf "$venv_path"

请求创建档案

这还没有自动化。该脚本需要填写Google Takeout表单,然后提交。

计划存档创建

尚无完全自动化的方法,但在2019年5月,Google Takeout引入了一项功能,该功能可每2个月自动创建1个备份,共1年(共6个备份)。这必须在浏览器中https://takeout.google.com上完成,同时填写存档申请表:

Google导出:自定义存档格式

检查是否创建了存档

这还没有自动化。如果已创建存档,则Google有时会向用户的Gmail收件箱发送电子邮件,但是在我的测试中,由于未知原因,这种情况并非总是会发生。

检查存档是否已创建的唯一其他方法是定期轮询Google Takeout。

获取存档列表

我有一个命令可以执行此操作,假设已在上面的“获取cookie”部分中将cookie设置为环境变量:

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

输出是一行以行分隔的URL,这些URL导致所有可用档案的下载。
它是使用regex从HTML解析的

下载所有存档文件

这是Bash中的代码,用于获取存档文件的URL并下载所有URL,并假设已在上述“获取cookie”部分中将cookie设置为环境变量:

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

我已经在Linux上对其进行了测试,但是语法也应该与macOS兼容。

各部分说明:

  1. curl 带有身份验证Cookie的命令:

    curl -sL -H "Cookie: SID=${SID}; HSID=${HSID}; SSID=${SSID}; OSID=${OSID};" \
  2. 具有下载链接的页面的URL

    'https://takeout.google.com/settings/takeout/downloads' | \
  3. 筛选仅匹配下载链接

    grep -Po '(?<=")https://storage\.cloud\.google\.com/[^"]+(?=")' | \
  4. 过滤掉重复的链接

    awk '!x[$0]++' \ |
  5. 依次下载列表中的每个文件:

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

    注意:可以并行下载(更改-P1为更大的数量),但Google似乎限制了其中一个连接。

    注意: -C -跳过已经存在的文件,但是它可能无法成功地恢复对现有文件的下载。

加密下载的存档文件

这不是自动的。实现方式取决于您希望如何加密文件,并且每个要加密的文件的本地磁盘空间消耗必须加倍。

将下载的存档文件上传到Dropbox

这还没有自动化。

将下载的存档文件上传到AWS S3

这还不是自动化的,但是应该只是遍历下载文件列表并运行类似以下命令的问题:

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

0

我在搜索如何修复我的Google照片时,在Google驱动器中无法正确显示(我已经自动备份了它)时发现了这个问题。

因此,要使您的照片显示在Google驱动器中,请转至https://photos.google.com,设置并将其设置为在驱动器的文件夹中显示照片。

然后使用https://github.com/ncw/rclone将整个Google驱动器(现在包括照片作为“普通”目录)克隆到本地存储中。


rclone看起来很棒,似乎是一个成熟的项目。只是我一直在寻找的解决方案。
蒸汽动力

真的很棒。通过我的数千张照片,现在需要花一些时间来整理它们。我确实想知道是否可以让它盲目下载所有内容,而不是检查重复项。
djsmiley2k-CoW
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.