Python · Google Drive ↔ OneDrive · Guida tecnica open source

Creare un trasferimento sicuro tra Google Drive e OneDrive in Python

Questa guida trasforma una copia tra cloud, solo in apparenza semplice, in una pipeline esplicita: enumerazione, controlli preliminari, preparazione temporanea, calcolo dell'hash, caricamento, nuovo download, confronto, checkpoint e, solo a quel punto, liberazione dello spazio su disco locale.

Aggiornato ; 22 min di lettura.

In breve

Per una migrazione gestita, FileArk automatizza questo flusso di lavoro senza usare il tuo computer come piano dati. È stato testato con carichi di migrazione di diversi terabyte e, prima di segnalare l'esito positivo, verifica la ricezione dal sorgente, l'accettazione del caricamento da parte del provider e l'oggetto nella destinazione. Se preferisci gestire autonomamente la pipeline, il programma Python con licenza MIT riportato di seguito esegue una copia prudente tramite il tuo computer e non elimina mai i file dal sorgente.

Scegli il modello operativo prima del codice

Un servizio di migrazione diretta tra cloud è la scelta più pratica quando la raccolta di file è molto grande, la connessione deve funzionare senza supervisione o non si vuole che i dati transitino su un portatile. FileArk mantiene il trasferimento online, monitora le risposte dei provider, ritenta le operazioni dopo gli errori recuperabili e offre un'unica vista dell'avanzamento. Il suo processo di convalida esegue tre controlli indipendenti prima di considerare completo un file.

Uno script locale è utile quando serve il pieno controllo sulle applicazioni OAuth, sui dischi per l'area temporanea, sui log o sui criteri delle cartelle di destinazione. Il compromesso è la responsabilità operativa: il computer deve rimanere online, la connessione di rete diventa il collo di bottiglia, le credenziali OAuth devono essere protette e deve restare disponibile spazio temporaneo sufficiente per il batch attivo e la copia di verifica.

Il programma pubblicato qui è volutamente prudente. Copia i contenuti dalla radice di un'unità personale in una nuova cartella di destinazione. Non espone alcun metodo di eliminazione, non sovrascrive in caso di conflitto, salva un checkpoint persistente dopo la verifica e si arresta quando la capacità locale o quella della destinazione scende al di sotto della riserva configurata.

La pipeline di trasferimento e i limiti di gestione degli errori

  1. Crea l'inventario dell'albero di origine

    L'adattatore dell'origine percorre ricorsivamente le cartelle, segue la paginazione del provider, registra ID, percorsi, tipi e dimensioni dichiarate e associa i file Google nativi supportati a formati di esportazione portabili.

  2. Esegui un controllo preliminare della capacità locale e della destinazione

    Il motore confronta i byte in sospeso, più una riserva configurabile, con la quota della destinazione. Controlla inoltre il file system dell'area temporanea prima di ogni batch e di ogni singolo download.

  3. Prepara un batch con limiti definiti

    I file vengono elaborati in batch limitati sia per numero totale di byte sia per numero di file. Solo il batch corrente usa il disco locale, quindi una raccolta di grandi dimensioni non richiede un'unità di pari capacità.

  4. Calcola l'hash e carica

    Dopo il download, lo script calcola localmente l'hash SHA-256, controlla le dimensioni note dell'origine, crea le cartelle di destinazione ed esegue il caricamento in blocchi ripristinabili compatibili con il provider.

  5. Verifica e crea un checkpoint

    Nella modalità predefinita, il nuovo oggetto nella destinazione viene scaricato nuovamente e confrontato tramite SHA-256. Solo se il file corrisponde viene registrato nel checkpoint JSON e rimosso dall'area di staging locale.

Scarica la versione completa in Python con licenza MIT

Il download consiste in un unico punto di ingresso Python leggibile. Gli SDK dei provider vengono importati solo per un trasferimento reale, quindi i comandi di demo e guida funzionano prima dell'installazione delle dipendenze o delle credenziali. Un file dei requisiti separato specifica le versioni minime dei pacchetti supportati e la licenza è fornita insieme al codice sorgente.

