自动化功能

自动化功能

我想创建定期谷歌外卖备份(比如每 3 个月一次)并将其加密存储在其他云存储中,例如 DropBox 或 S3。

它不一定是云到云的解决方案,尽管最好是。它不一定是 100% 自动化的,但自动化程度越高越好。

答案1

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

+---------------------------------------------+------------+---------------------+
| 自动化功能 | 自动化?| 支持的平台 |
+---------------------------------------------+------------+---------------------+
| Google 帐户登录 | 否 | |
| 从 Mozilla Firefox 获取 cookie | 是 | Linux |
| 从 Google Chrome 获取 cookie | 是 | Linux、macOS |
| 请求创建档案 | 否 | |
| 安排存档创建 | Kinda | 外卖网站 |
| 检查档案是否已创建 | 否 | |
| 获取存档列表 | 损坏 | 跨平台 |
| 下载所有存档文件 | 损坏 | Linux,macOS |
| 加密下载的存档文件 | 否 | |
| 将下载的存档文件上传到 Dropbox | 否 | |
| 将下载的存档文件上传到 AWS S3 | 否 | |
+---------------------------------------------+------------+---------------------+

首先,云到云解决方案实际上行不通,因为 Google Takeout 与任何已知的对象存储提供商之间没有接口。您必须在自己的机器上处理备份文件(如果您愿意,可以托管在公共云中),然后再将它们发送给对象存储提供商。

其次,由于没有 Google Takeout API,自动化脚本需要假装是拥有浏览器的用户来完成 Google Takeout 存档创建和下载流程。


自动化功能

Google 帐户登录

这还不是自动化的。脚本需要假装成浏览器,并绕过可能出现的障碍,如双因素身份验证、CAPTCHA 和其他增强的安全检查。

从 Mozilla Firefox 获取 cookie

我有一个脚本,供 Linux 用户从 Mozilla Firefox 获取 Google Takeout cookie 并将其导出为环境变量。要使此功能正常工作,默认/活动配置文件必须已访问https://takeout.google.com登录后。

作为一行代码:

cookie_jar_path=$(mktemp) ; source_path=$(mktemp) ; firefox_profile=$(cat "$HOME/.mozilla/firefox/profiles.ini" | awk -v RS="" '{ if($1 ~ /^\[Install[0-9A-F]+\]/) { print } }' | sed -nr 's/^Default=(.*)$/\1/p' | head -1) ; cp "$HOME/.mozilla/firefox/$firefox_profile/cookies.sqlite" "$cookie_jar_path" ; sqlite3 "$cookie_jar_path" "SELECT name,value FROM moz_cookies WHERE host 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.
# Edit the $firefox_profile variable below to select a specific Firefox profile.
firefox_profile=$(
    cat "$HOME/.mozilla/firefox/profiles.ini" |
    awk -v RS="" '{
        if($1 ~ /^\[Install[0-9A-F]+\]/) {
            print
        }
    }' |
    sed -nr 's/^Default=(.*)$/\1/p' |
    head -1
)
cp "$HOME/.mozilla/firefox/$firefox_profile/cookies.sqlite" "$cookie_jar_path"

# Get the cookies from the database
sqlite3 "$cookie_jar_path" \
       "SELECT name,value
        FROM moz_cookies
        WHERE host 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 3venv可用并且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 Takeout:自定义存档格式

检查档案是否创建

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

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

获取存档列表

此部分目前已损坏。

Google 停止在 Takeout 下载页面上透露档案下载链接,并实施了安全令牌,将每个档案的下载链接检索限制为最多 5 次。

我有一个命令可以执行此操作,假设已在上面的“获取 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 列表,可下载所有可用的档案。 使用正则表达式解析 HTML

下载所有归档文件

此部分目前已损坏。

Google 停止在 Takeout 下载页面上透露档案下载链接,并实施了安全令牌,将每个档案的下载链接检索限制为最多 5 次。

下面是在 Bash 中获取存档文件的 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 '(?
    
  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/"

答案2

Google Takeout 允许您每两个月安排一次导出,因此每年可导出六次,最多可导出一年。您可以选择将文件添加到云驱动器或通过电子邮件发送下载链接(下载内容仅保留一周)。

要对其进行编程,请浏览https://takeout.google.com/settings/takeout?pli=1

您可以选择要包含在备份中的 Google 数据。支持的云驱动器有:Drive、Dropbox、OneDrive 和 Box。转储格式为 Zip 或 tgz。

您将在文章中找到更多信息 如何下载你的 Google 数据


由于 Google Takeout 不提供 API,当其用户界面发生变化时,通过浏览器自动启动此类备份可能无法正常工作。

最好使用 Google Takeout 备份到某些云盘,并自动下载新文件。

您可以咨询 这个答案 我找到了一些访问 Google Drive 进行同步的方法。可能可以将 Google Drive 映射到 Windows,这样就可以使用 Windows 任务将新备份同步到本地磁盘(尽管我还没有尝试过)。

答案3

除了使用直接 API 来备份 Google Takeout(目前看来这几乎不可能),您还可以通过 Google Drive 将数据备份到第三方存储解决方案。许多 Google 服务允许备份到 Google Drive,您可以使用以下工具备份 Google Drive:

谷歌CL- GoogleCL 将 Google 服务带入命令行。

数据复制器- Google docs 的命令行文档管理实用程序。

FUSE Google 云端硬盘- 一个用于 Google Drive 的 FUSE 用户空间文件系统,用 C 语言编写。

格里夫- Google Drive 客户端的独立开源实现。它使用 Google 文档列表 API 与 Google 中的服务器通信。代码用 C++ 编写。

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

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

其中大部分似乎都在 Ubuntu 存储库中。我自己使用过 Fuse、gdrive 和 GoogleCL,它们都运行良好。根据您想要的控制级别,这将非常简单或非常复杂。这取决于您。从 EC2/S3 服务器执行操作应该很简单。只需逐一找出您需要的一切的命令,然后将其放入 cron 作业的脚本中。

如果你不想那么辛苦,你也可以使用类似的服务旋转备份。我确信还有其他同样好的但我还没有尝试过。

答案4

我在搜索如何修复我的谷歌照片无法在谷歌云端硬盘(我已经自动备份了!)中正确显示时发现了这个问题。

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

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

相关内容