Python · Google Drive ↔ OneDrive · Inżynierski przewodnik open source
Jak zbudować w Pythonie bezpieczny transfer między Google Drive a OneDrive
Ten przewodnik przekształca zwodniczo trudne kopiowanie między chmurami w jasno określony proces: sporządzenie spisu, kontrola wstępna, umieszczenie w obszarze roboczym, obliczenie skrótu, przesłanie, ponowne pobranie, porównanie, zapisanie punktu kontrolnego i dopiero wtedy zwolnienie miejsca na dysku lokalnym.
Zaktualizowano ; 22 min czytania.
Krótka odpowiedź
W przypadku migracji zarządzanej FileArk automatyzuje ten proces bez używania Twojego komputera jako warstwy przesyłania danych. Usługa została przetestowana z migracjami obejmującymi wiele terabajtów danych i przed zgłoszeniem powodzenia sprawdza odebranie danych ze źródła, zaakceptowanie przesłanych danych przez dostawcę oraz obiekt docelowy. Jeśli chcesz samodzielnie obsługiwać potok, poniższy program w Pythonie na licencji MIT ostrożnie kopiuje dane za pośrednictwem Twojego komputera i nigdy nie usuwa plików źródłowych.
Wybierz model działania, zanim wybierzesz kod
Usługa bezpośredniej migracji między chmurami jest praktycznym wyborem, gdy biblioteka jest duża, połączenie musi działać bez nadzoru lub dane nie powinny przechodzić przez laptop. FileArk realizuje transfer online, monitoruje odpowiedzi dostawców, ponawia próby po błędach możliwych do usunięcia i udostępnia jeden widok postępu. Proces walidacji wykonuje trzy niezależne kontrole, zanim plik zostanie uznany za kompletny.
Skrypt lokalny jest przydatny, gdy potrzebujesz pełnej kontroli nad aplikacjami OAuth, dyskami obszaru roboczego, dziennikami lub zasadami dotyczącymi folderu docelowego. Ceną jest odpowiedzialność operacyjna: komputer musi pozostać włączony i połączony z siecią, jego łącze staje się wąskim gardłem, dane uwierzytelniające OAuth muszą być chronione, a na dysku tymczasowym musi być dostępna wystarczająca ilość miejsca na aktywną partię i kopię weryfikacyjną.
Udostępniony tutaj program jest celowo zachowawczy. Kopiuje dane z katalogu głównego jednego dysku osobistego do nowego folderu docelowego. Nie udostępnia metody usuwania, nie nadpisuje plików w razie konfliktu, po weryfikacji trwale zapisuje punkt kontrolny i zatrzymuje się, gdy pojemność lokalna lub docelowa spadnie poniżej skonfigurowanej rezerwy.
Potok transferu i granice obsługi błędów
Sporządź spis drzewa źródłowego
Adapter źródłowy rekurencyjnie przegląda foldery, obsługuje paginację dostawcy, zapisuje identyfikatory, ścieżki, typy i zgłoszone rozmiary oraz mapuje obsługiwane pliki natywne Google na przenośne formaty eksportu.
Wstępnie sprawdź pojemność miejsca docelowego i dysku lokalnego
Mechanizm porównuje liczbę oczekujących bajtów powiększoną o konfigurowalną rezerwę z limitem miejsca docelowego. Sprawdza też system plików obszaru roboczego przed każdą partią i każdym pojedynczym pobraniem.
Przygotuj partię o ograniczonym rozmiarze
Pliki są przetwarzane w partiach ograniczonych zarówno łączną liczbą bajtów, jak i liczbą plików. Z dysku lokalnego korzysta tylko bieżąca partia, więc duża biblioteka nie wymaga dysku o takiej samej pojemności.
Oblicz skrót i prześlij
Po pobraniu skrypt oblicza lokalny skrót SHA-256, sprawdza znany rozmiar źródłowy, tworzy foldery docelowe i przesyła dane we wznawialnych fragmentach zgodnych z wymaganiami dostawcy.
Zweryfikuj i zapisz punkt kontrolny
W trybie domyślnym nowy obiekt docelowy jest ponownie pobierany, a następnie porównywana jest suma SHA-256. Tylko zgodny plik zostaje zapisany w punkcie kontrolnym JSON i usunięty z lokalnego obszaru roboczego.
Pobierz pełną wersję programu w Pythonie na licencji MIT
Pobierany plik zawiera jeden czytelny punkt wejścia w Pythonie. Zestawy SDK dostawców są importowane tylko na potrzeby rzeczywistego transferu, dlatego polecenia demonstracyjne i pomocy działają jeszcze przed zainstalowaniem zależności lub skonfigurowaniem danych uwierzytelniających. Osobny plik wymagań określa minimalne wersje obsługiwanych pakietów, a licencja jest dołączona obok kodu źródłowego.
Przed użyciem zapoznaj się z kodem, przeprowadź test z małym folderem docelowym, a w przypadku cennych danych pozostaw domyślną weryfikację przez ponowne pobranie. Żaden uniwersalny skrypt nie jest w stanie odtworzyć wszystkich uprawnień do udostępniania, skrótów, etykiet przechowywania, reguł dysków współdzielonych ani zasad dzierżawy.
Pobierz program Python do transferu plików
Bezpośrednia implementacja Google Drive API i Microsoft Graph z obsługą partii, punktów kontrolnych, ponawiania prób, rezerw limitu oraz weryfikacji SHA-256 w miejscu docelowym.fileark-cloud-transfer.py · Python 3.10+ · licencja MIT
Pobierz wymagania dla Pythona
Krótka lista zależności do obsługi Google OAuth i Drive, uwierzytelniania Microsoft, żądań Graph oraz ponawiania prób.requirements-fileark-cloud-transfer.txt · wymagania pip · zwykły tekst
Pobierz licencję MIT
Informacja o licencji obejmująca oba skrypty FileArk do ręcznego transferu.LICENSE-fileark-cloud-transfer.txt · MIT · zwykły tekst
Poznaj bezpieczny przebieg procesu przed udzieleniem dostępu do chmury

