Как автоматизировать регулярное резервное копирование Google Takeout в облачное хранилище

42

Я хотел бы создавать регулярные резервные копии Google Takeout (скажем, каждые 3 месяца) и хранить их в зашифрованном виде в каком-либо другом облачном хранилище, например DropBox или S3.

Это не обязательно должно быть решение от облака к облаку, хотя и предпочтительнее. Это не должно быть на 100% автоматизировано, однако чем больше, тем лучше.

Заранее спасибо за любые идеи.

Михал Шрайер
источник

Ответы:

2

Вместо Direct API для резервного копирования Google Takeout (что сейчас практически невозможно сделать) вы можете создавать резервные копии своих данных в сторонних решениях для хранения данных через Google Drive. Многие сервисы Google позволяют создавать резервные копии на Google Диске, и вы можете создавать резервные копии на Google Диске, используя следующие инструменты:

GoogleCL - GoogleCL переносит сервисы Google в командную строку.

gdatacopier - утилиты управления документами командной строки для документов Google.

FUSE Google Drive - файловая система FUSE в пространстве пользователя для Google Drive, написанная на C.

Grive - Независимая реализация клиента Google Drive с открытым исходным кодом. Он использует API Список документов Google для общения с серверами в Google. Код написан на C ++.

gdrive-cli - интерфейс командной строки для GDrive. При этом используется GDrive API, а не GDocs API, что интересно. Чтобы использовать его, вам необходимо зарегистрировать приложение Chrome. Он должен быть как минимум установлен вами, но не должен публиковаться. В репо есть шаблонное приложение, которое вы можете использовать в качестве отправной точки.

пример python-fuse - содержит некоторые слайды и примеры файловых систем Python FUSE.

Большинство из них, кажется, находятся в репозиториях Ubuntu. Я сам использовал Fuse, gdrive и GoogleCL, и все они работают нормально. В зависимости от уровня контроля, который вы хотите, это будет действительно легко или действительно сложно. Это зависит от вас. Это должно быть прямо делать с сервера EC2 / S3. Просто разбирайте команды одну за другой для всего, что вам нужно, и вставляйте их в скрипт для задания cron.

Если вы не хотите работать так усердно, вы также можете просто использовать такой сервис, как Spinbackup . Я уверен, что есть и другие, но не пробовал.

krowe
источник
20
Google takeout - лучший инструмент для этого, потому что он поддерживает больше сервисов, чем эти другие инструменты. Вопрос действителен.
JL6
6
@krowe: Ваш ответ действительно полезен, как бы он ни относился только к Google Drive. Google takeout позволяет вам загружать все свои данные из 25 различных сервисов Google, а не только с диска Google.
Бьярке Фрейнд-Хансен
@ BjarkeFreund-Hansen 1) Многие из этих 25 служб могут быть сохранены в GDrive и автоматически сохранены как часть автоматизированного резервного копирования GDrive. 2) Большинство оставшихся сервисов либо не имеют смысла для резервного копирования (+ 1 с, круги и т. Д.), Либо не работают (Google Code). 3) Я устал объяснять это людям, у которых нет лучшего ответа. Я совершенно уверен, что нет способа автоматизировать вынос (кроме использования макросов на стороне клиента, которые в любом случае не очень надежны). 4) Если вы можете доказать, что я не прав, опубликуйте лучшее решение, и мы поговорим. Если нет, то обратитесь к моему предыдущему комментарию по этому же вопросу.
Кроув
6
@krowe: Gmail, календарь, контакты, фотографии, история чата и история местоположений - это службы, которыми я активно пользуюсь, и которые я хотел бы защитить от потери данных в Google. Ни одна из данных этих сервисов не включена в Google диск. То, что я не знаю лучшего решения или его вообще не существует, не заставляет вас отвечать более правильно. Опять же, я не говорю, что вы отвечаете плохо, это просто не отвечает на настоящий вопрос.
Бьярке Фрейнд-Хансен
@ BjarkeFreund-Hansen Я понимаю ваше разочарование, и некоторые из этих сервисов МОГУТ синхронизироваться с вашим GDrive (поэтому они будут выполнять резервное копирование вместе с ним). Например, Google Photos могут сделать это: резервное копирование фотографий . Я считаю, что календарь и контакты могут быть синхронизированы таким же образом. GMail также может быть поддержан: Резервное копирование GMail . Другие вещи, о которых вы упоминаете, о которых я не знаю, но в основном потому, что лично я бы не стал их поддерживать.
Кроу
2

