Python · Google Drive ↔ OneDrive · Guía de ingeniería de código abierto

Cómo crear una transferencia segura entre Google Drive y OneDrive con Python

Esta guía convierte una copia entre nubes engañosamente difícil en un proceso explícito: enumerar, hacer las comprobaciones previas, preparar, calcular el hash, subir, volver a descargar, comparar, guardar un punto de control y, solo entonces, liberar espacio en el disco local.

Actualizado ; 22 min de lectura.

Respuesta breve

Para una migración gestionada, FileArk automatiza este flujo de trabajo sin utilizar su ordenador como canal de datos. Se ha probado con cargas de trabajo de migración de varios terabytes y comprueba la recepción desde el origen, la aceptación de la subida por parte del proveedor y el objeto del destino antes de indicar que el proceso se ha completado correctamente. Si necesita gestionar el flujo por su cuenta, el programa de Python con licencia MIT que aparece a continuación realiza una copia conservadora a través de su equipo y nunca elimina los archivos de origen.

Elige el modelo operativo antes de elegir el código

Un servicio de migración directa entre nubes es la opción práctica cuando la biblioteca es grande, la conexión debe funcionar sin supervisión o no se quiere que los datos pasen por un portátil. FileArk mantiene la transferencia en línea, supervisa las respuestas de los proveedores, reintenta los fallos recuperables y ofrece una vista unificada del progreso. Su proceso de validación realiza tres comprobaciones independientes antes de dar un archivo por completado.

Un script local resulta útil cuando necesitas un control total sobre las aplicaciones OAuth, los discos de preparación, los registros o la política de carpetas de destino. La contrapartida es la responsabilidad operativa: tu equipo debe permanecer conectado, su conexión de red se convierte en el cuello de botella, las credenciales OAuth deben protegerse y tiene que haber suficiente espacio temporal disponible en disco para el lote activo y la copia de verificación.

El programa publicado aquí es deliberadamente conservador. Copia desde la raíz de una unidad personal a una nueva carpeta de destino. No ofrece ningún método de eliminación, no sobrescribe los conflictos, guarda un punto de control persistente tras la verificación y se detiene cuando la capacidad local o la del destino queda por debajo de la reserva configurada.

El flujo de transferencia y sus límites ante fallos

  1. Crea un inventario del árbol de origen

    El adaptador del origen recorre las carpetas de forma recursiva, sigue la paginación del proveedor, registra los ID, las rutas, los tipos y los tamaños indicados, y asigna formatos de exportación portátiles a los archivos nativos de Google compatibles.

  2. Comprobar previamente la capacidad local y del destino

    El motor compara los bytes pendientes más una reserva configurable con la cuota del destino. También comprueba el sistema de archivos del área de preparación antes de cada lote y de cada descarga individual.

  3. Prepara un lote con límites definidos

    Los archivos se procesan en lotes limitados tanto por el total de bytes como por el número de archivos. Solo el lote actual utiliza el disco local, por lo que una biblioteca grande no requiere una unidad del mismo tamaño.

  4. Calcular el hash y subir

    Después de la descarga, el script calcula el SHA-256 local, comprueba el tamaño conocido del origen, crea las carpetas de destino y sube los archivos en fragmentos reanudables compatibles con el proveedor.

  5. Verificar y guardar un punto de control

    El modo predeterminado vuelve a descargar el nuevo objeto del destino y compara su SHA-256. Solo si el archivo coincide se registra en el punto de control JSON y se elimina del área de preparación local.

Descargue la edición completa de Python con licencia MIT

La descarga contiene un único punto de entrada de Python fácil de leer. Los SDK de los proveedores solo se importan para una transferencia real, por lo que los comandos de demostración y ayuda funcionan antes de instalar las dependencias o las credenciales. Un archivo de requisitos independiente fija las versiones mínimas compatibles de los paquetes, y la licencia se incluye junto al código fuente.

