วิธีการสำรองข้อมูล Google Takeout เป็นประจำโดยอัตโนมัติไปยังที่เก็บข้อมูลบนคลาวด์


42

ฉันต้องการสร้างการสำรองข้อมูลGoogle Takeoutปกติ(สมมติว่าทุก 3 เดือน) และเก็บไว้ในที่เก็บข้อมูลแบบคลาวด์อื่น ๆ เช่น DropBox หรือ S3

ไม่จำเป็นต้องเป็นโซลูชันแบบคลาวด์ถึงคลาวด์ แต่เป็นที่ต้องการ ไม่จำเป็นต้องเป็นระบบอัตโนมัติ 100% แต่ยิ่งดีกว่า

ขอบคุณล่วงหน้าสำหรับความคิดใด ๆ

คำตอบ:


2

แทน Direct APIs สำหรับการสำรองข้อมูล Google Takeout (ซึ่งดูเหมือนจะเป็นไปไม่ได้ที่จะทำในตอนนี้) คุณสามารถสำรองข้อมูลของคุณไปยังโซลูชันการจัดเก็บข้อมูลของบุคคลที่สามผ่าน Google Drive บริการ Google จำนวนมากอนุญาตให้สำรองข้อมูลไปยัง Google Drive และคุณสามารถสำรองข้อมูล Google Drive โดยใช้เครื่องมือต่อไปนี้:

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 คุณต้องติดตั้งอย่างน้อยก็ต้อง แต่ไม่จำเป็นต้องเผยแพร่ มีแอปสำเร็จรูปใน repo ที่คุณสามารถใช้เป็นจุดเริ่มต้นได้

ตัวอย่าง python-fuse - มีสไลด์และตัวอย่างของระบบไฟล์ Python FUSE

ส่วนใหญ่ดูเหมือนจะอยู่ในที่เก็บของ Ubuntu ฉันใช้ Fuse, gdrive และ GoogleCL ด้วยตัวเองและพวกมันก็ใช้ได้ดี ขึ้นอยู่กับระดับการควบคุมที่คุณต้องการสิ่งนี้จะง่ายหรือซับซ้อนจริงๆ ขึ้นอยู่กับคุณ ควรตรงไปตรงมาทำจากเซิร์ฟเวอร์ EC2 / S3 เพียงคิดคำสั่งทีละรายการสำหรับทุกสิ่งที่คุณต้องการและวางไว้ในสคริปต์ในงาน cron

หากคุณไม่ต้องการที่จะทำงานอย่างหนักเพื่อให้คุณยังสามารถเพียงแค่ใช้บริการเหมือนSpinbackup ฉันแน่ใจว่ามีคนอื่นดีเหมือนกัน แต่ฉันไม่ได้ลองเลย


20
Google takeout เป็นเครื่องมือที่ดีที่สุดสำหรับสิ่งนี้เพราะรองรับบริการอื่น ๆ ที่เครื่องมืออื่น ๆ เหล่านี้ คำถามถูกต้อง
jl6

6
@ krowe: คำตอบของคุณมีประโยชน์จริง ๆ แต่มันเกี่ยวข้องกับไดรฟ์ของ Google เท่านั้น Google takeout ช่วยให้คุณสามารถดาวน์โหลดข้อมูลทั้งหมดของคุณจากบริการต่าง ๆ ของ Google 25 บริการไม่ใช่ Google ไดรฟ์
Bjarke Freund-Hansen

