Python · Google Drive ↔ OneDrive · Open-source technische handleiding

Bouw een veilige overdracht tussen Google Drive en OneDrive in Python

Deze handleiding zet een bedrieglijk ingewikkelde cloudkopie om in een expliciet proces: inventariseren, vooraf controleren, tijdelijk opslaan, hashen, uploaden, opnieuw downloaden, vergelijken, een controlepunt opslaan en pas daarna lokale schijfruimte vrijgeven.

Bijgewerkt ; 22 minuten leestijd.

Kort antwoord

Voor een beheerde migratie automatiseert FileArk deze workflow zonder uw computer als gegevenskanaal te gebruiken. Het is getest met migratieworkloads van meerdere terabytes en controleert de ontvangst van de brongegevens, de acceptatie van de upload door de provider en het object op de bestemming voordat succes wordt gemeld. Als u de pijplijn zelf wilt beheren, voert het onderstaande Python-programma met MIT-licentie een voorzichtige kopie via uw computer uit en verwijdert het nooit bronbestanden.

Kies het uitvoeringsmodel voordat je de code kiest

Een rechtstreekse cloudmigratieservice is de praktische keuze wanneer de bibliotheek groot is, de verbinding zonder toezicht actief moet blijven of de gegevens niet via een laptop mogen lopen. FileArk houdt de overdracht online, bewaakt reacties van providers, probeert herstelbare fouten opnieuw en biedt één voortgangsoverzicht. Het validatieproces voert drie onafhankelijke controles uit voordat een bestand als voltooid wordt beschouwd.

Een lokaal script is nuttig als je volledige controle nodig hebt over OAuth-applicaties, schijven voor tijdelijke opslag, logboeken of het beleid voor doelmappen. Daar staat operationele verantwoordelijkheid tegenover: je computer moet online blijven, de netwerkverbinding wordt de bottleneck, OAuth-aanmeldgegevens moeten worden beschermd en er moet voldoende tijdelijke schijfruimte beschikbaar blijven voor de actieve batch en verificatiekopie.

Het hier gepubliceerde programma is bewust conservatief ontworpen. Het kopieert vanuit de hoofdmap van één persoonlijke drive naar een nieuwe doelmap. Het biedt geen verwijdermethode, overschrijft geen conflicten, slaat na verificatie een permanent controlepunt op en stopt zodra de lokale capaciteit of de doelcapaciteit onder de ingestelde reserve komt.

De overdrachtspijplijn en de grenzen voor foutafhandeling

  1. De mappenstructuur van de bron inventariseren

    De bronadapter doorloopt mappen recursief, volgt de paginering van de provider, registreert ID's, paden, typen en opgegeven groottes, en zet ondersteunde bestanden in Google-eigen indelingen om naar overdraagbare exportindelingen.

  2. Controleer vooraf de capaciteit van de bestemming en de lokale opslag

    De engine vergelijkt het aantal resterende bytes plus een configureerbare reserve met het quotum op de bestemming. Ook controleert de engine vóór elke batch en elke afzonderlijke download het bestandssysteem voor tijdelijke opslag.

  3. Een begrensde batch tijdelijk opslaan

    Bestanden worden verwerkt in batches die worden begrensd door zowel het totale aantal bytes als het aantal bestanden. Alleen de huidige batch gebruikt lokale schijfruimte, zodat voor een grote bibliotheek geen schijf van dezelfde grootte nodig is.

  4. Hashen en uploaden

    Na het downloaden berekent het script lokaal de SHA-256, controleert het een eventueel bekende brongrootte, maakt het doelmappen en uploadt het in hervatbare segmenten die compatibel zijn met de provider.

  5. Verifiëren en controlepunt opslaan

    In de standaardmodus wordt het nieuwe object op de bestemming opnieuw gedownload en wordt de SHA-256 vergeleken. Alleen een overeenkomend bestand wordt naar het JSON-controlepunt geschreven en uit de lokale tijdelijke opslag verwijderd.

Download de volledige Python-versie met MIT-licentie

De download bestaat uit één leesbaar Python-startpunt. SDK's van providers worden alleen voor een echte overdracht geïmporteerd, zodat de demo- en helpopdrachten al werken voordat afhankelijkheden of aanmeldgegevens zijn geïnstalleerd. Een afzonderlijk vereistenbestand legt de minimaal ondersteunde pakketten vast en de licentie wordt naast de broncode geleverd.