Najpierw uruchom wersję demonstracyjną. Nie wykonuje ona żadnych wywołań sieciowych ani nie zapisuje danych w chmurze. Ostatni wiersz jest celowo jednoznaczny: usunięto zero plików źródłowych. Właściwy mechanizm emituje tę samą sekwencję w dziennikach ustrukturyzowanych i po napotkaniu pierwszego niezweryfikowanego pliku kończy działanie z kodem różnym od zera.
chmod +x fileark-cloud-transfer.py
python3 fileark-cloud-transfer.py --demo
python3 fileark-cloud-transfer.py --helpTworzenie klientów OAuth bez osadzania sekretów
W przypadku Google Drive utwórz klienta OAuth typu aplikacja komputerowa w projekcie Google Cloud, włącz Drive API, skonfiguruj ekran zgody i pobierz plik JSON klienta. Przekaż jego ścieżkę za pomocą opcji --google-client-secret lub ustaw GOOGLE_OAUTH_CLIENT_SECRET_FILE. Skrypt prosi o dostęp do Drive, ponieważ musi wyświetlać listę plików, pobierać je, tworzyć foldery, przesyłać pliki i je weryfikować.
W przypadku OneDrive zarejestruj publiczną aplikację kliencką w Microsoft Entra ID, włącz przepływ kodu urządzenia, dodaj delegowane uprawnienie Files.ReadWrite i przekaż identyfikator klienta aplikacji. Wybierz common dla kont osobistych i organizacyjnych, organizations dla kont służbowych albo identyfikator określonej dzierżawy, jeśli wymagają tego zasady.
Tokeny są przechowywane w lokalnych plikach pamięci podręcznej, dzięki czemu przerwaną migrację można wznowić bez ponownego logowania. Traktuj plik JSON klienta i pamięć podręczną tokenów jak dane poufne: wyklucz je z systemu kontroli wersji, ogranicz uprawnienia w systemie plików, nigdy nie przesyłaj ich w zgłoszeniach do pomocy technicznej i usuń je po zaakceptowaniu migracji.
python3 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements-fileark-cloud-transfer.txtUruchom transfer z Google Drive do OneDrive — lub w odwrotnym kierunku
Wszystkie wartości związane z tożsamością należą do operatora. Program nie zawiera identyfikatora klienta, klucza tajnego, dzierżawy, tokenu, konta zdalnego ani danych uwierzytelniających miejsca docelowego. Pierwsze polecenie loguje do Google w przeglądarce, a do Microsoft przy użyciu kodu urządzenia, po czym kopiuje dane do nowego folderu OneDrive.
Aby przeprowadzić transfer z OneDrive do Google Drive, zamień miejscami źródło i miejsce docelowe. Dla każdej niezależnej migracji używaj innego pliku stanu i katalogu głównego miejsca docelowego. Punkt kontrolny wiąże ze sobą dostawcę źródłowego, dostawcę docelowego i katalog główny oraz odmawia wznowienia w przypadku niezgodnej konfiguracji.
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 redownloadpython 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 redownloadDlaczego pojemność jest sprawdzana więcej niż raz
Pojedyncza kontrola wstępna może stracić aktualność podczas długiego transferu. Ktoś może przesłać inne pliki do miejsca docelowego, wyeksportowany dokument Google może być większy, niż wynika to z jego metadanych źródłowych, a inne aplikacje mogą zajmować miejsce na dysku lokalnym. Dlatego mechanizm sprawdza łączną pojemność miejsca docelowego przed rozpoczęciem, pojemność miejsca docelowego przy każdej partii i ponownie po każdym pobraniu lokalnym, a także miejsce na dysku lokalnym przed każdym etapem lub kopią weryfikacyjną.
Wartości rezerwy stanowią operacyjny margines bezpieczeństwa, a nie szacowany rozmiar transferu. Ustaw je na tyle wysoko, aby uwzględnić aktualizacje systemu operacyjnego, opóźnienia w rozliczaniu wykorzystania przestrzeni przez dostawcę oraz innych użytkowników korzystających z tego samego limitu chmurowego. Jeśli dostawca nie udostępnia skończonej wartości pozostałego limitu, skrypt wyświetla ostrzeżenie i polega na mechanizmach egzekwowania limitu przez dostawcę. Jest to mniej pewne niż wstępna kontrola oparta na znanej wartości i wymaga aktywnego monitorowania.
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."
)Ogranicz rozmiar obszaru roboczego według liczby bajtów i plików
Limit bajtów ogranicza wykorzystanie dysku, a limit liczby plików — obciążenie interfejsu API i systemu plików, gdy źródło zawiera setki tysięcy małych obiektów. Plik większy niż limit partii może zostać przetworzony jako jednoelementowa partia, dlatego rezerwa musi uwzględniać największy pojedynczy obiekt.
Domyślny rozmiar fragmentu to 10 MiB. Jest to wspólna wielokrotność wartości 256 KiB, która określa ziarnistość wznawialnego przesyłania w Google Drive, oraz wartości 320 KiB wymaganej przez Microsoft Graph dla kolejnych fragmentów. Walidator wiersza poleceń odrzuca niezgodne rozmiary fragmentów przed uwierzytelnieniem.
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 batchObsługuj dokumenty natywne Google przez konwersję
Dokumenty, Arkusze, Prezentacje i Rysunki Google oraz projekty Apps Script nie są zwykłymi strumieniami bajtów dostępnymi do pobrania. Adapter Google eksportuje je odpowiednio do formatów DOCX, XLSX, PPTX, PNG i JSON, dodając przenośne rozszerzenie nazwy pliku. Foldery są przeglądane, ale nie są przesyłane jako puste obiekty, chyba że zawierają plik.
Konwersja może zmienić czcionki, formuły, komentarze, osadzone obiekty, układ strony i historię współpracy. Punkty końcowe eksportu Google nakładają również ograniczenia dotyczące formatu i rozmiaru. Zamiast tworzyć umowną reprezentację, skrypt pomija nieobsługiwane typy natywne i wyświetla ostrzeżenie. Ręcznie sprawdź reprezentatywne przekonwertowane pliki.
Skróty, dyski współdzielone, pliki udostępnione Tobie, ale nieznajdujące się na Moim dysku, pakiety OneNote, metadane przechowywania organizacji, historia wersji oraz listy ACL udostępniania nie są obsługiwane w tej wersji. Ze względu na te ograniczenia kopiowania plików nie należy określać jako kompletnej migracji dzierżawy.
Pełna weryfikacja przez ponowne pobranie z miejsca docelowego zapewnia kontrolę dokładnej zawartości bajtowej
Pomyślne przesłanie danych do dostawcy jest konieczne, ale niewystarczające. Po przesłaniu skrypt najpierw porównuje rozmiar w metadanych miejsca docelowego z plikiem w obszarze roboczym. Następnie, w domyślnym trybie ponownego pobierania, pobiera obiekt docelowy do tymczasowego pliku w tym samym katalogu, oblicza SHA-256 i porównuje tę sumę z sumą źródła w obszarze roboczym.
Wpis w punkcie kontrolnym powstaje tylko wtedy, gdy zgadzają się zarówno rozmiar, jak i skrót. Punkt kontrolny zapisuje identyfikator źródła, rozmiar zgłoszony przez źródło, identyfikator i ścieżkę miejsca docelowego, rzeczywistą liczbę bajtów, oba skróty oraz czas ukończenia w UTC. Jeśli ścieżka źródłowa zapisana w punkcie kontrolnym zacznie później wskazywać inny identyfikator lub rozmiar, skrypt zatrzyma się, zamiast po cichu pominąć zmienione dane.
Ponowne pobieranie podwaja ruch odczytu po stronie miejsca docelowego i tymczasowo wymaga miejsca zarówno na plik w obszarze roboczym, jak i na kopię weryfikacyjną. Tryb metadanych wybieraj tylko wtedy, gdy rozumiesz ten koszt i dysponujesz niezależnym procesem weryfikacji zawartości.
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,
}Wznawianie bez uznawania niepewnego wyniku za sukces
Program zapisuje stan atomowo za pomocą pliku tymczasowego i zmiany nazwy. Zweryfikowany element jest usuwany z lokalnego obszaru roboczego dopiero po tym trwałym zapisie. Ponowne uruchomienie tego samego polecenia pomija elementy zapisane w punkcie kontrolnym i kontynuuje przetwarzanie oczekujących ścieżek.
Awaria może nastąpić po zaakceptowaniu przesłanego pliku przez dostawcę, ale przed zapisaniem punktu kontrolnego. Ponieważ w razie konfliktu ustawione jest zachowanie „fail”, kolejne uruchomienie zatrzyma się na istniejącej ścieżce docelowej, zamiast nadpisać plik lub błędnie zgłosić powodzenie. Sprawdź obiekt i porównaj go, a następnie ostrożnie dodaj zweryfikowany wpis odzyskiwania albo uruchom proces ponownie z nowym katalogiem głównym miejsca docelowego.
Wygaśnięcie OAuth, ograniczenie częstotliwości żądań, przejściowe błędy serwera i przerwane przesyłanie fragmentów powodują ponawianie prób w określonych granicach. Błędy uwierzytelniania lub utrzymujące się błędy uprawnień zatrzymują program. Zachowaj dzienniki, punkt kontrolny i zawartość obszaru roboczego, dopóki nie ustalisz przyczyny błędu.
Przeprowadź rzeczywisty test akceptacyjny
- Zacznij od małego folderu zawierającego puste i duże pliki, głęboko zagnieżdżone ścieżki, nazwy w standardzie Unicode oraz dokumenty natywne Google.
- Najpierw uruchom polecenie z opcją --dry-run i porównaj łączną liczbę bajtów w spisie z wartością w interfejsie dostawcy.
- Podczas pierwszej partii produkcyjnej niezależnie monitoruj wolne miejsce lokalne i limit miejsca docelowego.
- Pozostaw włączoną weryfikację przez ponowne pobranie i zarchiwizuj punkt kontrolny wraz z dokumentacją migracji.
- Otwórz w miejscu docelowym reprezentatywne pliki PDF, pliki pakietu Office, obrazy, filmy, archiwa i przekonwertowane dokumenty natywne.
- Porównaj oczekiwaną liczbę folderów i plików, sprawdź każdy pominięty lub nieprawidłowo przetworzony element oraz przetestuj dostęp z konta drugiego użytkownika.
- Pozostaw źródło bez zmian przez zdefiniowany okres równoległego przechowywania. Ten skrypt nigdy go nie usuwa.
Najczęściej zadawane pytania
Czy skrypt Python kiedykolwiek usuwa pliki źródłowe?
Nie. Usuwanie danych źródłowych nie zostało zaimplementowane. Mechanizm pobiera dane ze źródła i zapisuje je w oddzielnym katalogu głównym miejsca docelowego. Pomyślna weryfikacja usuwa tylko tymczasową kopię z lokalnego obszaru roboczego.
Czy skrypt może przesyłać dane w obu kierunkach?
Tak. Ustaw Google Drive lub OneDrive jako źródło, a drugiego dostawcę jako miejsce docelowe. Dla każdej migracji używaj unikatowego punktu kontrolnego i katalogu głównego miejsca docelowego.
Czy skrypt zachowuje uprawnienia do udostępniania i historię plików?
Nie. Ta wersja kopiuje bieżącą zawartość plików i ścieżki folderów. Listy ACL udostępniania, łącza publiczne, wersje, komentarze, etykiety, zasady przechowywania i metadane specyficzne dla organizacji wymagają osobnej migracji i weryfikacji.
Dlaczego ponownie pobierać pliki, które właśnie przesłano?
Przyjęcie przesłanego pliku i rozmiar w metadanych nie dowodzą, że w miejscu docelowym można odczytać dokładnie te same bajty. Tryb ponownego pobierania oblicza SHA-256 zawartości docelowej i zapisuje punkt kontrolny wyłącznie w przypadku pełnej zgodności.
Czy jest to oficjalne narzędzie Google lub Microsoft?
Nie. Jest to niezależna implementacja referencyjna FileArk udostępniona na licencji MIT. Zapoznaj się z nią, przetestuj ją na danych, które nie są krytyczne, oraz przestrzegaj zasad dostawcy i swojej organizacji.
Oficjalne źródła wykorzystane w tym poradniku
- Centrum edukacyjne Google Workspace: przejście z OneDrive na Google Drive
- Pomoc Google Drive: miejsce na dane i obsługa plików
- Pomoc techniczna Microsoft: przekazywanie i zapisywanie plików w OneDrive
- Google Drive API: pobieranie i eksportowanie plików
- Google Drive API: wznawialne przesyłanie
- Google Drive API: pola limitu przestrzeni dyskowej
- Microsoft Graph: wyświetlanie elementów podrzędnych dysku
- Microsoft Graph: tworzenie sesji wznawialnego przesyłania
- Microsoft Graph: zasób limitu OneDrive