@ BjarkeFreund-Hansen 1) บริการจำนวน 25 รายการเหล่านั้นสามารถบันทึกลงใน GDrive และสำรองข้อมูลอัตโนมัติโดยเป็นส่วนหนึ่งของการสำรองข้อมูล GDrive อัตโนมัติ 2) บริการที่เหลือส่วนใหญ่ไม่มีจุดหมายในการสำรองข้อมูล (+1, แวดวง ฯลฯ ) หรือหมดอายุ (Google Code) 3) ฉันเบื่อที่จะอธิบายเรื่องนี้กับคนที่ไม่มีคำตอบที่ดีกว่า ฉันค่อนข้างแน่ใจว่าไม่มีวิธีที่จะทำให้ซื้อกลับบ้านอัตโนมัติ (นอกเหนือจากการใช้มาโครฝั่งไคลเอ็นต์ซึ่งยังไม่น่าเชื่อถือมาก) 4) ถ้าคุณสามารถพิสูจน์ฉันผิดแล้วโพสต์ทางออกที่ดีกว่าของคุณและเราสามารถพูดคุย ถ้าไม่เช่นนั้นให้อ้างอิงความคิดเห็นก่อนหน้าของฉันเกี่ยวกับปัญหาเดียวกันนี้
krowe

6
@krowe: Gmail, ปฏิทิน, รายชื่อติดต่อ, ภาพถ่าย, ประวัติแฮงเอาท์และประวัติตำแหน่งเป็นบริการที่ฉันใช้อย่างกว้างขวางและต้องการให้แน่ใจว่ากับการสูญหายของข้อมูลที่ Google ไม่มีข้อมูลของบริการเหล่านั้นรวมอยู่ใน Google ไดรฟ์ เพียงเพราะฉันไม่รู้ทางออกที่ดีกว่าหรือมีอยู่จริงไม่ทำให้คุณตอบถูกต้องอีกต่อไป อีกครั้งฉันไม่ได้บอกว่าคุณตอบไม่ดีมันก็ไม่ตอบคำถามจริง
Bjarke Freund-Hansen

@ BjarkeFreund-Hansen ฉันเข้าใจถึงความคับข้องใจของคุณและบริการบางอย่างที่สามารถซิงค์กับ GDrive ของคุณได้ (ดังนั้นพวกเขาจะสำรองข้อมูลไว้ด้วย) ตัวอย่างเช่น Google ภาพถ่ายสามารถทำเช่นนั้น: การสำรองข้อมูลภาพถ่าย ฉันเชื่อว่าสามารถซิงค์ปฏิทินและที่อยู่ติดต่อได้ในลักษณะเดียวกัน GMail สามารถได้รับการสนับสนุนเป็นอย่างดี: การสำรองข้อมูล GMail สิ่งอื่น ๆ ที่คุณพูดถึงฉันไม่รู้ แต่ส่วนใหญ่เป็นเพราะฉันไม่อยากสำรองข้อมูล
krowe

2

นี่คือคำตอบบางส่วนด้วยการทำงานอัตโนมัติบางส่วน มันอาจหยุดทำงานในอนาคตหาก Google เลือกที่จะปราบปรามการเข้าถึง Google Takeout โดยอัตโนมัติ ฟีเจอร์ที่รองรับในคำตอบนี้:

+ --------------------------------------------- + --- --------- + --------------------- +
| คุณสมบัติอัตโนมัติ อัตโนมัติ? | รองรับแพลตฟอร์ม |
+ --------------------------------------------- + --- --------- + --------------------- +
| เข้าสู่ระบบบัญชี Google ไม่ | |
| รับคุกกี้จาก Mozilla Firefox | ใช่ Linux |
| รับคุกกี้จาก Google Chrome | ใช่ Linux, macOS |
| ร้องขอการสร้างที่เก็บถาวร | ไม่ | |
| กำหนดการสร้างคลังข้อมูล | คินดา เว็บไซต์ซื้อกลับบ้าน
| ตรวจสอบว่ามีการสร้างที่เก็บถาวรหรือไม่ ไม่ | |
| รับรายการที่เก็บถาวร ใช่ ข้ามแพลตฟอร์ม |
| ดาวน์โหลดไฟล์เก็บถาวรทั้งหมด ใช่ Linux, macOS |
| เข้ารหัสไฟล์เก็บถาวรที่ดาวน์โหลดมา | ไม่ | |
| อัปโหลดไฟล์เก็บถาวรที่ดาวน์โหลดไปยัง Dropbox | ไม่ | |
| อัปโหลดไฟล์เก็บถาวรที่ดาวน์โหลดไปยัง AWS S3 | ไม่ | |
+ --------------------------------------------- + --- --------- + --------------------- +

