Python · Google Drive ↔ OneDrive · راهنمای مهندسی متن‌باز

ساخت انتقالی ایمن میان Google Drive و OneDrive با Python

این راهنما فرایند کپی ابری را که برخلاف ظاهرش دشوار است، به یک خط لوله شفاف تبدیل می‌کند: فهرست‌برداری، بررسی مقدماتی، مرحله‌بندی، محاسبه هش، آپلود، دانلود مجدد، مقایسه، ثبت نقطه بررسی و تنها پس از آن آزادکردن فضای دیسک محلی.

به‌روزرسانی‌شده ; 22 دقیقه زمان مطالعه.

پاسخ کوتاه

برای انتقال مدیریت‌شده، FileArk این گردش کار را خودکار می‌کند، بدون اینکه رایانه شما مسیر عبور داده‌ها باشد. این سرویس با بارهای کاری انتقال چندترابایتی آزمایش شده است و پیش از اعلام موفقیت، دریافت داده از مبدأ، پذیرش بارگذاری توسط ارائه‌دهنده و شیء مقصد را بررسی می‌کند. اگر لازم است خط لوله را خودتان اجرا کنید، برنامه Python با مجوز MIT در ادامه، فایل‌ها را با رویکردی محافظه‌کارانه از طریق دستگاه شما کپی می‌کند و هرگز فایل‌های مبدأ را حذف نمی‌کند.

پیش از انتخاب کد، مدل عملیاتی را انتخاب کنید

وقتی کتابخانه بزرگ است، اتصال باید بدون نظارت ادامه پیدا کند یا نباید داده‌ها از لپ‌تاپ عبور کنند، استفاده از یک سرویس انتقال مستقیم ابری انتخابی عملی است. FileArk انتقال را آنلاین نگه می‌دارد، پاسخ‌های ارائه‌دهندگان را پایش می‌کند، خطاهای قابل‌بازیابی را دوباره امتحان می‌کند و نمایی یکپارچه از پیشرفت در اختیارتان می‌گذارد. مسیر اعتبارسنجی آن پیش از کامل تلقی‌کردن هر فایل، سه بررسی مستقل انجام می‌دهد.

وقتی به کنترل کامل برنامه‌های OAuth، دیسک‌های مرحله‌بندی، گزارش‌ها یا خط‌مشی پوشه مقصد نیاز دارید، یک اسکریپت محلی مفید است. نقطه مقابل آن، مسئولیت عملیاتی است: دستگاه شما باید آنلاین بماند، اتصال شبکه آن به گلوگاه تبدیل می‌شود، اطلاعات احراز هویت OAuth باید محافظت شوند و فضای موقت کافی برای دسته فعال و نسخه راستی‌آزمایی در دسترس بماند.

برنامه منتشرشده در اینجا عمداً محافظه‌کارانه طراحی شده است. این برنامه فایل‌ها را از ریشه یک درایو شخصی به پوشه‌ای جدید در مقصد کپی می‌کند. هیچ روشی برای حذف ارائه نمی‌دهد، در صورت تداخل بازنویسی نمی‌کند، پس از راستی‌آزمایی یک نقطه بررسی ماندگار ذخیره می‌کند و هرگاه ظرفیت محلی یا مقصد از فضای ذخیره پیکربندی‌شده شما کمتر شود، متوقف می‌شود.

خط لوله انتقال و مرزهای بروز خطا در آن

  1. از ساختار درختی مبدأ فهرست تهیه کنید

    آداپتور مبدأ پوشه‌ها را به‌صورت بازگشتی پیمایش می‌کند، صفحه‌بندی ارائه‌دهنده را دنبال می‌کند، شناسه‌ها، مسیرها، انواع و اندازه‌های گزارش‌شده را ثبت می‌کند و فایل‌های بومی پشتیبانی‌شده Google را به قالب‌های قابل‌حمل برای خروجی‌گرفتن نگاشت می‌کند.

  2. پیش‌بررسی ظرفیت مقصد و فضای محلی

    موتور، مجموع بایت‌های در انتظار و فضای ذخیره قابل‌پیکربندی را با سهمیه مقصد مقایسه می‌کند. همچنین سیستم فایل مرحله‌بندی را پیش از هر دسته و هر دانلود منفرد بررسی می‌کند.

  3. مرحله‌بندی یک دسته با اندازه محدود

    فایل‌ها در دسته‌هایی پردازش می‌شوند که هم بر اساس مجموع بایت‌ها و هم تعداد فایل محدودند. فقط دسته فعلی از دیسک محلی استفاده می‌کند؛ بنابراین یک کتابخانه بزرگ به درایوی با همان اندازه نیاز ندارد.

  4. محاسبه هش و آپلود

    اسکریپت پس از دانلود، SHA-256 محلی را محاسبه می‌کند، هر اندازه مشخص‌شده از سوی مبدأ را بررسی می‌کند، پوشه‌های مقصد را می‌سازد و فایل‌ها را در قطعه‌های قابل‌ازسرگیری سازگار با ارائه‌دهنده آپلود می‌کند.

  5. راستی‌آزمایی و ثبت نقطه بررسی

    حالت پیش‌فرض، شیء جدید مقصد را دوباره دانلود و SHA-256 آن را مقایسه می‌کند. فقط فایلی که مطابقت داشته باشد در نقطه بررسی JSON ثبت و از فضای مرحله‌بندی محلی حذف می‌شود.

