Python · Google Drive ↔ OneDrive · Hướng dẫn kỹ thuật nguồn mở

Xây dựng quy trình truyền Google Drive–OneDrive an toàn bằng Python

Hướng dẫn này biến một thao tác sao chép giữa các đám mây tưởng đơn giản nhưng thực tế rất khó thành một quy trình rõ ràng: liệt kê, kiểm tra trước, đưa vào vùng trung gian, tính hàm băm, tải lên, tải xuống lại, so sánh, tạo điểm kiểm tra rồi mới giải phóng dung lượng ổ đĩa cục bộ.

Cập nhật ; 22 phút đọc.

Câu trả lời ngắn gọn

Với quá trình di chuyển được quản lý, FileArk tự động hóa quy trình này mà không biến máy tính của bạn thành nơi dữ liệu trung chuyển. FileArk đã được kiểm thử với khối lượng công việc di chuyển nhiều terabyte và kiểm tra dữ liệu nhận từ nguồn, việc nhà cung cấp chấp nhận tệp tải lên và đối tượng tại đích trước khi báo thành công. Nếu cần tự vận hành quy trình, chương trình Python theo giấy phép MIT dưới đây sẽ thực hiện sao chép thận trọng qua máy của bạn và không bao giờ xóa tệp nguồn.

Chọn mô hình vận hành trước khi chọn mã

Dịch vụ di chuyển trực tiếp giữa các đám mây là lựa chọn thiết thực khi thư viện có dung lượng lớn, kết nối cần chạy mà không có người giám sát hoặc bạn không muốn dữ liệu đi qua máy tính xách tay. FileArk duy trì quá trình truyền trực tuyến, theo dõi phản hồi của nhà cung cấp, thử lại các lỗi có thể khắc phục và cung cấp một chế độ xem tiến trình thống nhất. Quy trình xác thực của FileArk thực hiện ba bước kiểm tra độc lập trước khi coi một tệp là hoàn tất.

Tập lệnh cục bộ hữu ích khi bạn cần toàn quyền kiểm soát ứng dụng OAuth, ổ đĩa trung gian, nhật ký hoặc chính sách thư mục đích. Đổi lại, bạn phải chịu trách nhiệm vận hành: máy tính phải luôn trực tuyến, kết nối mạng trở thành điểm nghẽn, thông tin xác thực OAuth phải được bảo vệ và phải luôn có đủ dung lượng đĩa tạm cho lô đang xử lý cùng bản sao xác minh.

Chương trình được phát hành tại đây chủ ý áp dụng cách tiếp cận thận trọng. Chương trình sao chép từ thư mục gốc của một ổ đĩa cá nhân vào một thư mục đích mới. Chương trình không cung cấp phương thức xóa, không ghi đè khi có xung đột, lưu điểm kiểm tra bền vững sau khi xác minh và dừng khi dung lượng cục bộ hoặc dung lượng đích thấp hơn mức dự phòng bạn đã cấu hình.

Quy trình truyền và các ranh giới lỗi

  1. Lập danh mục cây thư mục nguồn

    Bộ điều hợp nguồn duyệt đệ quy các thư mục, xử lý cơ chế phân trang của nhà cung cấp, ghi lại ID, đường dẫn, loại và kích thước được báo cáo, đồng thời ánh xạ các tệp gốc của Google được hỗ trợ sang định dạng xuất có tính di động.

  2. Kiểm tra trước dung lượng đích và dung lượng cục bộ

    Công cụ so sánh tổng số byte đang chờ cộng với phần dự phòng có thể cấu hình với hạn ngạch tại đích. Công cụ cũng kiểm tra hệ thống tệp trung gian trước mỗi lô và mỗi lần tải xuống riêng lẻ.

  3. Đưa một lô có giới hạn vào vùng trung gian

    Các tệp được xử lý theo lô, chịu giới hạn cả về tổng số byte lẫn số lượng tệp. Chỉ lô hiện tại sử dụng ổ đĩa cục bộ, vì vậy một thư viện lớn không đòi hỏi ổ đĩa có dung lượng tương đương.

  4. Tính hàm băm và tải lên

    Sau khi tải xuống, tập lệnh tính SHA-256 cục bộ, kiểm tra kích thước nguồn nếu đã biết, tạo các thư mục đích rồi tải lên theo các phần có thể tiếp tục và tương thích với nhà cung cấp.

  5. Xác minh và tạo điểm kiểm tra

    Chế độ mặc định tải lại đối tượng mới tại đích rồi so sánh SHA-256. Chỉ tệp khớp mới được ghi vào điểm kiểm tra JSON và bị xóa khỏi vùng tạm cục bộ.