Leggi il codice prima di usarlo, esegui una prova con una piccola cartella di destinazione e mantieni la verifica predefinita tramite nuovo download per i dati importanti. Nessuno script generico può riprodurre ogni autorizzazione di condivisione, collegamento, etichetta di conservazione, regola dei Drive condivisi o criterio del tenant.

Scarica il programma Python per il trasferimento
Implementazione diretta delle API Google Drive e Microsoft Graph con elaborazione in batch, checkpoint, nuovi tentativi, riserve di quota e verifica SHA-256 nella destinazione.
fileark-cloud-transfer.py · Python 3.10+ · Licenza MIT

Scarica i requisiti Python
Un elenco ridotto di dipendenze per OAuth e Drive di Google, l'autenticazione Microsoft, le richieste Graph e il supporto dei nuovi tentativi.
requirements-fileark-cloud-transfer.txt · requisiti pip · testo normale

Scarica la licenza MIT
Avviso sulle autorizzazioni relativo a entrambi gli script FileArk per il trasferimento manuale.
LICENSE-fileark-cloud-transfer.txt · MIT · testo normale

Esamina il percorso di sicurezza prima di concedere l'accesso al cloud

Terminale che esegue lo script Python di FileArk per il trasferimento tra cloud in modalità demo senza connessione di rete
La demo integrata mostra il flusso visibile all'operatore senza credenziali né chiamate di rete. Un'esecuzione reale mostra le stesse informazioni su capacità, batch, verifica, checkpoint e stato dell'eliminazione dal sorgente.

Esegui prima la demo. Non effettua chiamate di rete e non scrive dati nel cloud. L'ultima riga è volutamente inequivocabile: sono stati eliminati zero file di origine. Il motore reale genera la stessa sequenza tramite log strutturati e termina con un codice diverso da zero al primo file non verificato.

Smoke test senza connessione di rete
chmod +x fileark-cloud-transfer.py
python3 fileark-cloud-transfer.py --demo
python3 fileark-cloud-transfer.py --help

Crea client OAuth senza incorporare segreti

Per Google Drive, crea un client OAuth per applicazioni desktop in un progetto Google Cloud, abilita l'API Drive, configura la schermata per il consenso e scarica il JSON del client. Specificane il percorso con --google-client-secret oppure imposta GOOGLE_OAUTH_CLIENT_SECRET_FILE. Lo script richiede l'accesso a Drive perché deve elencare e scaricare i file, creare cartelle, caricare i file e verificarli.

Per OneDrive, registra un'applicazione client pubblica in Microsoft Entra ID, abilita il flusso con codice dispositivo, aggiungi l'autorizzazione delegata Files.ReadWrite e passa l'ID client dell'applicazione. Scegli common per gli account personali e aziendali, organizations per gli account di lavoro oppure un ID tenant specifico quando richiesto dai criteri.

I token vengono memorizzati nella cache in file locali, così una migrazione interrotta può riprendere senza un nuovo accesso. Tratta il JSON del client e le cache dei token come segreti: escludili dal controllo di versione, limita le autorizzazioni del file system, non caricarli mai nei ticket di assistenza e rimuovili dopo l'accettazione della migrazione.

Installa le dipendenze in un ambiente isolato
python3 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements-fileark-cloud-transfer.txt

Esegui il trasferimento da Google Drive a OneDrive o viceversa

Tutti i valori specifici dell'identità devono essere forniti dall'operatore. Il programma non include ID client, segreti, tenant, token, account remoti o credenziali della destinazione. Il primo comando esegue l'accesso a Google in un browser e a Microsoft tramite un codice dispositivo, quindi copia i file in una nuova cartella di OneDrive.

Inverti origine e destinazione per eseguire il trasferimento da OneDrive a Google Drive. Usa un file di stato e una radice di destinazione diversi per ogni migrazione indipendente. Il checkpoint associa il provider di origine, il provider di destinazione e la radice e impedisce la ripresa se la configurazione non corrisponde.

Da Google Drive a OneDrive con batch da 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
Direzione inversa: da OneDrive a 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

Perché la capacità viene controllata più volte