نسخه کامل Python با مجوز MIT را دانلود کنید

فایل دانلودی یک نقطه ورود خوانا و منفرد در Python است. SDKهای ارائه‌دهندگان فقط هنگام انتقال واقعی وارد می‌شوند؛ بنابراین فرمان‌های نسخه نمایشی و راهنما پیش از نصب وابستگی‌ها یا اطلاعات احراز هویت اجرا می‌شوند. یک فایل جداگانه نیازمندی‌ها، حداقل نسخه بسته‌های پشتیبانی‌شده را تثبیت می‌کند و مجوز نیز در کنار کد منبع ارائه شده است.

پیش از استفاده، کد را بخوانید؛ آن را با یک پوشه مقصد کوچک آزمایش کنید و برای داده‌های ارزشمند، راستی‌آزمایی پیش‌فرض از طریق دانلود مجدد را فعال نگه دارید. هیچ اسکریپت عمومی‌ای نمی‌تواند همه مجوزهای اشتراک‌گذاری، میان‌برها، برچسب‌های نگهداشت، قواعد درایوهای مشترک یا خط‌مشی‌های مستأجر را بازسازی کند.

دانلود برنامه انتقال Python
پیاده‌سازی مستقیم با Google Drive API و Microsoft Graph، همراه با پردازش دسته‌ای، نقاط بررسی، تلاش‌های مجدد، فضای ذخیره سهمیه و راستی‌آزمایی SHA-256 در مقصد.
fileark-cloud-transfer.py · Python 3.10+ · مجوز MIT

دانلود نیازمندی‌های Python
فهرستی کوچک از وابستگی‌ها برای Google OAuth و Drive، احراز هویت Microsoft، درخواست‌های Graph و پشتیبانی از تلاش مجدد.
requirements-fileark-cloud-transfer.txt · نیازمندی‌های pip · متن ساده

مجوز MIT را دانلود کنید
اطلاعیهٔ مجوز برای هر دو اسکریپت انتقال دستی FileArk.
LICENSE-fileark-cloud-transfer.txt · MIT · متن ساده

پیش از اعطای دسترسی ابری، مسیر ایمنی را ببینید

ترمینال در حال اجرای اسکریپت Python انتقال ابری FileArk در حالت نمایشی بدون شبکه
نسخه نمایشی داخلی، گردش کار قابل‌مشاهده برای اجراکننده را بدون اعتبارنامه یا فراخوانی شبکه آزمایش می‌کند. اجرای واقعی نیز همان وضعیت‌های ظرفیت، دسته، تأیید، نقطه بررسی و حذف از مبدأ را نمایش می‌دهد.

ابتدا نسخه نمایشی را اجرا کنید. این نسخه هیچ درخواست شبکه‌ای ارسال نمی‌کند و هیچ داده‌ای در فضای ابری نمی‌نویسد. خط پایانی عمداً کاملاً روشن است: صفر فایل از مبدأ حذف شده است. موتور واقعی همین توالی را از طریق گزارش‌های ساختاریافته ثبت می‌کند و با نخستین فایل راستی‌آزمایی‌نشده، با کد خروج غیرصفر متوقف می‌شود.

آزمون اولیه بدون شبکه
chmod +x fileark-cloud-transfer.py
python3 fileark-cloud-transfer.py --demo
python3 fileark-cloud-transfer.py --help

کلاینت‌های OAuth را بدون جاسازی اطلاعات محرمانه بسازید

برای Google Drive، در یک پروژه Google Cloud کلاینت OAuth دسکتاپ بسازید، Drive API را فعال کنید، صفحه رضایت را پیکربندی کنید و JSON کلاینت را دانلود کنید. مسیر آن را با --google-client-secret وارد کنید یا GOOGLE_OAUTH_CLIENT_SECRET_FILE را تنظیم کنید. اسکریپت دسترسی به Drive را درخواست می‌کند، زیرا باید فایل‌ها را فهرست و دانلود کند، پوشه بسازد، فایل آپلود کند و آن‌ها را راستی‌آزمایی کند.