Lee el código antes de usarlo, haz una prueba con una carpeta de destino pequeña y mantén la verificación predeterminada mediante una nueva descarga para los datos valiosos. Ningún script genérico puede reproducir todos los permisos de uso compartido, accesos directos, etiquetas de retención, reglas de unidades compartidas o políticas del inquilino.

Descarga el programa de transferencia en Python
Implementación directa con la API de Google Drive y Microsoft Graph que incluye procesamiento por lotes, puntos de control, reintentos, reservas de cuota y verificación SHA-256 en el destino.
fileark-cloud-transfer.py · Python 3.10+ · Licencia MIT

Descarga los requisitos de Python
Una breve lista de dependencias para OAuth y Drive de Google, la autenticación de Microsoft, las solicitudes a Graph y la gestión de reintentos.
requirements-fileark-cloud-transfer.txt · requisitos de pip · texto sin formato

Descargar la licencia MIT
Aviso de licencia aplicable a los dos scripts de transferencia manual de FileArk.
LICENSE-fileark-cloud-transfer.txt · MIT · texto sin formato

Revise el proceso de seguridad antes de conceder acceso a la nube

Terminal que ejecuta el script de Python de FileArk para transferencias entre nubes en modo de demostración sin conexión de red
La demostración integrada reproduce el flujo que verá el operador sin credenciales ni llamadas de red. Una ejecución real muestra la misma información sobre capacidad, lotes, verificación, punto de control y estado de eliminación en el origen.

Ejecuta primero la demostración. No realiza ninguna llamada de red ni escribe datos en la nube. La última línea es deliberadamente inequívoca: se han eliminado cero archivos de origen. El motor real emite la misma secuencia mediante registros estructurados y finaliza con un código distinto de cero al encontrar el primer archivo no verificado.

Prueba rápida sin conexión de red
chmod +x fileark-cloud-transfer.py
python3 fileark-cloud-transfer.py --demo
python3 fileark-cloud-transfer.py --help

Crea clientes OAuth sin incorporar secretos en el código

Para Google Drive, crea un cliente OAuth de escritorio en un proyecto de Google Cloud, habilita la API de Drive, configura la pantalla de consentimiento y descarga el JSON del cliente. Indica su ruta con --google-client-secret o define GOOGLE_OAUTH_CLIENT_SECRET_FILE. El script solicita acceso a Drive porque necesita enumerar y descargar archivos, crear carpetas, subir archivos y verificarlos.

Para OneDrive, registre una aplicación de cliente público en Microsoft Entra ID, active el flujo de código de dispositivo, añada el permiso delegado Files.ReadWrite e indique el ID de cliente de la aplicación. Elija `common` para cuentas personales y de organizaciones, `organizations` para cuentas de trabajo o un ID de inquilino específico cuando así lo exija la política.

Los tokens se almacenan en caché en archivos locales para que una migración interrumpida pueda reanudarse sin volver a iniciar sesión. Trata el JSON del cliente y las cachés de tokens como secretos: exclúyelos del control de versiones, restringe los permisos del sistema de archivos, no los subas nunca a solicitudes de soporte y elimínalos cuando se acepte la migración.

Instala las dependencias en un entorno aislado
python3 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements-fileark-cloud-transfer.txt

Ejecute la transferencia de Google Drive a OneDrive o a la inversa

Todos los valores específicos de identidad corresponden al operador. El programa no incluye ningún ID de cliente, secreto, inquilino, token, cuenta remota ni credencial de destino. El primer comando inicia sesión en Google mediante un navegador y en Microsoft mediante un código de dispositivo; después, copia los archivos en una carpeta nueva de OneDrive.

Invierte el origen y el destino para transferir de OneDrive a Google Drive. Usa un archivo de estado y una raíz de destino distintos para cada migración independiente. El punto de control vincula el proveedor de origen, el proveedor de destino y la raíz, y se niega a reanudar la operación si la configuración no coincide.