Un singolo controllo preliminare può diventare obsoleto durante un trasferimento prolungato. Qualcuno potrebbe caricare altri file nella destinazione, un documento Google esportato potrebbe essere più grande di quanto indicato dai metadati del sorgente e applicazioni non correlate potrebbero occupare spazio sul disco locale. Il motore verifica quindi la capacità complessiva della destinazione prima di iniziare, la ricontrolla per ogni batch e dopo ogni download locale e verifica lo spazio su disco locale prima di ogni copia di staging o di verifica.

I valori di riserva rappresentano un margine operativo, non una stima delle dimensioni del trasferimento. Impostali a un livello sufficiente per tenere conto degli aggiornamenti del sistema operativo, dei ritardi nella contabilizzazione da parte del provider e degli altri utenti che utilizzano la stessa quota cloud. Quando un provider non indica una quota residua finita, lo script mostra un avviso e si affida ai limiti applicati dal provider; questa modalità è meno affidabile rispetto a un controllo preliminare basato su un valore noto e richiede un monitoraggio attivo.

L'invariante della quota con arresto precauzionale
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."
        )

Limita l'area di staging per numero di byte e di file

Un limite massimo di byte controlla l'uso del disco; un limite massimo al numero di file controlla il sovraccarico delle API e del file system quando l'origine contiene centinaia di migliaia di oggetti di piccole dimensioni. Un file più grande del limite del batch è consentito come batch di un solo file, quindi la riserva deve essere dimensionata in base al singolo oggetto più grande.

La dimensione predefinita dei blocchi è 10 MiB. Si tratta di un multiplo comune della granularità di 256 KiB prevista da Google Drive per i caricamenti ripristinabili e del requisito di Microsoft Graph relativo ai frammenti sequenziali da 320 KiB. Prima dell'autenticazione, il validatore della riga di comando rifiuta le dimensioni dei blocchi non compatibili.

Pianificatore di batch con doppio limite
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

Gestisci i documenti nativi di Google tramite conversione

Documenti, Fogli, Presentazioni e Disegni Google, così come i progetti Apps Script, non sono normali flussi di byte scaricabili. L'adattatore Google li esporta rispettivamente nei formati DOCX, XLSX, PPTX, PNG e JSON, aggiungendo un'estensione di file portabile. Le cartelle vengono percorse, ma non caricate come oggetti vuoti se non contengono file.

La conversione può modificare caratteri, formule, commenti, oggetti incorporati, impaginazione e cronologia della collaborazione. Anche gli endpoint di esportazione di Google impongono vincoli di formato e dimensione. Lo script ignora i tipi nativi non supportati mostrando un avviso, anziché creare una rappresentazione arbitraria. Controlla manualmente alcuni file convertiti rappresentativi.

Collegamenti, Drive condivisi, file condivisi con te ma non presenti in Il mio Drive, pacchetti OneNote, metadati di conservazione dell'organizzazione, cronologia delle versioni e ACL di condivisione non sono inclusi in questa edizione. Per questi limiti, la copia dei file non deve essere descritta come una migrazione completa del tenant.

Usa la verifica completa tramite nuovo download dalla destinazione per controllare i byte esatti

Il completamento del caricamento da parte del provider è necessario, ma non sufficiente. Dopo il caricamento, lo script confronta innanzitutto la dimensione indicata nei metadati della destinazione con quella del file nell'area di staging. Nella modalità predefinita di nuovo download, scarica quindi l'oggetto di destinazione in un file temporaneo nella stessa cartella, calcola il valore SHA-256 e lo confronta con quello del sorgente nell'area di staging.

Solo la corrispondenza sia delle dimensioni sia del digest produce una voce nel checkpoint. Il checkpoint registra l'ID dell'origine, le dimensioni dichiarate dall'origine, l'ID della destinazione, il percorso di destinazione, i byte effettivi, entrambi i digest e l'ora di completamento in UTC. Se in seguito un percorso di origine registrato nel checkpoint punta a un ID o a dimensioni diversi, lo script si arresta anziché ignorare silenziosamente i dati modificati.