برای OneDrive، یک برنامه کارخواه عمومی در Microsoft Entra ID ثبت کنید، جریان کد دستگاه را فعال کنید، مجوز تفویض‌شده Files.ReadWrite را بیفزایید و client ID برنامه را وارد کنید. برای حساب‌های شخصی و سازمانی common، برای حساب‌های کاری organizations یا، در صورت الزام خط‌مشی، یک tenant ID مشخص را انتخاب کنید.

توکن‌ها در فایل‌های محلی کش می‌شوند تا مهاجرت قطع‌شده بدون ورود دوباره از سر گرفته شود. JSON کلاینت و کش‌های توکن را اطلاعات محرمانه در نظر بگیرید: آن‌ها را از کنترل نسخه کنار بگذارید، مجوزهای سیستم فایل را محدود کنید، هرگز آن‌ها را در تیکت‌های پشتیبانی آپلود نکنید و پس از تأیید مهاجرت حذفشان کنید.

وابستگی‌ها را در محیطی ایزوله نصب کنید
python3 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements-fileark-cloud-transfer.txt

انتقال از Google Drive به OneDrive — یا در جهت معکوس — را اجرا کنید

تمام مقادیر مختص هویت بر عهده اجراکننده هستند. برنامه بدون client ID، کلید محرمانه، tenant، توکن، حساب راه‌دور یا اعتبارنامه مقصد ارائه می‌شود. فرمان نخست در مرورگر وارد Google و با کد دستگاه وارد Microsoft می‌شود، سپس فایل‌ها را در پوشه‌ای جدید در OneDrive کپی می‌کند.

برای اجرای انتقال از OneDrive به Google Drive، مبدأ و مقصد را جابه‌جا کنید. برای هر مهاجرت مستقل، از فایل وضعیت و ریشه مقصد متفاوتی استفاده کنید. نقطه بررسی، ارائه‌دهنده مبدأ، ارائه‌دهنده مقصد و ریشه را به یکدیگر مقید می‌کند و در صورت ناهماهنگی پیکربندی، از ادامه کار خودداری می‌کند.

انتقال از Google Drive به OneDrive با دسته‌های 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
جهت معکوس: از OneDrive به 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

چرا ظرفیت بیش از یک بار بررسی می‌شود؟

یک پیش‌بررسی ممکن است هنگام اجرای انتقالی طولانی منقضی و نامعتبر شود. ممکن است فردی فایل‌های دیگری در مقصد بارگذاری کند، سند Google صادرشده بزرگ‌تر از مقداری باشد که فراداده مبدأ نشان می‌دهد یا برنامه‌های نامرتبط فضای دیسک محلی را مصرف کنند. بنابراین موتور، ظرفیت کلی مقصد را پیش از شروع، ظرفیت مقصد را در هر دسته، ظرفیت مقصد را دوباره پس از هر دانلود محلی و فضای دیسک محلی را پیش از هر کپی مرحله‌بندی یا تأیید بررسی می‌کند.

مقادیر ذخیره، حاشیه اطمینان عملیاتی هستند و برآوردی از حجم انتقال نیستند. آن‌ها را به‌اندازه کافی بزرگ در نظر بگیرید تا به‌روزرسانی‌های سیستم‌عامل، تأخیر در محاسبه سهمیه توسط ارائه‌دهنده و سایر کاربران همان سهمیه فضای ابری را پوشش دهند. اگر ارائه‌دهنده مقدار محدودی برای سهمیه باقی‌مانده اعلام نکند، اسکریپت هشدار می‌دهد و به اعمال محدودیت از سوی ارائه‌دهنده متکی می‌شود؛ این روش از پیش‌بررسی مبتنی بر مقدار مشخص ضعیف‌تر است و به پایش فعال نیاز دارد.

اصل تغییرناپذیر توقف ایمن هنگام نامشخص‌بودن سهمیه
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."
        )

محدودکردن فضای مرحله‌بندی بر اساس حجم بایتی و تعداد

سقف بایت، میزان درگیری فضای دیسک را کنترل می‌کند؛ سقف تعداد فایل نیز وقتی مبدأ صدها هزار شیء کوچک دارد، سربار API و سیستم فایل را کنترل می‌کند. فایلی بزرگ‌تر از سقف دسته می‌تواند به‌تنهایی یک دسته را تشکیل دهد؛ بنابراین فضای ذخیره باید متناسب با بزرگ‌ترین شیء منفرد تعیین شود.