De Google Drive a OneDrive con lotes de 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
Dirección inversa: de 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

Por qué se comprueba la capacidad más de una vez

Una sola comprobación previa puede quedar obsoleta durante una transferencia larga. Alguien puede subir otros archivos al destino, un documento de Google exportado puede ser mayor de lo que indican sus metadatos de origen y otras aplicaciones pueden consumir espacio del disco local. Por eso, el motor comprueba la capacidad total del destino antes de empezar, la capacidad del destino en cada lote y de nuevo después de cada descarga local, así como el espacio del disco local antes de cada copia de preparación o verificación.

Los valores de reserva son un margen operativo, no estimaciones del tamaño de la transferencia. Manténgalos lo bastante altos para cubrir las actualizaciones del sistema operativo, los retrasos en la contabilización del proveedor y el uso de la misma cuota en la nube por parte de otros usuarios. Cuando un proveedor no indica una cuota restante finita, el script muestra una advertencia y depende de los límites aplicados por el proveedor. Esto ofrece menos garantías que una comprobación previa con una cuota conocida y requiere una supervisión activa.

La invariante de cierre seguro ante fallos para la cuota
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."
        )

Limitar el espacio de preparación por bytes y número de archivos

Un límite de bytes controla el uso del disco; un límite de archivos controla la sobrecarga de la API y del sistema de archivos cuando el origen contiene cientos de miles de objetos diminutos. Un archivo que supere el límite del lote se permite como un lote de un solo archivo, por lo que la reserva debe dimensionarse para el objeto individual más grande.

El tamaño predeterminado de cada fragmento es de 10 MiB. Es un múltiplo común de la granularidad de 256 KiB de las subidas reanudables de Google Drive y del requisito de Microsoft Graph de usar fragmentos secuenciales de 320 KiB. El validador de la línea de comandos rechaza los tamaños de fragmento incompatibles antes de la autenticación.

Planificador de lotes con dos límites
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

Tratar los documentos nativos de Google como conversiones

Google Docs, Sheets, Slides, Drawings y los proyectos de Apps Script no son flujos de bytes ordinarios que se puedan descargar. El adaptador de Google los exporta respectivamente a DOCX, XLSX, PPTX, PNG y JSON, y añade una extensión de archivo portátil. Las carpetas se recorren, pero no se suben como objetos vacíos a menos que contengan algún archivo.

La conversión puede modificar las fuentes, fórmulas, comentarios, objetos incrustados, el diseño de página y el historial de colaboración. Los puntos de conexión de exportación de Google también imponen restricciones de formato y tamaño. El script omite los tipos nativos no compatibles y muestra una advertencia, en lugar de inventar una representación. Revise manualmente una muestra representativa de los archivos convertidos.

Los accesos directos, las unidades compartidas, los archivos compartidos contigo que no estén en Mi unidad, los paquetes de OneNote, los metadatos de retención de la organización, el historial de versiones y las ACL de uso compartido quedan fuera de esta edición. Debido a estas limitaciones, una copia de archivos no debe describirse como una migración completa del inquilino.

Usa la verificación mediante una nueva descarga completa desde el destino para comprobar los bytes exactos

Que el proveedor acepte la subida es necesario, pero no suficiente. Tras la subida, el script compara primero el tamaño indicado en los metadatos del destino con el del archivo preparado. En el modo predeterminado de nueva descarga, descarga después el objeto del destino en un archivo temporal adyacente, calcula su SHA-256 y compara ese resumen con el del archivo de origen preparado.

Solo se crea una entrada en el punto de control cuando coinciden tanto el tamaño como el resumen criptográfico. El punto de control registra el ID de origen, el tamaño indicado por el origen, el ID de destino, la ruta de destino, los bytes reales, ambos resúmenes y la hora de finalización en UTC. Si una ruta de origen guardada en el punto de control apunta después a un ID o un tamaño diferentes, el script se detiene en lugar de omitir silenciosamente los datos modificados.