Tải xuống phiên bản Python hoàn chỉnh theo giấy phép MIT

Bản tải xuống là một điểm đầu vào Python duy nhất, dễ đọc. Các SDK của nhà cung cấp chỉ được nhập khi thực hiện lần chuyển thực tế, vì vậy các lệnh minh họa và trợ giúp có thể chạy trước khi cài đặt phần phụ thuộc hoặc thông tin xác thực. Một tệp yêu cầu riêng cố định các gói tối thiểu được hỗ trợ, còn giấy phép được cung cấp bên cạnh mã nguồn.

Hãy đọc mã trước khi sử dụng, thử nghiệm với một thư mục đích nhỏ và giữ nguyên chế độ xác minh mặc định bằng cách tải xuống lại đối với dữ liệu có giá trị. Không có tập lệnh dùng chung nào có thể tái tạo mọi quyền chia sẻ, lối tắt, nhãn lưu giữ, quy tắc của bộ nhớ dùng chung hoặc chính sách của đối tượng thuê.

Tải xuống chương trình chuyển dữ liệu bằng Python
Bản triển khai trực tiếp bằng Google Drive API và Microsoft Graph, có xử lý theo lô, điểm kiểm tra, thử lại, dung lượng hạn ngạch dự phòng và xác minh SHA-256 tại đích.
fileark-cloud-transfer.py · Python 3.10+ · Giấy phép MIT

Tải xuống tệp yêu cầu của Python
Danh sách phần phụ thuộc nhỏ gọn cho Google OAuth và Drive, xác thực Microsoft, yêu cầu Graph và tính năng hỗ trợ thử lại.
requirements-fileark-cloud-transfer.txt · các gói pip bắt buộc · văn bản thuần túy

Tải giấy phép MIT xuống
Thông báo cấp phép áp dụng cho cả hai tập lệnh truyền thủ công của FileArk.
LICENSE-fileark-cloud-transfer.txt · MIT · văn bản thuần túy

Xem quy trình an toàn trước khi cấp quyền truy cập đám mây

Cửa sổ dòng lệnh đang chạy tập lệnh Python chuyển dữ liệu đám mây của FileArk ở chế độ minh họa không cần mạng
Bản minh họa tích hợp mô phỏng luồng thao tác dành cho người vận hành mà không cần thông tin xác thực hoặc lệnh gọi mạng. Khi chạy thực tế, chương trình sẽ hiển thị cùng các trạng thái về dung lượng, lô, xác minh, điểm kiểm tra và xóa dữ liệu nguồn.

Hãy chạy bản minh họa trước. Bản này không thực hiện lệnh gọi mạng và không ghi dữ liệu lên đám mây. Dòng cuối được viết rõ ràng có chủ ý: không có tệp nguồn nào bị xóa. Công cụ thực tế xuất cùng một chuỗi sự kiện qua nhật ký có cấu trúc và thoát với mã khác 0 ngay khi gặp tệp đầu tiên chưa được xác minh.

Kiểm thử nhanh không cần mạng
chmod +x fileark-cloud-transfer.py
python3 fileark-cloud-transfer.py --demo
python3 fileark-cloud-transfer.py --help

Tạo ứng dụng OAuth mà không nhúng thông tin bí mật

Đối với Google Drive, hãy tạo một ứng dụng OAuth dành cho máy tính trong dự án Google Cloud, bật Drive API, cấu hình màn hình đồng ý và tải tệp JSON của ứng dụng xuống. Truyền đường dẫn của tệp bằng --google-client-secret hoặc đặt GOOGLE_OAUTH_CLIENT_SECRET_FILE. Tập lệnh yêu cầu quyền truy cập Drive vì cần liệt kê và tải tệp xuống, tạo thư mục, tải tệp lên cũng như xác minh tệp.

Đối với OneDrive, hãy đăng ký một ứng dụng máy khách công khai trong Microsoft Entra ID, bật luồng mã thiết bị, thêm quyền được ủy quyền Files.ReadWrite và truyền ID máy khách của ứng dụng. Chọn common cho tài khoản cá nhân và tài khoản tổ chức, organizations cho tài khoản công việc hoặc một ID đối tượng thuê cụ thể khi chính sách yêu cầu.