اندازه پیش‌فرض هر قطعه 10 MiB است. این مقدار مضرب مشترکی از گام‌بندی 256 KiB در بارگذاری ازسرگرفتنی Google Drive و الزام قطعه‌های متوالی 320 KiB در Microsoft Graph است. اعتبارسنج خط فرمان، اندازه‌های ناسازگار قطعه را پیش از احراز هویت رد می‌کند.

برنامه‌ریز دسته با دو محدودیت
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

اسناد بومی Google را به‌صورت فایل‌های تبدیل‌شده پردازش کنید

پروژه‌های Google Docs، Sheets، Slides، Drawings و Apps Script جریان‌های بایتی معمولی و قابل‌دانلود نیستند. آداپتور Google آن‌ها را به‌ترتیب به DOCX، XLSX، PPTX، PNG و JSON صادر می‌کند و پسوندی قابل‌حمل به نام فایل می‌افزاید. پوشه‌ها پیمایش می‌شوند، اما مگر اینکه حاوی فایلی باشند، به‌صورت اشیای خالی آپلود نمی‌شوند.

تبدیل می‌تواند قلم‌ها، فرمول‌ها، نظرها، اشیای جاسازی‌شده، چیدمان صفحه و تاریخچه همکاری را تغییر دهد. نقاط پایانی خروجی Google نیز محدودیت‌هایی برای قالب و اندازه اعمال می‌کنند. اسکریپت به‌جای ساختن یک نمایش ساختگی، انواع بومی پشتیبانی‌نشده را با هشدار نادیده می‌گیرد. نمونه‌هایی از فایل‌های تبدیل‌شده را به‌صورت دستی بررسی کنید.

میان‌برها، درایوهای مشترک، فایل‌هایی که با شما به اشتراک گذاشته شده‌اند اما در My Drive قرار ندارند، بسته‌های OneNote، فراداده نگهداشت سازمانی، تاریخچه نسخه‌ها و ACLهای اشتراک‌گذاری خارج از محدوده این نسخه‌اند. به‌دلیل همین محدودیت‌ها، نباید یک کپی فایل را مهاجرت کامل مستأجر توصیف کرد.

برای تطبیق دقیق بایت‌ها، از راستی‌آزمایی کامل با دانلود مجدد از مقصد استفاده کنید

موفقیت بارگذاری نزد ارائه‌دهنده ضروری است، اما کافی نیست. اسکریپت پس از بارگذاری، ابتدا اندازه ثبت‌شده در فراداده مقصد را با فایل مرحله‌بندی‌شده مقایسه می‌کند. سپس در حالت پیش‌فرض دانلود مجدد، شیء مقصد را در یک فایل موقت هم‌سطح دانلود می‌کند، SHA-256 را محاسبه می‌کند و این چکیده را با چکیده مبدأ مرحله‌بندی‌شده مقایسه می‌کند.

فقط تطبیق اندازه و چکیده باعث ایجاد ورودی نقطه بررسی می‌شود. نقطه بررسی، شناسه مبدأ، اندازه گزارش‌شده از سوی مبدأ، شناسه مقصد، مسیر مقصد، بایت‌های واقعی، هر دو چکیده و زمان تکمیل برحسب UTC را ثبت می‌کند. اگر مسیر مبدأ ثبت‌شده در نقطه بررسی بعداً به شناسه یا اندازه دیگری اشاره کند، اسکریپت به‌جای رد بی‌سروصدای داده تغییرکرده متوقف می‌شود.

دانلود مجدد، ترافیک خواندن در سمت مقصد را دو برابر می‌کند و موقتاً به فضای لازم برای فایل مرحله‌بندی‌شده و نسخه راستی‌آزمایی نیاز دارد. حالت فراداده را فقط زمانی انتخاب کنید که این هزینه را درک کرده‌اید و فرایندی مستقل برای راستی‌آزمایی محتوا وجود دارد.

تأیید بایت‌های فایل مقصد
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,
}

ادامه کار بدون تلقی عدم قطعیت به‌عنوان موفقیت

برنامه وضعیت را به‌شکل اتمی، با استفاده از یک فایل موقت و سپس تغییر نام آن می‌نویسد. مورد راستی‌آزمایی‌شده فقط پس از این نوشتن ماندگار از محل مرحله‌بندی محلی حذف می‌شود. اجرای دوباره همان فرمان، موارد ثبت‌شده در نقطه بررسی را رد می‌کند و با مسیرهای در انتظار ادامه می‌دهد.