Lees de code voordat je deze gebruikt, test met een kleine doelmap en behoud voor waardevolle gegevens de standaardverificatie waarbij bestanden opnieuw worden gedownload. Geen enkel algemeen script kan alle deelmachtigingen, snelkoppelingen, bewaarbeleidslabels, regels voor gedeelde drives of tenantbeleidsregels reproduceren.

Download het Python-overdrachtsprogramma
Directe implementatie van de Google Drive API en Microsoft Graph met batchverwerking, controlepunten, nieuwe pogingen, quotareserves en SHA-256-verificatie op de bestemming.
fileark-cloud-transfer.py · Python 3.10+ · MIT-licentie

Download de Python-vereisten
Kleine lijst met afhankelijkheden voor Google OAuth en Drive, Microsoft-authenticatie, Graph-aanvragen en ondersteuning voor nieuwe pogingen.
requirements-fileark-cloud-transfer.txt · pip-vereisten · platte tekst

Download de MIT-licentie
Licentietekst voor beide scripts van FileArk voor handmatige overdracht.
LICENSE-fileark-cloud-transfer.txt · MIT · platte tekst

Bekijk het veiligheidstraject voordat u toegang tot de cloud verleent

Terminal waarin het Python-script van FileArk voor cloudoverdracht in de netwerkloze demomodus wordt uitgevoerd
De ingebouwde demo doorloopt het proces voor de beheerder zonder aanmeldgegevens of netwerkaanroepen. Een echte uitvoering toont dezelfde status voor capaciteit, batches, verificatie, controlepunten en verwijdering van bronbestanden.

Voer eerst de demo uit. Deze doet geen netwerkaanroepen en schrijft geen gegevens naar de cloud. De laatste regel is bewust ondubbelzinnig: er zijn nul bronbestanden verwijderd. De echte engine produceert dezelfde reeks via gestructureerde logboeken en sluit bij het eerste niet-geverifieerde bestand af met een andere code dan nul.

Rooktest zonder netwerkverbinding
chmod +x fileark-cloud-transfer.py
python3 fileark-cloud-transfer.py --demo
python3 fileark-cloud-transfer.py --help

OAuth-clients maken zonder geheimen in de code op te nemen

Maak voor Google Drive een OAuth-client voor desktop-apps in een Google Cloud-project, schakel de Drive API in, configureer het toestemmingsscherm en download de client-JSON. Geef het pad door met --google-client-secret of stel GOOGLE_OAUTH_CLIENT_SECRET_FILE in. Het script vraagt toegang tot Drive omdat het bestanden moet weergeven, downloaden, uploaden en verifiëren, en mappen moet maken.

Registreer voor OneDrive een openbare clienttoepassing in Microsoft Entra ID, schakel de apparaatcodestroom in, voeg de gedelegeerde machtiging Files.ReadWrite toe en geef de client-ID van de toepassing door. Kies `common` voor persoonlijke en organisatieaccounts, `organizations` voor werkaccounts of een specifieke tenant-ID wanneer het beleid dat vereist.

Tokens worden in lokale bestanden gecachet, zodat een onderbroken migratie zonder nieuwe aanmelding kan worden hervat. Behandel de client-JSON en tokencaches als geheimen: sluit ze uit van versiebeheer, beperk de bestandssysteemmachtigingen, upload ze nooit naar supporttickets en verwijder ze zodra de migratie is goedgekeurd.

Afhankelijkheden in een geïsoleerde omgeving installeren
python3 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements-fileark-cloud-transfer.txt

Voer de overdracht uit van Google Drive naar OneDrive — of andersom

Alle identiteitsspecifieke waarden zijn van de beheerder. Het programma wordt geleverd zonder client-ID, geheim, tenant, token, extern account of aanmeldgegevens voor de bestemming. De eerste opdracht meldt via een browser aan bij Google en via een apparaatcode bij Microsoft, en kopieert vervolgens naar een nieuwe map in OneDrive.

Verwissel bron en bestemming om van OneDrive naar Google Drive over te zetten. Gebruik voor elke afzonderlijke migratie een ander statusbestand en een andere doelhoofdmap. Het controlepunt koppelt de bronprovider, doelprovider en hoofdmap aan elkaar en weigert te hervatten als de configuratie niet overeenkomt.

Van Google Drive naar OneDrive met batches van 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
Omgekeerde richting: van OneDrive naar 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