Token được lưu vào bộ nhớ đệm trong các tệp cục bộ để quá trình di chuyển bị gián đoạn có thể tiếp tục mà không cần đăng nhập lại. Hãy coi tệp JSON của ứng dụng và bộ nhớ đệm token là thông tin bí mật: loại trừ chúng khỏi hệ thống quản lý phiên bản, hạn chế quyền truy cập trong hệ thống tệp, tuyệt đối không tải chúng lên phiếu hỗ trợ và xóa chúng sau khi quá trình di chuyển được nghiệm thu.

Cài đặt các phần phụ thuộc trong môi trường biệt lập
python3 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements-fileark-cloud-transfer.txt

Chạy từ Google Drive sang OneDrive — hoặc theo chiều ngược lại

Mọi giá trị dành riêng cho danh tính đều do người vận hành cung cấp. Chương trình không đi kèm ID máy khách, khóa bí mật, đối tượng thuê, mã thông báo, tài khoản từ xa hoặc thông tin xác thực của đích. Lệnh đầu tiên đăng nhập vào Google trong trình duyệt và vào Microsoft bằng mã thiết bị, sau đó sao chép dữ liệu vào một thư mục OneDrive mới.

Đảo nguồn và đích để chuyển từ OneDrive sang Google Drive. Hãy dùng một tệp trạng thái và thư mục gốc đích khác nhau cho mỗi lần di chuyển độc lập. Điểm kiểm tra liên kết nhà cung cấp nguồn, nhà cung cấp đích và thư mục gốc với nhau, đồng thời từ chối tiếp tục nếu cấu hình không khớp.

Từ Google Drive sang OneDrive theo các lô 8 GiB
export MICROSOFT_CLIENT_ID="your-public-client-id"
python fileark-cloud-transfer.py \
  --source google \
  --destination onedrive \
  --google-client-secret ./client_secret.json \
  --microsoft-tenant common \
  --destination-root "FileArk Manual Transfer 2026-07-25" \
  --batch-gib 8 \
  --batch-files 200 \
  --local-reserve-gib 15 \
  --destination-reserve-gib 10 \
  --verification redownload
Chiều ngược lại: OneDrive sang Google Drive
python fileark-cloud-transfer.py \
  --source onedrive \
  --destination google \
  --microsoft-client-id "$MICROSOFT_CLIENT_ID" \
  --google-client-secret ./client_secret.json \
  --destination-root "OneDrive archive 2026-07-25" \
  --state-file ./onedrive-to-google-state.json \
  --verification redownload

Vì sao dung lượng được kiểm tra nhiều lần

Một lần kiểm tra trước có thể trở nên lỗi thời trong khi quá trình truyền dài vẫn đang chạy. Người khác có thể tải thêm tệp lên đích, tài liệu Google đã xuất có thể lớn hơn thông tin siêu dữ liệu nguồn cho biết và các ứng dụng không liên quan có thể sử dụng dung lượng ổ đĩa cục bộ. Vì vậy, công cụ sẽ kiểm tra tổng dung lượng đích trước khi bắt đầu, kiểm tra dung lượng đích ở mỗi lô, kiểm tra lại dung lượng đích sau mỗi lần tải xuống cục bộ và kiểm tra ổ đĩa cục bộ trước mỗi bản sao dùng cho giai đoạn xử lý hoặc xác minh.

Các giá trị dự phòng là khoảng trống phục vụ vận hành, không phải ước tính kích thước truyền. Hãy đặt chúng đủ lớn để đáp ứng các bản cập nhật hệ điều hành, độ trễ hạch toán của nhà cung cấp và những người dùng khác cùng sử dụng hạn mức lưu trữ đám mây. Khi nhà cung cấp không cung cấp hạn mức hữu hạn còn lại, tập lệnh sẽ cảnh báo và dựa vào cơ chế thực thi giới hạn của nhà cung cấp; cách này kém chắc chắn hơn bước kiểm tra trước với hạn mức đã biết và cần được chủ động giám sát.

Điều kiện bất biến dừng an toàn khi không xác minh được hạn ngạch
def ensure_destination_capacity(quota, required, reserve):
    if quota.remaining is None:
        LOG.warning("Destination did not report a finite quota")
        return
    needed = required + reserve
    if quota.remaining < needed:
        raise RuntimeError(
            f"Destination is too small: {human_bytes(quota.remaining)} free, "
            f"{human_bytes(needed)} required including reserve."
        )

Giới hạn dung lượng vùng tạm theo số byte và số lượng tệp

Giới hạn byte kiểm soát mức sử dụng ổ đĩa; giới hạn số lượng tệp kiểm soát chi phí xử lý của API và hệ thống tệp khi nguồn chứa hàng trăm nghìn đối tượng nhỏ. Một tệp lớn hơn giới hạn của lô vẫn được phép tạo thành một lô chỉ có một tệp, vì vậy phần dung lượng dự phòng phải đủ cho đối tượng riêng lẻ lớn nhất.

