Python · Google Drive ↔ OneDrive · Технічний посібник із відкритим кодом
Як створити безпечне перенесення між Google Drive і OneDrive на Python
Цей посібник перетворює оманливо складне хмарне копіювання на чіткий процес: інвентаризація, попередня перевірка, проміжне збереження, хешування, передавання, повторне завантаження, порівняння, створення контрольної точки — і лише після цього звільнення місця на локальному диску.
Оновлено ; 22 хв читання.
Коротка відповідь
Для керованої міграції FileArk автоматизує цей процес, не перетворюючи ваш комп’ютер на канал передавання даних. Сервіс протестовано з міграційними навантаженнями обсягом у кілька терабайтів; перш ніж повідомити про успішне завершення, він перевіряє отримання даних із джерела, прийняття завантаження постачальником і об’єкт у місці призначення. Якщо ви хочете керувати конвеєром самостійно, наведена нижче програма на Python за ліцензією MIT виконує обережне копіювання через ваш комп’ютер і ніколи не видаляє файли із джерела.
Виберіть модель роботи, перш ніж вибирати код
Сервіс прямої міграції між хмарними сховищами — практичний вибір, якщо бібліотека велика, перенесення має відбуватися без нагляду або дані не повинні проходити через ноутбук. FileArk виконує перенесення онлайн, відстежує відповіді постачальників, повторює спроби після помилок, які можна виправити, і надає єдине подання перебігу операції. Система перевірки виконує три незалежні перевірки, перш ніж вважати файл повністю перенесеним.
Локальний скрипт корисний, коли потрібен повний контроль над застосунками OAuth, дисками для проміжного зберігання, журналами або правилами щодо папок призначення. Компромісом є операційна відповідальність: комп’ютер має залишатися ввімкненим і підключеним до мережі, мережеве з’єднання стає вузьким місцем, облікові дані OAuth потрібно захищати, а на диску має залишатися достатньо тимчасового простору для активного пакета та копії для перевірки.
Опубліковану тут програму навмисно спроєктовано консервативно. Вона копіює дані з кореня одного особистого диска до нової папки в місці призначення. Програма не надає методу видалення, не перезаписує файли в разі конфліктів, зберігає надійну контрольну точку після перевірки та зупиняється, якщо вільний простір локально або в місці призначення стає меншим за налаштований резерв.
Конвеєр перенесення та межі його відмовостійкості
Інвентаризація дерева джерела
Адаптер джерела рекурсивно обходить папки, опрацьовує поділ результатів на сторінки в постачальника, записує ідентифікатори, шляхи, типи й заявлені розміри та зіставляє підтримувані файли власних форматів Google із переносними форматами експорту.
Попередньо перевірте місткість місця призначення та локального сховища
Рушій порівнює суму обсягу необроблених даних у байтах і налаштовуваного резерву з квотою місця призначення. Він також перевіряє файлову систему проміжного сховища перед кожним пакетом і кожним окремим завантаженням.
Проміжне збереження пакета обмеженого розміру
Файли обробляються пакетами, обмеженими як загальною кількістю байтів, так і кількістю файлів. Локальний диск використовує лише поточний пакет, тому для великої бібліотеки не потрібен диск такого самого розміру.
Хешування та передавання
Після завантаження скрипт обчислює локальний хеш SHA-256, перевіряє відомий розмір джерела, створює папки в місці призначення та передає дані відновлюваними фрагментами, сумісними з відповідним постачальником.
Перевірка та створення контрольної точки
У стандартному режимі новий об’єкт у місці призначення завантажується повторно, після чого порівнюються хеші 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 · звичайний текст
Ознайомтеся з механізмами безпеки, перш ніж надавати доступ до хмарних сховищ

Спочатку запустіть демонстрацію. Вона не виконує мережевих запитів і не записує дані в хмару. Останній рядок навмисно сформульовано однозначно: видалено нуль файлів із джерела. Справжній рушій відтворює ту саму послідовність у структурованих журналах і завершує роботу з ненульовим кодом після першого неперевіреного файла.
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 для робочих облікових записів або ідентифікатор конкретного клієнта Microsoft Entra, якщо цього вимагає політика.
Токени кешуються в локальних файлах, щоб перервану міграцію можна було відновити без нового входу. Вважайте клієнтський файл 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 — або у зворотному напрямку
Усі значення, пов’язані з ідентифікацією, належать оператору. Програма постачається без ідентифікатора клієнта, секрету, клієнта Microsoft Entra, токена, віддаленого облікового запису чи облікових даних місця призначення. Перша команда виконує вхід до Google у браузері та до Microsoft за допомогою коду пристрою, а потім копіює дані до нової папки OneDrive.
Щоб перенести дані з OneDrive до Google Drive, поміняйте джерело та місце призначення місцями. Для кожної незалежної міграції використовуйте окремий файл стану та кореневу папку призначення. Контрольна точка пов’язує постачальника джерела, постачальника призначення та кореневу папку й не дозволяє відновити процес із конфігурацією, що не відповідає цим даним.
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 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 і проєкти 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. Перегляньте її, протестуйте на некритичних даних і дотримуйтеся політик свого постачальника та організації.
Офіційні ресурси, використані для цього посібника
- Навчальний центр Google Workspace: перехід з OneDrive на Google Drive
- Довідка Google Drive: зберігання та робота з файлами
- Підтримка Microsoft: передавання та збереження файлів у OneDrive
- Google Drive API: завантаження й експорт файлів
- Google Drive API: відновлювані передавання
- Google Drive API: поля квоти сховища
- Microsoft Graph: отримання списку дочірніх елементів диска
- Microsoft Graph: створення сеансу відновлюваного завантаження
- Microsoft Graph: ресурс квоти OneDrive