自動化 – Google Takeoutの定期的なバックアップをクラウドストレージに自動化する方法

amazon-s3 automation backup dropbox

定期的にGoogle Takeoutのバックアップを作成し(3ヶ月に1回としましょう)、暗号化してDropBoxやS3などの他のクラウドストレージに保存したいと思います

好ましいことではありますが、クラウド間のソリューションである必要はありません。100%自動化されている必要はありませんが、多ければ多いほど良いです

何かアイデアがあればよろしくお願いします

  46  Michał Šrajer  2014-02-14


ベストアンサー

これは部分的に自動化された部分的な回答です。GoogleがGoogleテイクアウトへの自動アクセスを取り締まることを選択した場合、将来的には機能しなくなるかもしれません。この回答で現在サポートされている機能

+---------------------------------------------+------------+---------------------+
|             Automation Feature              | Automated? | Supported Platforms |
+---------------------------------------------+------------+---------------------+
| Google Account log-in                       | No         |                     |
| Get cookies from Mozilla Firefox            | Yes        | Linux               |
| Get cookies from Google Chrome              | Yes        | Linux, macOS        |
| Request archive creation                    | No         |                     |
| Schedule archive creation                   | Kinda      | Takeout website     |
| Check if archive is created                 | No         |                     |
| Get archive list                            | Yes        | Cross-platform      |
| Download all archive files                  | Yes        | Linux, macOS        |
| Encrypt downloaded archive files            | No         |                     |
| Upload downloaded archive files to Dropbox  | No         |                     |
| Upload downloaded archive files to AWS S3   | No         |                     |
+---------------------------------------------+------------+---------------------+

第一に、Google Takeoutと既知のオブジェクトストレージプロバイダとの間にインターフェースがないため、クラウドからクラウドへのソリューションは実際には動作しません。バックアップファイルをオブジェクトストレージプロバイダに送る前に、自分のマシンで処理しなければなりません(必要に応じてパブリッククラウドでホストすることもできます)

第二に、Google Takeout APIがないので、自動化スクリプトは、Google Takeoutアーカイブの作成とダウンロードの流れをウォークスルーするために、ブラウザを持つユーザーのふりをする必要があります


Automation Features

Googleアカウントのログイン

これはまだ自動化されていません。スクリプトはブラウザのふりをして、二要素認証やCAPTCHA、その他のセキュリティ審査の強化など、起こりうるハードルをナビゲートする必要があります

Mozilla Firefoxからクッキーを取得します

私は、Mozilla FirefoxからGoogle Takeoutのクッキーを取得し、環境変数としてエクスポートするためのLinuxユーザーのためのスクリプトを持っています。これを動作させるためには、デフォルト/アクティブなプロファイルがログイン中に 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からクッキーを取得します

私は、Google ChromeからGoogle Takeoutのクッキーを取得し、環境変数としてエクスポートするためのLinuxとおそらくmacOSユーザーのためのスクリプトを持っています。このスクリプトは、Python 3 venv が利用可能で、Default の Chrome プロファイルがログイン中に 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テイクアウトのフォームに記入して送信する必要があります

アーカイブの作成を予定しています

完全に自動化された方法はまだありませんが、2019年5月にGoogle Takeoutでは、2ヶ月に1回、1年間(合計6回)のバックアップを自動作成する機能が導入されました。これは、https://takeout.google.comのブラウザでアーカイブリクエストフォームに必要事項を入力しながら行う必要があります

Google Takeout: Customize archive format

アーカイブが作成されているかどうかを確認します

これはまだ自動化されていません。アーカイブが作成されている場合、GoogleがユーザーのGmailの受信箱にメールを送信することがありますが、私のテストでは、理由がわからないため、いつもそうなるとは限りません

アーカイブが作成されているかどうかを確認するには、定期的にGoogle Takeoutをポーリングするしかありません

アーカイブリストの取得

上の「クッキーの取得」で環境変数としてクッキーが設定されていると仮定して、これを行うためのコマンドがあるのですが、これを実行するにはどうすればいいのでしょうか?

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 を正規表現でパースしたものです

すべてのアーカイブファイルをダウンロードします

上の「クッキーの取得」でクッキーが環境変数として設定されていると仮定して、アーカイブファイルのURLを取得して全てダウンロードするためのBashのコードを以下に示します

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認証クッキーを使ったコマンドです

    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. リスト内のファイルを1つ1つダウンロードしてください

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

    注:ダウンロードを並列化(-P1をより大きな数字に変更)することは可能ですが、Googleは接続の1つ以外はすべてスロットルするようです

    注意: -C - は既に存在するファイルをスキップしますが、既存のファイルのダウンロードを正常に再開できない場合があります

ダウンロードしたアーカイブファイルを暗号化します

これは自動化されていません。実装はファイルをどのように暗号化するかに依存し、暗号化するファイルごとにローカルディスク容量の消費量を2倍にしなければなりません

ダウンロードしたアーカイブファイルをDropboxにアップロードします

これはまだ自動化されていません

ダウンロードしたアーカイブファイルをAWS S3にアップロードします

これはまだ自動化されていませんが、単純にダウンロードしたファイルのリストを反復して、次のようなコマンドを実行すればいいだけのことです

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

6  Deltik  2019-07-25


Google Takeoutをバックアップするための直接APIの代わりに(今のところほとんど不可能のようですが)、Google Driveを経由してサードパーティのストレージソリューションにデータをバックアップすることができます。Googleのサービスの多くはGoogle Driveへのバックアップを許可しており、以下のツールを使ってGoogle Driveをバックアップすることができます

GoogleCL – GoogleCL は Google のサービスをコマンドラインにもたらします

gdatacopier – Googleドキュメントのコマンドライン文書管理ユーティリティ

FUSE Google Drive – C 言語で書かれた Google Drive 用の FUSE ユーザ空間ファイルシステム

Grive – Google Drive クライアントの独立したオープンソース実装。Google ドキュメントリスト API を使って Google のサーバーと通信します。コードは C++ で書かれています

gdrive-cli – GDriveのコマンドラインインターフェイス。これはGDocs APIではなくGDrive APIを使っているのが面白い。これを使うには、クロームアプリケーションを登録する必要があります。少なくとも自分でインストールできる必要がありますが、公開されている必要はありません。手始めに使えるボイラプレートアプリがレポにあります

python-fuse の例 – Python FUSE ファイルシステムのいくつかのスライドと例が含まれています

これらのほとんどはUbuntuのリポジトリにあるようです。私自身はFuse、gdrive、GoogleCLを使用してきましたが、それらはすべて正常に動作します。あなたが望むコントロールのレベルに応じて、これは本当に簡単になるか、本当に複雑になります。それはあなた次第です。EC2/S3サーバーからの操作は簡単です。必要なコマンドを一つ一つ把握して、cronジョブのスクリプトに入れればいいだけです

あなたがそんなに苦労したくない場合は、Spinbackupのようなサービスを使用することもできます。他にも同じように良いものがあると思いますが、私は試したことがありません

2  krowe  2014-09-10


googleドライブにgoogleフォトが正しく表示されない(すでに自動でバックアップしている!)のを修正する方法を検索しているときに、この質問を見つけました

だから、あなたの写真がgoogleドライブに表示されるようにするには、https://photos.google.com、設定に移動し、ドライブ内のフォルダに写真を表示するように設定します

その後、https://github.com/ncw/rcloneを使用して、ローカルストレージにダウンして全体のgoogleドライブ(今では’通常’ディレクトリとして写真が含まれています)をクローンする

0  djsmiley2kStaysInside  2018-03-02


タイトルとURLをコピーしました