質問: クラウドストレージへの通常のgoogleデータエクスポートバックアップを自動化する方法 定期的に google takeout バックアップ(3か月ごととしましょう)を作成し、dropboxやs3などの他のクラウドストレージに暗号化して保存します。推奨されますが、クラウドツークラウドソリューションである必要はありません。 100%自動化する必要はありませんが、多ければ多いほど良いです。よろしくお願いします。
回答: これは、部分的な自動化による部分的な答えです。 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がユーザーの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と互換性があるはずです。各部の説明: 認証cookieを含む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つずつダウンロードします。 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/"