Это частичный ответ с частичной автоматизацией. Он может перестать работать в будущем, если 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 иногда отправляет электронное письмо в почтовый ящик пользователя 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.
Объяснение каждой части:
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]++' \ |
Загрузите каждый файл в списке, один за другим:
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/"