Kích thước khối mặc định là 10 MiB. Đây là bội số chung của đơn vị chi tiết 256 KiB dành cho tính năng tải lên có thể tiếp tục của Google Drive và yêu cầu phân đoạn tuần tự 320 KiB của Microsoft Graph. Trình xác thực dòng lệnh sẽ từ chối các kích thước khối không tương thích trước khi xác thực.

Bộ lập kế hoạch lô với hai giới hạn
def batches(files, max_bytes, max_files):
    batch, batch_size = [], 0
    for item in files:
        planned_size = max(item.size, 1)
        if batch and (
            len(batch) >= max_files
            or batch_size + planned_size > max_bytes
        ):
            yield batch
            batch, batch_size = [], 0
        batch.append(item)
        batch_size += planned_size
    if batch:
        yield batch

Xử lý tài liệu gốc của Google bằng cách chuyển đổi

Google Docs, Sheets, Slides, Drawings và các dự án Apps Script không phải là luồng byte thông thường có thể tải xuống. Bộ điều hợp Google lần lượt xuất chúng sang DOCX, XLSX, PPTX, PNG và JSON, đồng thời thêm phần mở rộng tên tệp có tính di động. Các thư mục được duyệt qua nhưng không được tải lên dưới dạng đối tượng rỗng, trừ khi chúng chứa tệp.

Quá trình chuyển đổi có thể làm thay đổi phông chữ, công thức, nhận xét, đối tượng nhúng, bố cục trang và lịch sử cộng tác. Các điểm cuối xuất dữ liệu của Google cũng áp đặt giới hạn về định dạng và kích thước. Tập lệnh sẽ bỏ qua các loại tài liệu gốc không được hỗ trợ và đưa ra cảnh báo thay vì tự tạo một dạng biểu diễn. Hãy xem xét thủ công các tệp đã chuyển đổi tiêu biểu.

Phiên bản này không hỗ trợ lối tắt, bộ nhớ dùng chung, tệp được chia sẻ với bạn nhưng không nằm trong My Drive, gói OneNote, siêu dữ liệu lưu giữ của tổ chức, lịch sử phiên bản và ACL chia sẻ. Do những giới hạn này, không nên mô tả việc sao chép tệp là một quy trình di chuyển toàn bộ đối tượng thuê.

Tải xuống lại toàn bộ từ đích để xác minh từng byte chính xác

Tải lên thành công theo xác nhận của nhà cung cấp là điều kiện cần nhưng chưa đủ. Sau khi tải lên, trước tiên tập lệnh so sánh kích thước trong siêu dữ liệu tại đích với tệp trong vùng tạm. Sau đó, ở chế độ tải lại mặc định, tập lệnh tải đối tượng tại đích xuống một tệp tạm cùng cấp, tính SHA-256 và so sánh giá trị băm đó với giá trị băm của tệp nguồn trong vùng tạm.

Chỉ khi cả kích thước và giá trị băm đều khớp thì một mục mới được ghi vào điểm kiểm tra. Điểm kiểm tra ghi lại ID nguồn, kích thước do nguồn báo cáo, ID đích, đường dẫn đích, số byte thực tế, cả hai giá trị băm và thời gian hoàn tất theo UTC. Nếu một đường dẫn nguồn đã có trong điểm kiểm tra sau đó trỏ đến ID hoặc kích thước khác, tập lệnh sẽ dừng thay vì âm thầm bỏ qua dữ liệu đã thay đổi.

Việc tải xuống lại làm tăng gấp đôi lưu lượng đọc ở phía đích và tạm thời cần đủ dung lượng cho cả tệp trung gian lẫn bản sao xác minh. Chỉ chọn chế độ siêu dữ liệu khi bạn hiểu rõ chi phí này và đã có một quy trình xác minh nội dung độc lập.

Xác minh số byte tại đích
destination.redownload(uploaded, verification_copy)
verification_hash = sha256_file(verification_copy)
if verification_hash != local_hash:
    raise RuntimeError(
        f"SHA-256 mismatch after destination re-download: {relative!r}."
    )

state["completed"][relative] = {
    "source_id": item.id,
    "destination_id": uploaded.id,
    "bytes": actual_size,
    "sha256": local_hash,
    "destination_sha256": verification_hash,
}

Tiếp tục mà không coi trạng thái chưa chắc chắn là thành công