Scaricare nuovamente i file raddoppia il traffico di lettura sul lato della destinazione e richiede temporaneamente spazio sia per il file nell'area temporanea sia per la copia di verifica. Seleziona la modalità metadati solo quando questo costo è ben compreso ed esiste un processo indipendente di verifica dei contenuti.

Verifica byte per byte nella destinazione
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,
}

Riprendi senza considerare l'incertezza un successo

Il programma scrive lo stato in modo atomico tramite un file temporaneo e la successiva ridenominazione. Un elemento verificato viene rimosso dall'area temporanea locale solo dopo questa scrittura persistente. Eseguendo nuovamente lo stesso comando, gli elementi registrati nel checkpoint vengono ignorati e l'elaborazione continua con i percorsi in sospeso.

Può verificarsi un arresto anomalo dopo che il provider ha accettato un caricamento, ma prima della scrittura del checkpoint. Poiché per i conflitti è impostato il comportamento di errore, l'esecuzione successiva si interrompe in corrispondenza del percorso già esistente nella destinazione, anziché sovrascriverlo o dichiarare erroneamente l'esito positivo. Esamina e confronta l'oggetto, quindi aggiungi con cautela una voce di ripristino verificata oppure riavvia il trasferimento usando una nuova cartella radice di destinazione.

La scadenza di OAuth, i limiti di frequenza, gli errori temporanei del server e i blocchi interrotti vengono gestiti con nuovi tentativi entro limiti prestabiliti. Gli errori di autenticazione o i problemi persistenti relativi alle autorizzazioni interrompono il programma. Conserva i log, il checkpoint e il contenuto dell'area di staging finché non avrai compreso la causa dell'errore.

Esegui un vero test di accettazione

  • Inizia con una piccola cartella contenente file vuoti, file di grandi dimensioni, percorsi con molti livelli, nomi Unicode e documenti nativi di Google.
  • Esegui prima --dry-run e confronta il totale dei byte dell'inventario con quello mostrato nell'interfaccia del provider.
  • Durante il primo batch in produzione, monitora separatamente lo spazio libero locale e la quota della destinazione.
  • Mantieni attiva la verifica tramite nuovo download e archivia il checkpoint insieme alla documentazione della migrazione.
  • Apri nella destinazione alcuni file rappresentativi: PDF, documenti Office, immagini, video, archivi e documenti nativi convertiti.
  • Confronta il numero previsto di cartelle e file, esamina ogni elemento ignorato o non riuscito e verifica l'accesso da parte di un secondo utente.
  • Mantieni invariata l'origine per un periodo di sovrapposizione definito. Questo script non la elimina mai.

Domande frequenti

Lo script Python elimina mai i file di origine?

No. L'eliminazione dal sorgente non è implementata. Il motore scarica i file dal sorgente e li scrive in una cartella radice di destinazione separata; una verifica riuscita rimuove solo la copia temporanea dall'area di staging locale.

Può eseguire il trasferimento in entrambe le direzioni?

Sì. Imposta Google Drive o OneDrive come origine e l'altro provider come destinazione. Usa un checkpoint e una radice di destinazione univoci per ogni migrazione.

Mantiene le autorizzazioni di condivisione e la cronologia dei file?

No. Questa edizione copia il contenuto corrente dei file e i percorsi delle cartelle. ACL di condivisione, link pubblici, versioni, commenti, etichette, criteri di conservazione e metadati specifici dell'organizzazione richiedono una migrazione e una convalida separate.

Perché scaricare di nuovo i file appena caricati?

L'accettazione del caricamento e le dimensioni indicate nei metadati non dimostrano che sia possibile rileggere dalla destinazione esattamente gli stessi byte. La modalità di nuovo download calcola l'hash SHA-256 del contenuto nella destinazione e crea un checkpoint solo in caso di corrispondenza esatta.

È uno strumento ufficiale di Google o Microsoft?

No. È un'implementazione di riferimento indipendente di FileArk, pubblicata con licenza MIT. Esaminala, provala con dati non critici e rispetta i criteri del provider e della tua organizzazione.

Risorse ufficiali utilizzate per questa guida

Leggi la guida