ประการแรกโซลูชันระบบ Cloud-to-Cloud ใช้งานไม่ได้เพราะไม่มีส่วนต่อประสานระหว่าง Google Takeout และผู้ให้บริการที่เก็บข้อมูลวัตถุที่รู้จัก คุณต้องประมวลผลไฟล์สำรองข้อมูลในเครื่องของคุณเอง (ซึ่งอาจเป็นโฮสต์ในระบบคลาวด์สาธารณะหากคุณต้องการ) ก่อนที่จะส่งออกไปยังผู้ให้บริการที่เก็บข้อมูลวัตถุของคุณ

ประการที่สองเนื่องจากไม่มี Google Takeout API สคริปต์อัตโนมัติจะต้องแกล้งเป็นผู้ใช้ที่มีเบราว์เซอร์ที่จะดำเนินการสร้างและดาวน์โหลดโฟลว์การเก็บถาวรของ Google Takeout


คุณสมบัติอัตโนมัติ

เข้าสู่ระบบบัญชี Google

สิ่งนี้ยังไม่เป็นอัตโนมัติ สคริปต์จะต้องแสร้งทำเป็นเบราว์เซอร์และสำรวจสิ่งกีดขวางที่เป็นไปได้เช่นการตรวจสอบสิทธิ์แบบสองปัจจัย CAPTCHAs และการตรวจคัดกรองความปลอดภัยที่เพิ่มขึ้นอื่น ๆ

รับคุกกี้จาก Mozilla Firefox

ฉันมีสคริปต์สำหรับผู้ใช้ Linux เพื่อคว้าคุกกี้ 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 เพื่อคว้าคุกกี้ 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 แล้วส่ง

กำหนดการสร้างคลังข้อมูล

ยังไม่มีวิธีอัตโนมัติในการทำเช่นนี้ แต่ในเดือนพฤษภาคม 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 กับ regex

ดาวน์โหลดไฟล์เก็บถาวรทั้งหมด

นี่คือรหัสใน Bash เพื่อรับ URL ของไฟล์เก็บถาวรและดาวน์โหลดทั้งหมดโดยถือว่ามีการตั้งค่าคุกกี้เป็นตัวแปรสภาพแวดล้อมในส่วน "รับคุกกี้" ด้านบน:

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

0

ฉันพบคำถามนี้ขณะค้นหาวิธีแก้ไข Google Photos ของฉันที่แสดงไม่ถูกต้องใน Google ไดรฟ์ (ซึ่งฉันสำรองไว้โดยอัตโนมัติแล้ว!)

ดังนั้นเพื่อให้รูปภาพของคุณปรากฏใน Google ไดรฟ์ให้ไปที่https://photos.google.comการตั้งค่าและตั้งให้แสดงรูปภาพในโฟลเดอร์ในไดรฟ์

จากนั้นใช้https://github.com/ncw/rcloneเพื่อโคลน Google ไดรฟ์ทั้งหมดของคุณ (ซึ่งตอนนี้มีรูปภาพเป็นไดเรกทอรี 'ปกติ') ลงในที่เก็บข้อมูลในเครื่องของคุณ


rclone ดูดีดูเหมือนว่าเป็นโครงการที่ครบกำหนด แค่ทางออกที่ฉันกำลังมองหา
steampowered

เป็นเรื่องที่ดีจริงๆ สรรพสิ่งที่มีภาพถ่ายหลายพันของฉันตอนนี้ใช้เวลาสักครู่ในการกระทืบพวกเขา ฉันสงสัยว่าฉันสามารถดาวน์โหลดทุกอย่างแบบสุ่มได้หรือไม่
djsmiley2k - CoW
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.