Chương trình ghi trạng thái theo cách nguyên tử thông qua một tệp tạm rồi đổi tên tệp đó. Một mục đã xác minh chỉ bị xóa khỏi vùng trung gian cục bộ sau khi quá trình ghi bền vững này hoàn tất. Việc chạy lại cùng một lệnh sẽ bỏ qua các mục đã có trong điểm kiểm tra và tiếp tục với những đường dẫn đang chờ xử lý.

Sự cố có thể xảy ra sau khi nhà cung cấp chấp nhận tệp tải lên nhưng trước khi điểm kiểm tra được ghi. Vì hành vi khi xảy ra xung đột được đặt là fail, lần chạy tiếp theo sẽ dừng tại đường dẫn đích đã tồn tại đó thay vì ghi đè hoặc báo thành công sai. Hãy kiểm tra đối tượng, so sánh đối tượng đó, rồi thận trọng thêm một mục khôi phục đã xác minh hoặc khởi động lại với một thư mục gốc đích mới.

Các trường hợp OAuth hết hạn, giới hạn tốc độ, lỗi máy chủ tạm thời và khối dữ liệu bị gián đoạn sẽ được thử lại trong giới hạn xác định. Lỗi xác thực hoặc lỗi quyền truy cập kéo dài sẽ dừng chương trình. Hãy giữ lại nhật ký, điểm kiểm tra và nội dung vùng tạm cho đến khi bạn hiểu rõ nguyên nhân lỗi.

Thực hiện kiểm thử nghiệm thu thực tế

  • Hãy bắt đầu với một thư mục nhỏ chứa tệp trống, tệp lớn, đường dẫn nhiều cấp, tên Unicode và tài liệu gốc của Google.
  • Trước tiên, hãy chạy --dry-run rồi so sánh tổng số byte trong danh mục với giao diện của nhà cung cấp.
  • Theo dõi riêng dung lượng trống cục bộ và hạn ngạch tại đích trong lô vận hành thực tế đầu tiên.
  • Duy trì bật tính năng xác minh bằng cách tải lại và lưu trữ điểm kiểm tra cùng hồ sơ di chuyển của bạn.
  • Mở thử các tệp PDF, tệp Office, hình ảnh, video, tệp lưu trữ và tài liệu gốc đã chuyển đổi tiêu biểu tại đích.
  • So sánh số lượng thư mục và tệp dự kiến, điều tra mọi mục bị bỏ qua hoặc thất bại, đồng thời kiểm tra quyền truy cập từ một người dùng thứ hai.
  • Giữ nguyên nguồn trong một khoảng thời gian chồng lấn đã xác định. Tập lệnh này không bao giờ xóa nguồn.

Câu hỏi thường gặp

Tập lệnh Python có bao giờ xóa tệp nguồn không?

Không. Tính năng xóa dữ liệu nguồn không được triển khai. Công cụ tải xuống từ nguồn và ghi vào một thư mục gốc đích riêng biệt; khi xác minh thành công, công cụ chỉ xóa bản sao tạm trong vùng lưu trữ cục bộ.

Tập lệnh có thể chuyển theo cả hai chiều không?

Có. Đặt Google Drive hoặc OneDrive làm nguồn và nhà cung cấp còn lại làm đích. Hãy dùng một điểm kiểm tra và thư mục gốc đích riêng biệt cho mỗi lần di chuyển.

Tập lệnh có giữ nguyên quyền chia sẻ và lịch sử tệp không?

Không. Phiên bản này sao chép nội dung hiện tại của tệp và các đường dẫn thư mục. ACL chia sẻ, liên kết công khai, phiên bản, nhận xét, nhãn, chính sách lưu giữ và siêu dữ liệu riêng của tổ chức cần được di chuyển và xác minh riêng.

Tại sao phải tải xuống lại những tệp vừa được tải lên?

Việc đích chấp nhận tệp tải lên và kích thước trong siêu dữ liệu không chứng minh rằng có thể đọc lại chính xác các byte ở đích. Chế độ tải xuống lại tính SHA-256 trên nội dung tại đích và chỉ tạo điểm kiểm tra khi dữ liệu khớp hoàn toàn.

Đây có phải là công cụ chính thức của Google hoặc Microsoft không?

Không. Đây là bản triển khai tham khảo độc lập của FileArk, được phát hành theo giấy phép MIT. Hãy xem xét mã, thử nghiệm với dữ liệu không quan trọng và tuân thủ chính sách của nhà cung cấp cũng như tổ chức của bạn.

Các tài nguyên chính thức được sử dụng cho hướng dẫn này

Đọc hướng dẫn