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, צרו לקוח 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. זהו כפולה משותפת של יחידת ההעלאה הניתנת לחידוש בגודל 256 KiB של Google Drive ושל הדרישה של 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 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,
}

המשך הפעולה בלי להתייחס לאי-ודאות כהצלחה

התוכנה כותבת את המצב באופן אטומי באמצעות קובץ זמני ושינוי שם. פריט מאומת מוסר מאזור ההיערכות המקומי רק לאחר הכתיבה המתמשכת הזאת. הרצה חוזרת של אותה פקודה בדיוק מדלגת על פריטים שנשמרו בנקודת הביקורת וממשיכה בנתיבים הממתינים.

קריסה עלולה להתרחש לאחר שהספק מאשר העלאה אך לפני שנקודת הביקורת נכתבת. מכיוון שהתנהגות ההתנגשות מוגדרת לכשל, ההפעלה הבאה נעצרת בנתיב היעד הקיים במקום לדרוס אותו או לדווח בטעות על הצלחה. בדקו את האובייקט והשוו אותו, ואז הוסיפו בזהירות רשומת שחזור מאומתת או הפעילו מחדש עם שורש יעד חדש.

במקרה של תפוגת OAuth, הגבלת קצב, שגיאות שרת זמניות ומקטעים שנקטעו, מתבצעים ניסיונות חוזרים במסגרת מגבלות מוגדרות. כשלי אימות או הרשאות מתמשכים עוצרים את התוכנית. שמרו את היומנים, נקודת הביקורת ותכולת אחסון הביניים עד שתבינו את סיבת הכשל.

ביצוע בדיקת קבלה אמיתית

  • התחילו בתיקייה קטנה הכוללת קבצים ריקים, קבצים גדולים, נתיבים עמוקים, שמות Unicode ומסמכי Google מקוריים.
  • הריצו תחילה את --dry-run והשוו את סך הבתים במלאי לממשק של הספק.
  • עקבו בנפרד אחר השטח המקומי הפנוי ואחר מכסת היעד במהלך אצוות הייצור הראשונה.
  • השאירו את האימות באמצעות הורדה מחדש פעיל ושמרו את נקודת הביקורת בארכיון יחד עם רשומות ההעברה שלכם.
  • פתחו ביעד קובצי PDF, קובצי Office, תמונות, סרטונים, ארכיונים ומסמכים מקוריים שהומרו, המייצגים את סוגי הקבצים שהועברו.
  • השוו את מספרי התיקיות והקבצים הצפויים, בדקו כל פריט שדולג או נכשל ובדקו את הגישה באמצעות משתמש נוסף.
  • השאירו את המקור ללא שינוי במשך תקופת חפיפה מוגדרת. הסקריפט הזה לעולם אינו מוחק אותו.

שאלות נפוצות

האם סקריפט ה-Python מוחק אי פעם קבצים מהמקור?

לא. מחיקה מהמקור אינה ממומשת. המנוע מוריד מהמקור וכותב לשורש יעד נפרד; אימות מוצלח מסיר רק את העותק הזמני מאחסון הביניים המקומי.

האם הסקריפט יכול להעביר בשני הכיוונים?

כן. הגדירו את Google Drive או OneDrive כמקור ואת הספק האחר כיעד. השתמשו בנקודת ביקורת ובשורש יעד ייחודיים לכל העברה.

האם הסקריפט שומר על הרשאות השיתוף ועל היסטוריית הקבצים?

לא. מהדורה זו מעתיקה את התוכן הנוכחי של הקבצים ואת נתיבי התיקיות. רשימות בקרת גישה (ACL) לשיתוף, קישורים ציבוריים, גרסאות, תגובות, תוויות, מדיניות שמירה ומטא-נתונים ייחודיים לארגון מחייבים העברה ואימות נפרדים.

למה להוריד מחדש קבצים שזה עתה הועלו?

אישור ההעלאה וגודל המטא-נתונים אינם מוכיחים שאפשר לקרוא בחזרה מהיעד את אותם בתים בדיוק. מצב ההורדה החוזרת מחשב SHA-256 על תוכן היעד ושומר נקודת ביקורת רק במקרה של התאמה מדויקת.

האם זהו כלי רשמי של Google או Microsoft?

לא. זהו מימוש עזר עצמאי של FileArk, שפורסם ברישיון MIT. בדקו את הקוד, נסו אותו עם נתונים שאינם קריטיים ופעלו בהתאם למדיניות הספק והארגון שלכם.

מקורות רשמיים ששימשו להכנת המדריך

לקריאת המדריך