Đây là một câu trả lời một phần với tự động hóa một phần. Nó có thể ngừng hoạt động trong tương lai nếu Google chọn phá vỡ quyền truy cập tự động vào Google Takeout. Các tính năng hiện được hỗ trợ trong câu trả lời này:
+ --------------------------------------------- + --- --------- + --------------------- +
| Tính năng tự động hóa | Tự động hóa? | Nền tảng được hỗ trợ |
+ --------------------------------------------- + --- --------- + --------------------- +
| Đăng nhập tài khoản Google | Không | |
| Nhận cookie từ Mozilla Firefox | Vâng | Linux |
| Nhận cookie từ Google Chrome | Vâng | Linux, macOS |
| Yêu cầu tạo lưu trữ | Không | |
| Lập lịch lưu trữ tạo | Loại | Trang web mang đi |
| Kiểm tra nếu lưu trữ được tạo ra | Không | |
| Nhận danh sách lưu trữ | Vâng | Đa nền tảng |
| Tải xuống tất cả các tập tin lưu trữ | Vâng | Linux, macOS |
| Mã hóa tập tin lưu trữ đã tải xuống | Không | |
| Tải tập tin lưu trữ đã tải xuống Dropbox | Không | |
| Tải các tệp lưu trữ đã tải xuống lên AWS S3 | Không | |
+ --------------------------------------------- + --- --------- + --------------------- +
Thứ nhất, giải pháp đám mây trên đám mây thực sự không thể hoạt động vì không có giao diện giữa Google Takeout và bất kỳ nhà cung cấp lưu trữ đối tượng đã biết nào. Bạn đã phải xử lý các tệp sao lưu trên máy của chính mình (có thể được lưu trữ trên đám mây công cộng, nếu bạn muốn) trước khi gửi chúng cho nhà cung cấp lưu trữ đối tượng của bạn.
Thứ hai, vì không có API Google Takeout, tập lệnh tự động hóa cần giả vờ là người dùng có trình duyệt để duyệt qua quá trình tạo và tải xuống lưu trữ Google Takeout.
Tính năng tự động hóa
Đăng nhập tài khoản Google
Điều này chưa được tự động. Kịch bản sẽ cần phải giả vờ là một trình duyệt và điều hướng các rào cản có thể có như xác thực hai yếu tố, CAPTCHA và sàng lọc bảo mật gia tăng khác.
Nhận cookie từ Mozilla Firefox
Tôi có một tập lệnh cho người dùng Linux để lấy cookie Google Takeout từ Mozilla Firefox và xuất chúng dưới dạng các biến môi trường. Để làm việc này, chỉ nên có một hồ sơ Firefox và hồ sơ đó phải truy cập https://takeout.google.com khi đăng nhập.
Như một lớp lót:
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"
Là một kịch bản Bash đẹp hơn:
#!/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"
Nhận cookie từ Google Chrome
Tôi có một tập lệnh cho Linux và có thể là người dùng macOS để lấy cookie Google Takeout từ Google Chrome và xuất chúng dưới dạng các biến môi trường. Tập lệnh hoạt động dựa trên giả định rằng Python 3 venv
có sẵn và Default
hồ sơ Chrome đã truy cập https://takeout.google.com khi đăng nhập.
Như một lớp lót:
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
Là một kịch bản Bash đẹp hơn:
#!/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"
Dọn dẹp các tập tin đã tải xuống:
rm -rf "$venv_path"
Yêu cầu tạo lưu trữ
Điều này chưa được tự động. Tập lệnh sẽ cần điền vào biểu mẫu Google Takeout và sau đó gửi nó.
Lập lịch lưu trữ
Chưa có cách nào hoàn toàn tự động để làm điều này, nhưng vào tháng 5 năm 2019, Google Takeout đã giới thiệu một tính năng tự động hóa việc tạo 1 bản sao lưu cứ sau 2 tháng trong 1 năm (tổng cộng 6 bản sao lưu). Điều này phải được thực hiện trong trình duyệt tại https://takeout.google.com trong khi điền vào mẫu yêu cầu lưu trữ:
Kiểm tra nếu lưu trữ được tạo ra
Điều này chưa được tự động. Nếu một kho lưu trữ đã được tạo, đôi khi Google sẽ gửi email đến hộp thư đến Gmail của người dùng, nhưng trong thử nghiệm của tôi, điều này không phải lúc nào cũng xảy ra vì những lý do không xác định.
Cách khác duy nhất để kiểm tra xem một kho lưu trữ đã được tạo hay chưa là bằng cách bỏ phiếu theo định kỳ của Google Takeout.
Nhận danh sách lưu trữ
Tôi có một lệnh để làm điều này, giả sử rằng các cookie đã được đặt làm biến môi trường trong phần "Nhận cookie" ở trên:
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]++'
Đầu ra là một danh sách các URL được phân tách bằng dòng dẫn đến tải xuống tất cả các tài liệu lưu trữ có sẵn.
Nó được phân tích cú pháp từ HTML với regex .
Tải xuống tất cả các tệp lưu trữ
Đây là mã trong Bash để lấy URL của các tệp lưu trữ và tải xuống tất cả, giả sử rằng các cookie đã được đặt làm biến môi trường trong phần "Nhận cookie" ở trên:
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};" {}
Tôi đã thử nghiệm nó trên Linux, nhưng cú pháp cũng phải tương thích với macOS.
Giải thích từng phần:
curl
lệnh với cookie xác thực:
curl -sL -H "Cookie: SID=${SID}; HSID=${HSID}; SSID=${SSID}; OSID=${OSID};" \
URL của trang có các liên kết tải xuống
'https://takeout.google.com/settings/takeout/downloads' | \
Bộ lọc chỉ khớp với các liên kết tải xuống
grep -Po '(?<=")https://storage\.cloud\.google\.com/[^"]+(?=")' | \
Lọc ra các liên kết trùng lặp
awk '!x[$0]++' \ |
Tải xuống từng tệp trong danh sách, từng cái một:
xargs -n1 -P1 -I{} curl -LOJ -C - -H "Cookie: SID=${SID}; HSID=${HSID}; SSID=${SSID}; OSID=${OSID};" {}
Lưu ý: Có thể song song tải xuống (thay đổi -P1
thành số cao hơn), nhưng Google dường như điều tiết tất cả trừ một trong các kết nối.
Lưu ý: -C -
bỏ qua các tệp đã tồn tại, nhưng nó có thể không tiếp tục tải xuống thành công các tệp hiện có.
Mã hóa tập tin lưu trữ đã tải xuống
Điều này không tự động. Việc triển khai tùy thuộc vào cách bạn muốn mã hóa tệp của mình và mức tiêu thụ không gian đĩa cục bộ phải được nhân đôi cho mỗi tệp bạn đang mã hóa.
Tải tập tin lưu trữ đã tải xuống Dropbox
Điều này chưa được tự động.
Tải các tệp lưu trữ đã tải xuống lên AWS S3
Điều này chưa được tự động, nhưng nó chỉ đơn giản là vấn đề lặp qua danh sách các tệp đã tải xuống và chạy một lệnh như:
aws s3 cp TAKEOUT_FILE "s3://MYBUCKET/Google Takeout/"