ممکن است پس از پذیرش بارگذاری توسط ارائه‌دهنده، اما پیش از ثبت نقطه بررسی، برنامه از کار بیفتد. چون رفتار هنگام تداخل روی fail تنظیم شده است، اجرای بعدی به‌جای بازنویسی یا اعلام نادرست موفقیت، در همان مسیر موجود مقصد متوقف می‌شود. شیء را بررسی و مقایسه کنید؛ سپس با دقت یک ورودی بازیابی تأییدشده اضافه کنید یا انتقال را در یک ریشه مقصد جدید از ابتدا اجرا کنید.

انقضای OAuth، محدودسازی نرخ، خطاهای موقت سرور و قطعه‌های متوقف‌شده، در محدوده‌هایی مشخص دوباره امتحان می‌شوند. خطاهای احراز هویت یا خطاهای مداوم مجوز، برنامه را متوقف می‌کنند. گزارش‌ها، نقطه بررسی و محتوای فضای مرحله‌بندی را تا زمانی که علت خطا را درک نکرده‌اید نگه دارید.

یک آزمون پذیرش واقعی اجرا کنید

  • با پوشه‌ای کوچک شامل فایل‌های خالی، فایل‌های بزرگ، مسیرهای عمیق، نام‌های Unicode و اسناد بومی Google شروع کنید.
  • ابتدا --dry-run را اجرا کنید و مجموع بایت‌های فهرست را با رابط ارائه‌دهنده مقایسه کنید.
  • در نخستین دسته عملیاتی، فضای آزاد محلی و سهمیه مقصد را مستقل از یکدیگر زیر نظر بگیرید.
  • تأیید از طریق دانلود مجدد را فعال نگه دارید و نقطه بررسی را همراه با سوابق انتقال خود بایگانی کنید.
  • نمونه‌هایی از فایل‌های PDF و Office، تصاویر، ویدئوها، فایل‌های فشرده و اسناد بومیِ تبدیل‌شده را در مقصد باز کنید.
  • تعداد مورد انتظار پوشه‌ها و فایل‌ها را مقایسه کنید، همه موارد ردشده یا ناموفق را بررسی کنید و دسترسی را با یک کاربر دیگر بیازمایید.
  • مبدأ را در یک دوره هم‌پوشانی مشخص بدون تغییر نگه دارید. این اسکریپت هرگز آن را حذف نمی‌کند.

پرسش‌های متداول

آیا اسکریپت Python هرگز فایل‌های مبدأ را حذف می‌کند؟

خیر. حذف از مبدأ پیاده‌سازی نشده است. موتور فایل‌ها را از مبدأ دانلود و در ریشه مقصدی جداگانه ذخیره می‌کند؛ تأیید موفق فقط نسخه موقت موجود در فضای مرحله‌بندی محلی را حذف می‌کند.

آیا می‌تواند در هر دو جهت انتقال دهد؟

بله. Google Drive یا OneDrive را به‌عنوان مبدأ و ارائه‌دهنده دیگر را به‌عنوان مقصد تنظیم کنید. برای هر مهاجرت از یک نقطه بررسی و ریشه مقصد منحصربه‌فرد استفاده کنید.

آیا مجوزهای اشتراک‌گذاری و تاریخچه فایل را حفظ می‌کند؟

خیر. این نسخه محتوای فعلی فایل‌ها و مسیر پوشه‌ها را کپی می‌کند. ACLهای اشتراک‌گذاری، پیوندهای عمومی، نسخه‌ها، دیدگاه‌ها، برچسب‌ها، خط‌مشی نگهداشت و فراداده مختص سازمان به مهاجرت و راستی‌آزمایی جداگانه نیاز دارند.

چرا فایل‌هایی را که همین حالا آپلود شده‌اند دوباره دانلود کنیم؟

پذیرفته‌شدن آپلود و اندازه فراداده ثابت نمی‌کنند که می‌توان دقیقاً همان بایت‌های مقصد را دوباره خواند. حالت دانلود مجدد، SHA-256 محتوای مقصد را محاسبه می‌کند و فقط در صورت تطبیق دقیق، نقطه بررسی ثبت می‌کند.

آیا این ابزار رسمی Google یا Microsoft است؟

خیر. این یک پیاده‌سازی مرجع مستقل از FileArk است که تحت مجوز MIT منتشر شده است. آن را بررسی کنید، با داده‌های غیرحیاتی بیازمایید و خط‌مشی‌های ارائه‌دهنده و سازمان خود را رعایت کنید.

منابع رسمی استفاده‌شده در این راهنما

مطالعه راهنما