Waarom de capaciteit meer dan eens wordt gecontroleerd

Eén voorafgaande controle kan tijdens een langdurige overdracht verouderd raken. Iemand kan andere bestanden naar de bestemming uploaden, een geëxporteerd Google-document kan groter zijn dan de bronmetadata aangeven en niet-gerelateerde toepassingen kunnen lokale schijfruimte innemen. Daarom controleert de engine vóór de start de totale capaciteit van de bestemming, bij elke batch opnieuw de capaciteit van de bestemming, na elke lokale download nogmaals de capaciteit van de bestemming en vóór elke tijdelijke of verificatiekopie de lokale schijfruimte.

De reservewaarden zijn operationele marges, geen schattingen van de overdrachtsgrootte. Houd ze ruim genoeg voor updates van het besturingssysteem, vertraging in de quotaverwerking door de provider en andere gebruikers van hetzelfde cloudquotum. Als een provider geen eindig resterend quotum beschikbaar stelt, geeft het script een waarschuwing en vertrouwt het op de handhaving door de provider. Dat is minder betrouwbaar dan een bekende voorafgaande controle en vereist actieve bewaking.

De fail-closed-invariant voor quota
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."
        )

Beperk de tijdelijke opslag op basis van bytes en aantal bestanden

Een limiet voor het aantal bytes beperkt het schijfgebruik; een limiet voor het aantal bestanden beperkt de belasting van de API en het bestandssysteem wanneer de bron honderdduizenden kleine objecten bevat. Een bestand dat groter is dan de batchlimiet mag als batch van één bestand worden verwerkt. De reserve moet daarom groot genoeg zijn voor het grootste afzonderlijke object.

De standaardchunk is 10 MiB. Dat is een gemeenschappelijk veelvoud van de granulariteit van 256 KiB voor hervatbare uploads in Google Drive en de vereiste van Microsoft Graph voor opeenvolgende fragmenten van 320 KiB. De opdrachtregelvalidator weigert incompatibele chunkgroottes voordat de authenticatie plaatsvindt.

Batchplanner met dubbele limiet
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

Verwerk native Google-documenten als conversies

Google Docs, Spreadsheets, Presentaties, Tekeningen en Apps Script-projecten zijn geen gewone downloadbare bytestromen. De Google-adapter exporteert ze respectievelijk naar DOCX, XLSX, PPTX, PNG en JSON en voegt een overdraagbare bestandsextensie toe. Mappen worden doorlopen, maar niet als lege objecten geüpload, tenzij ze een bestand bevatten.

Bij conversie kunnen lettertypen, formules, opmerkingen, ingesloten objecten, paginaopmaak en de samenwerkingsgeschiedenis veranderen. Ook stellen de export-endpoints van Google beperkingen aan indelingen en bestandsgroottes. Het script slaat niet-ondersteunde native typen met een waarschuwing over, in plaats van zelf een weergave te bedenken. Controleer een representatieve selectie van geconverteerde bestanden handmatig.

Snelkoppelingen, gedeelde drives, bestanden die met je zijn gedeeld maar niet in Mijn Drive staan, OneNote-pakketten, bewaarmetadata van organisaties, versiegeschiedenis en ACL's voor delen vallen buiten deze versie. Vanwege deze beperkingen mag het kopiëren van bestanden niet worden omschreven als een volledige tenantmigratie.

Gebruik volledige verificatie door opnieuw downloaden vanaf de bestemming voor exact dezelfde bytes

Een geslaagde upload bij de provider is noodzakelijk, maar niet voldoende. Na de upload vergelijkt het script eerst de bestandsgrootte in de metadata van de bestemming met die van het tijdelijk opgeslagen bestand. In de standaardmodus voor opnieuw downloaden haalt het vervolgens het object op de bestemming op als een tijdelijk bestand in dezelfde map, berekent het de SHA-256 en vergelijkt het die hash met de hash van het tijdelijk opgeslagen bronbestand.

Alleen als zowel de grootte als de digest overeenkomt, wordt een controlepuntitem gemaakt. Het controlepunt registreert de bron-ID, de door de bron opgegeven grootte, de doel-ID, het doelpad, het werkelijke aantal bytes, beide digests en het UTC-tijdstip van voltooiing. Als een bronpad met een controlepunt later naar een andere ID of grootte verwijst, stopt het script in plaats van gewijzigde gegevens ongemerkt over te slaan.

