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 · نص عادي

اطّلع على مسار الأمان قبل منح صلاحية الوصول إلى الخدمات السحابية

نافذة طرفية تشغّل برنامج FileArk النصي بلغة Python لنقل الملفات السحابية في وضع العرض التوضيحي بلا اتصال بالشبكة
يختبر العرض التوضيحي المدمج مسار العمل الذي يراه المشغّل من دون بيانات اعتماد أو استدعاءات للشبكة. ويعرض التشغيل الفعلي معلومات السعة والدفعات والتحقق ونقطة التحقق وحالة حذف المصدر نفسها.

شغّل العرض التوضيحي أولًا. فهو لا يجري أي اتصالات عبر الشبكة ولا يكتب أي بيانات في السحابة. والسطر الأخير واضح عن قصد: لم يُحذف أي ملف من المصدر. يصدر المحرك الفعلي التسلسل نفسه عبر سجلات منظّمة، وينهي التنفيذ برمز خروج غير صفري عند أول ملف لم يتم التحقق منه.

اختبار أولي بلا اتصال بالشبكة
chmod +x fileark-cloud-transfer.py
python3 fileark-cloud-transfer.py --demo
python3 fileark-cloud-transfer.py --help

إنشاء عملاء OAuth من دون تضمين الأسرار

بالنسبة إلى Google Drive، أنشئ عميل OAuth لسطح المكتب ضمن مشروع Google Cloud، وفعّل Drive API، واضبط شاشة الموافقة، ونزّل ملف JSON الخاص بالعميل. مرّر مساره باستخدام --google-client-secret أو عيّن GOOGLE_OAUTH_CLIENT_SECRET_FILE. يطلب البرنامج النصي الوصول إلى Drive لأنه يحتاج إلى عرض الملفات وتنزيلها وإنشاء المجلدات ورفع الملفات والتحقق منها.

بالنسبة إلى OneDrive، سجّل تطبيق عميل عام في Microsoft Entra ID، وفعّل مسار رمز الجهاز، وأضف الإذن المفوّض Files.ReadWrite، ثم مرّر معرّف عميل التطبيق. اختر common لحسابات الأفراد والمؤسسات، أو organizations لحسابات العمل، أو معرّف مستأجر محددًا عندما تتطلب السياسة ذلك.

تُخزّن الرموز المميزة مؤقتًا في ملفات محلية حتى يمكن استئناف عملية ترحيل متوقفة من دون تسجيل دخول جديد. تعامل مع ملف 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 — أو بالعكس

جميع القيم المرتبطة بالهوية تخصّ مشغّل البرنامج. لا يأتي البرنامج مع أي معرّف عميل أو سر أو مستأجر أو رمز مميز أو حساب بعيد أو بيانات اعتماد للوجهة. يسجّل الأمر الأول الدخول إلى 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. وهو مضاعف مشترك لدقة التحميل القابل للاستئناف في Google Drive، البالغة 256 KiB، ولمتطلب Microsoft Graph الذي يفرض أجزاءً متسلسلة بحجم 320 KiB. ترفض أداة التحقق في سطر الأوامر أحجام الأجزاء غير المتوافقة قبل المصادقة.

مخطط دفعات بحدَّين
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 وجداول بيانات Google وعروض Google التقديمية ورسومات Google ومشاريع Apps Script ليست تدفقات بايت عادية قابلة للتنزيل. ويصدّرها موصّل Google على الترتيب إلى DOCX وXLSX وPPTX وPNG وJSON، مع إضافة امتداد ملف قابل للنقل. ويجري اجتياز المجلدات، لكنها لا تُرفع بوصفها عناصر فارغة ما لم تحتوِ على ملف.

قد يؤدي التحويل إلى تغيير الخطوط والصيغ والتعليقات والعناصر المضمّنة وتخطيط الصفحات وسجل التعاون. كما تفرض نقاط نهاية التصدير في Google قيودًا على التنسيق والحجم. ويتخطى البرنامج النصي الأنواع الأصلية غير المدعومة مع إصدار تحذير بدلًا من ابتكار تمثيل لها. راجع يدويًا عينات ممثّلة من الملفات المحوّلة.

لا تشمل هذه النسخة الاختصارات ومساحات التخزين السحابي المشتركة والملفات التي تمت مشاركتها معك ولكنها غير موجودة في «ملفاتي» وحزم 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. راجع شفرته واختبره باستخدام بيانات غير بالغة الأهمية، والتزم بسياسات موفّر الخدمة ومؤسستك.

المصادر الرسمية المستخدمة في هذا الدليل

اقرأ الدليل