Это частичный ответ с частичной автоматизацией. Он может перестать работать в будущем, если Google решит принять меры по автоматическому доступу к Google Takeout. Функции, которые в настоящее время поддерживаются в этом ответе:

+ --------------------------------------------- + --- --------- + --------------------- +
| Автоматизация Автоматизированный? | Поддерживаемые платформы |
+ --------------------------------------------- + --- --------- + --------------------- +
| Вход в аккаунт Google | Нет | |
| Получить печенье от Mozilla Firefox | Да | Linux |
| Получить куки из Google Chrome | Да | Linux, macOS |
| Заказать создание архива | Нет | |
| Расписание создания архива | Кинда | Сайт на вынос |
| Проверьте, создан ли архив | Нет | |
| Получить архив списка | Да | Кроссплатформенный |
| Скачать все архивные файлы | Да | Linux, macOS |
| Зашифровать загруженные архивные файлы | Нет | |
| Загрузить загруженные архивные файлы в Dropbox | Нет | |
| Загрузить загруженные архивные файлы в AWS S3 | Нет | |
+ --------------------------------------------- + --- --------- + --------------------- +

Во-первых, решение «облако в облако» не может работать, поскольку нет интерфейса между Google Takeout и любым известным поставщиком хранилищ объектов. Вы должны обработать файлы резервных копий на своем собственном компьютере (который может быть размещен в публичном облаке, если хотите), прежде чем отправлять их поставщику хранилища объектов.

Во-вторых, поскольку Google Takeout API отсутствует, сценарий автоматизации должен притвориться пользователем с браузером, чтобы пройти через процесс создания и загрузки архива Google Takeout.


Особенности автоматизации

Вход в аккаунт Google

Это еще не автоматизировано. Сценарий должен был бы претендовать на роль браузера и преодолевать возможные препятствия, такие как двухфакторная аутентификация, CAPTCHA и другие расширенные проверки безопасности.

Получить печенье от Mozilla Firefox

У меня есть скрипт для пользователей Linux, который позволяет получать файлы cookie Google Takeout из Mozilla Firefox и экспортировать их как переменные среды. Чтобы это работало, должен быть только один профиль Firefox, и профиль должен был посещать https://takeout.google.com при входе в систему.

Как однострочник:

cookie_jar_path=$(mktemp) ; source_path=$(mktemp) ; cp ~/.mozilla/firefox/*.default/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.
# Only supports one Firefox profile.
# Edit the asterisk below to select a specific profile.
cp ~/.mozilla/firefox/*.default/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

У меня есть скрипт для пользователей Linux и, возможно, macOS, чтобы получить файлы cookie Google Takeout из Google Chrome и экспортировать их как переменные среды. Сценарий работает при условии, что 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 Takeout и затем отправить ее.

Расписание создания архива

Пока еще нет полностью автоматизированного способа сделать это, но в мае 2019 года Google Takeout представил функцию, которая автоматизирует создание 1 резервной копии каждые 2 месяца в течение 1 года (всего 6 резервных копий). Это необходимо сделать в браузере по адресу https://takeout.google.com при заполнении формы запроса архива:

Google Takeout: настройка формата архива

Проверьте, создан ли архив

Это еще не автоматизировано. Если архив был создан, 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 с помощью регулярных выражений .

Скачать все архивные файлы

Вот код в 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 команда с аутентификационными куки:

    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. Загрузите каждый файл в списке, один за другим:

    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/"
Deltik
источник
0

Я нашел этот вопрос, когда искал, как исправить мои фотографии Google, которые не отображаются должным образом на диске Google (который я уже автоматически копирую!).

Итак, чтобы ваши фотографии отображались на диске Google, перейдите на страницу https://photos.google.com и настройте их так, чтобы они отображались в папке на диске.

Затем используйте https://github.com/ncw/rclone, чтобы клонировать весь диск Google (который теперь включает фотографии в качестве «обычного» каталога) в локальное хранилище.

djsmiley2k - CoW
источник
rclone выглядит великолепно, похоже на зрелый проект. Просто решение, которое я искал.
steampowered
Это действительно очень приятно. хотя с моими многими тысячами фотографий теперь требуется некоторое время, чтобы разобраться в них. Мне интересно, смогу ли я просто заставить все скачивать вслепую, вместо того, чтобы проверять наличие дураков.
djsmiley2k - CoW