Opnieuw downloaden verdubbelt het leesverkeer aan de doelzijde en vereist tijdelijk ruimte voor zowel het tijdelijk opgeslagen bestand als de verificatiekopie. Selecteer de metadatamodus alleen als je deze kosten begrijpt en er een onafhankelijk proces voor inhoudsverificatie bestaat.

Byteverificatie op de bestemming
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,
}

Hervatten zonder onzekerheid als succes te beschouwen

Het programma schrijft de status atomair weg via een tijdelijk bestand dat vervolgens wordt hernoemd. Een geverifieerd item wordt pas na deze permanente schrijfbewerking uit de lokale tijdelijke opslag verwijderd. Als je dezelfde opdracht opnieuw uitvoert, worden items met een controlepunt overgeslagen en gaat het programma verder met de resterende paden.

Er kan een crash optreden nadat de provider een upload heeft geaccepteerd, maar voordat het controlepunt is opgeslagen. Omdat het conflictgedrag op `fail` staat, stopt de volgende uitvoering bij dat bestaande bestemmingspad in plaats van het te overschrijven of ten onrechte succes te melden. Inspecteer en vergelijk het object. Voeg vervolgens zorgvuldig een geverifieerde herstelvermelding toe of begin opnieuw met een nieuwe hoofdmap op de bestemming.

Bij verlopen OAuth-sessies, snelheidsbeperkingen, tijdelijke serverfouten en onderbroken chunks worden binnen vastgestelde grenzen nieuwe pogingen gedaan. Bij authenticatiefouten of aanhoudende machtigingsproblemen stopt het programma. Bewaar logboeken, het controlepunt en de inhoud van de tijdelijke opslag totdat u de oorzaak van de fout begrijpt.

Voer een echte acceptatietest uit

  • Begin met een kleine map met lege bestanden, grote bestanden, diep geneste paden, Unicode-namen en native Google-documenten.
  • Voer eerst --dry-run uit en vergelijk het totale aantal bytes in de inventaris met de providerinterface.
  • Bewaak tijdens de eerste productiebatch afzonderlijk de vrije lokale ruimte en het quotum op de bestemming.
  • Laat verificatie door opnieuw downloaden ingeschakeld en archiveer het controlepunt samen met uw migratiegegevens.
  • Open op de bestemming een representatieve selectie van pdf's, Office-bestanden, afbeeldingen, video's, archieven en geconverteerde native documenten.
  • Vergelijk de verwachte aantallen mappen en bestanden, onderzoek elk overgeslagen of mislukt item en test de toegang vanuit een tweede gebruikersaccount.
  • Laat de bron gedurende een vastgestelde overlapperiode ongewijzigd. Dit script verwijdert de bron nooit.

Veelgestelde vragen

Verwijdert het Python-script ooit bronbestanden?

Nee. Het verwijderen van bronbestanden is niet geïmplementeerd. De engine downloadt vanaf de bron en schrijft naar een afzonderlijke hoofdmap op de bestemming. Na een geslaagde verificatie wordt alleen de tijdelijke lokale kopie verwijderd.

Kan het bestanden in beide richtingen overzetten?

Ja. Stel Google Drive of OneDrive in als bron en de andere provider als bestemming. Gebruik voor elke migratie een uniek controlepunt en een unieke doelhoofdmap.

Behoudt het deelmachtigingen en bestandsgeschiedenis?

Nee. Deze versie kopieert de huidige bestandsinhoud en mappaden. ACL's voor delen, openbare links, versies, opmerkingen, labels, bewaarbeleid en organisatiespecifieke metadata moeten afzonderlijk worden gemigreerd en gevalideerd.

Waarom bestanden die net zijn geüpload opnieuw downloaden?

Acceptatie van de upload en de grootte in de metadata bewijzen niet dat exact dezelfde bytes op de bestemming kunnen worden teruggelezen. In de modus voor opnieuw downloaden wordt de SHA-256 van de inhoud op de bestemming berekend en wordt alleen bij een exacte overeenkomst een controlepunt opgeslagen.

Is dit een officiële tool van Google of Microsoft?

Nee. Dit is een onafhankelijke referentie-implementatie van FileArk die onder de MIT-licentie is uitgebracht. Controleer de code, test deze met niet-kritieke gegevens en volg het beleid van je provider en organisatie.

Officiële bronnen die voor deze handleiding zijn gebruikt

Handleiding lezen