web-dev-qa-db-ja.com

クラウドストレージへの通常のGoogleデータエクスポートバックアップを自動化する方法

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

推奨されますが、クラウドツークラウドソリューションである必要はありません。 100%自動化する必要はありませんが、多ければ多いほど良いです。

よろしくお願いします。

44
Michał Šrajer

これは、部分的な自動化による部分的な答えです。 GoogleがGoogleデータエクスポートへの自動アクセスを取り締まることを選択した場合、将来は機能しなくなる可能性があります。この回答で現在サポートされている機能:

 + -------------------------------------------- -+ ------------ + --------------------- + 
 |自動化機能|自動化? |サポートされるプラットフォーム| 
 + ----------------------------------------- ---- + ------------ + --------------------- + 
 | Googleアカウントのログイン|いいえ| | 
 | Mozilla FirefoxからCookieを取得する|はい| Linux | 
 | GoogleからCookieを取得するChrome |はい| Linux、macOS | 
 |アーカイブの作成をリクエストする|いいえ| | 
 |アーカイブ作成のスケジュール|ちょっと|テイクアウトのウェブサイト| 
 |アーカイブが作成されたかどうかを確認する|いいえ| | 
 |アーカイブリストを取得する|はい|クロスプラットフォーム| 
 |すべてのアーカイブファイルをダウンロードする|はい| Linux、macOS | 
 |ダウンロードしたアーカイブファイルを暗号化する|いいえ| | 
 |ダウンロードしたアーカイブファイルをDropboxにアップロードする|いいえ| | 
 |ダウンロードしたアーカイブファイルをAWS S3にアップロードする|いいえ| | 
 + ------------------------------------------- -+ ------------ + --------------------- + 

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

次に、Google Takeout APIがないため、自動化スクリプトは、Google Takeoutアーカイブの作成とダウンロードのフローを実行するために、ブラウザーを使用するユーザーのふりをする必要があります。


自動化機能

Googleアカウントのログイン

これはまだ自動化されていません。スクリプトは、ブラウザのふりをして、2要素認証、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 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.
# 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 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が使用可能であり、ログイン中に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データエクスポートを定期的にポーリングすることです。

アーカイブリストを取得する

上記の「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から解析 です。

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

上記の「Get cookies」セクションでcookieが環境変数として設定されていると想定して、アーカイブファイルの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. 認証Cookieを含む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つずつダウンロードします。

    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/"
4
Deltik

Google TakeoutをバックアップするためのDirect APIの代わりに(現時点ではほとんど不可能と思われます)、Googleドライブを介してサードパーティのストレージソリューションにデータをバックアップできます。多くのGoogleサービスではGoogleドライブへのバックアップが許可されており、次のツールを使用してGoogleドライブをバックアップできます。

GoogleCL -GoogleCLはGoogleサービスをコマンドラインに提供します。

gdatacopier -Googleドキュメント用のコマンドラインドキュメント管理ユーティリティ。

Fuse Google Drive -Cで記述された、Googleドライブ用のFuseユーザースペースファイルシステム。

Grive -Googleドライブクライアントの独立したオープンソース実装。 Google Document List APIを使用して、Googleのサーバーと通信します。コードはC++で書かれています。

gdrive-cli -GDriveのコマンドラインインターフェイス。これは、興味深いGDocs APIではなく、GDrive APIを使用しています。これを使用するには、chromeアプリケーションを登録する必要があります。これは、少なくともインストール可能である必要がありますが、公開する必要はありません。開始として使用できるボイラープレートアプリがリポジトリにありますポイント。

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

これらのほとんどはUbuntuリポジトリにあるようです。私はFuse、gdrive、GoogleCLを自分で使用しましたが、すべて正常に動作します。必要な制御レベルに応じて、これは非常に簡単または非常に複雑になります。それはあなた次第です。 EC2/S3サーバーから行うのは簡単です。必要なすべてのコマンドを1つずつ理解し、それをcronジョブのスクリプトに入れてください。

一生懸命働きたくない場合は、 Spinbackup のようなサービスを使用することもできます。他にも同じくらい良いものはあると思いますが、まだ試していません。

2
krowe

私のグーグル写真がグーグルドライブ(私はすでに自動的にバックアップしています!)に正しく表示されないのを修正する方法を検索しているときにこの質問を見つけました。

したがって、Googleドライブに写真を表示するには、 https://photos.google.com にアクセスして、ドライブのフォルダにある写真を表示するように設定します。

次に https://github.com/ncw/rclone を使用して、Googleドライブ全体(「通常の」ディレクトリとして写真が含まれるようになりました)全体をローカルストレージに複製します。