Volver a descargar duplica el tráfico de lectura en el destino y requiere temporalmente espacio tanto para el archivo en el área de preparación como para la copia de verificación. Selecciona el modo de metadatos solo si comprendes ese coste y cuentas con un proceso independiente de verificación del contenido.

Verificación byte a byte en el destino
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,
}

Reanuda sin considerar la incertidumbre como un éxito

El programa escribe el estado de forma atómica mediante un archivo temporal y un cambio de nombre. Un elemento verificado solo se elimina del área de preparación local después de esa escritura persistente. Al volver a ejecutar el mismo comando, se omiten los elementos guardados en el punto de control y se continúa con las rutas pendientes.

Puede producirse un fallo después de que el proveedor acepte una subida, pero antes de que se escriba el punto de control. Como el comportamiento ante conflictos es `fail`, la siguiente ejecución se detiene al encontrar esa ruta existente en el destino, en lugar de sobrescribirla o indicar de forma incorrecta que el proceso se ha completado. Inspeccione y compare el objeto; después, añada con cuidado una entrada de recuperación verificada o reinicie la transferencia en una nueva raíz de destino.

La caducidad de OAuth, la limitación de solicitudes, los errores transitorios del servidor y los fragmentos interrumpidos se reintentan dentro de unos límites definidos. Los fallos de autenticación o los errores de permisos persistentes detienen el programa. Conserve los registros, el punto de control y el contenido del área de preparación hasta que comprenda la causa del fallo.

Realiza una prueba de aceptación real

  • Empiece con una carpeta pequeña que contenga archivos vacíos, archivos grandes, rutas con muchos niveles, nombres Unicode y documentos nativos de Google.
  • Ejecuta primero --dry-run y compara el total de bytes del inventario con la interfaz del proveedor.
  • Supervisa por separado el espacio libre local y la cuota del destino durante el primer lote de producción.
  • Mantenga activada la verificación mediante nueva descarga y archive el punto de control junto con los registros de la migración.
  • Abra en el destino una muestra representativa de archivos PDF, documentos de Office, imágenes, vídeos, archivos comprimidos y documentos nativos convertidos.
  • Compara las cantidades previstas de carpetas y archivos, investiga cada elemento omitido o fallido y prueba el acceso desde la cuenta de un segundo usuario.
  • Mantén el origen sin cambios durante un periodo de solapamiento definido. Este script nunca lo elimina.

Preguntas frecuentes

¿El script de Python elimina alguna vez los archivos de origen?

No. La eliminación de archivos de origen no está implementada. El motor descarga los archivos del origen y los escribe en una raíz de destino independiente; cuando la verificación se completa correctamente, solo se elimina la copia temporal del área de preparación local.

¿Puede transferir en ambas direcciones?

Sí. Configura Google Drive o OneDrive como origen y el otro proveedor como destino. Usa un punto de control y una raíz de destino únicos para cada migración.

¿Conserva los permisos de uso compartido y el historial de los archivos?

No. Esta edición copia el contenido actual de los archivos y las rutas de las carpetas. Las ACL de uso compartido, los enlaces públicos, las versiones, los comentarios, las etiquetas, las políticas de retención y los metadatos específicos de la organización requieren una migración y validación independientes.

¿Por qué volver a descargar los archivos que se acaban de subir?

La aceptación de la subida y el tamaño indicado en los metadatos no demuestran que se puedan volver a leer exactamente los mismos bytes en el destino. El modo de nueva descarga calcula el SHA-256 del contenido de destino y solo crea el punto de control si la coincidencia es exacta.

¿Es una herramienta oficial de Google o Microsoft?

No. Es una implementación de referencia independiente de FileArk publicada bajo la licencia MIT. Revísala, pruébala con datos que no sean críticos y cumple las políticas de tu proveedor y tu organización.

Recursos oficiales utilizados para esta guía

Leer la guía