定期的に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がユーザーの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にも対応しているはずです
各部の説明
curl
認証クッキーを使ったコマンドですcurl -sL -H "Cookie: SID=${SID}; HSID=${HSID}; SSID=${SSID}; OSID=${OSID};" \
ダウンロードリンクのあるページのURL
'https://takeout.google.com/settings/takeout/downloads' |
フィルタはダウンロードリンクのみにマッチします
grep -Po '(?<=")https://storage\.cloud\.google\.com/[^"]+(?=")' |
重複リンクをフィルタリングします
awk '!x[$0]++' |
リスト内のファイルを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