La API v2 de Dropbox de Python nos permite gestionar y controlar contenido de Dropbox. En esta guía voy a mostrar como crear las conexiones, listar contenido de directorios, así como descargar y cargar ficheros.
Qué necesitamos
Antes de comenzar tenemos que disponer de:
- Una cuenta de Dropbox.
- Tener Python instalado en su versión 3>.
- Instalar la Biblioteca o SDK de Dropbox.
- Un editor de código a tu elección y conexión a Shell o línea de comandos.
Instalar Dropbox SDK para Python
Para ello vamos a utilizar la herramienta pip, que nos permite descargar e instalar el SDK.
1 |
$ pip install dropbox |
Una vez instalado, ya podemos comenzar a utilizarlo en nuestras aplicaciones o scripts.
1 |
import dropbox |
Crear nuestra App desde la consola de Dropbox
Para comenzar a utilizar la API de Dropbox necesitamos registrar nuestra aplicación a través de la App Console de Dropbox
.
- Hacemos clic en create app y seleccionamos la API que vamos a utilizar (solo hay una).
- Seleccionamos el tipo de acceso que necesita nuestra App. Si seleccionamos App folder podemos indicar una carpeta específica dentro de nuestra carpeta Aplicaciones de Dropbox. En caso de que indiquemos Full Dropbox, accederemos a todo el contenido de Dropbox (no lo recomendaría).
- El siguiente paso es elegir un nombre para nuestra aplicación, que también será usado como carpeta dentro del directorio de Aplicaciones/ en el caso de haber seleccionado App folder en el paso anterior.
- Por último recuerda que debes indicar los permisos de lectura y escritura que necesites para tu aplicación.
Autenticación y Token de acceso
Dropbox usa el protocolo de autenticación OAuth
v2.0, que autoriza los accesos a datos de usuario. El Token de acceso generado por OAuth nos permite hacer uso de API.
Por lo que una vez hemos creada nuestra App, podemos generarlo cuando deseemos indicando si este va a ser temporal o permanente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
access_token = "tu_token" try: dbx = dropbox.Dropbox(access_token) dbx.users_get_current_account() # print(dbx.users_get_current_account()) dropbox_user_name = dbx.users_get_current_account().name.display_name dropbox_email = dbx.users_get_current_account().email print("---------------------------------------") print('Autenticación Dropbox: \nPropiedad de: {} <{}>'.format(dropbox_user_name, dropbox_email)) print("---------------------------------------") except dropbox.auth.AuthError as err: print(err) |
Una vez nos hemos autenticado, ya podemos comenzar a interactuar con nuestra cuenta de Dropbox para listar, cargar, descargar contenido, etc … Si necesitas más información sobre el método de autenticación Oauth para Dropbox haz clic aquí.
Listando ficheros y directorios
files_list_folder()
retorna el contenido de una carpeta seleccionada. Estos son los parámetros más comunes, siendo path obligatorio:- path (str) la rutadon donde queremos listar el contenido.
- recursive (bool) si indicamos true listaremos el contenido de subcarpetas también.
- limit (int) la cantidad de resultados que queremos mostrar.
1 2 3 |
dir = '' data = dbx.files_list_folder( path=dir ) print(data) |
Vemos que esto nos devuelve un objeto llamado <class ‘dropbox.files.FileMetadata‘>.
- content_hash (str), el algoritmo que contiene toda la información de los metadatos.
- is_downloadable (bool), si indica True es que el contenido se puede descargar.
- name, es el nombre asignado al fichero o carpeta.
- path_display, la ruta completa del fichero en Dropbox.
- server_modified, es la fecha en la que se modificó el fichero por última vez.
- rev (str), versión actual del fichero.
1 2 3 4 5 |
for entry in data.entries: if hasattr(entry, 'shared_folder_id'): print(entry.name+'/') else: print(entry.name + ' ' + str(entry.size)) |
Obteniendo Metadatos
El método files_get_metadata
() nos permite consultar información detallada del fichero o directorio, donde el único atributo obligatorio es path (str), que corresponde a la ruta donde se ubica el fichero en dropbox.
1 2 3 4 |
file = '/test.txt' server_rev = dbx.files_get_metadata(path=file).rev server_modified = dbx.files_get_metadata(file).server_modified print('file modifed: ' + server_modified.strftime("%m/%d/%y") + ' | file revision: ' + server_rev) |
Para más información sobre files_get_metadata() puedes acceder a la documentación oficial.
Carga de ficheros a Dropbox
Para cargar ficheros vamos a utilizar el método files_upload
(). Según la documentación oficial no debemos usarlo en ficheros de más de 150MB, ya que para ello existe otro método llamado files_upload_session_start(). Los parámetros más importantes son:
- f, el contenido que deseamos cargar.
- path (str), la ruta donde se salvará el fichero en Dropbox.
- mute (bool), si indicamos False evitamos notificaciones al usuario de modificaciones realizadas.
- mode, nos permite indicar que hacer en el caso de que el fichero ya exista y este haya sido modificado.
- autorename (bool), si necesitamos evitar conflictos de ficheros repetidos, estos podrán ser auto renombrados.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
dropbox_dir = '/test/' local_dir = 'data/' for dir, dirs, files in os.walk(local_dir): for file in files: try: file_path = os.path.join(dir, file) dest_path = os.path.join(upload_dir, file) print("... copiando fichero: {} en {}".format(file_path, dest_path)) with open( file_path, 'rb' ) as f: dbx.files_upload(f=f.read(), path=dest_path, mode=dropbox.files.WriteMode.overwrite, mute=True) except Exception as err: print("La carga de {} falló: {}".format(file, err)) |
En el ejemplo lo que hacemos es subir la carpeta data/ al directorio test/ de Dropbox. En caso de no existir el directorio test/ se creará automáticamente en nuestra carpeta de Dropbox.
Descarga de ficheros
files_download_to_file
(). Los parámetros que podemos utilizar son los siguientes:- download_path (str), la ruta local donde deseamos descargar el fichero.
- path (str), la ruta del fichero que deseamos descargar, en Dropbox.
- rev (str), es la revisión del fichero que necesitamos. Null si sólo queremos su última revisión.
1 2 3 4 5 |
dropbox_file = '/test.txt' local_path = './data/test.txt' rev = None dbx.files_download_to_file(download_path=local_path, path=dropbox_file, rev=rev) |
Bibliografía
- API de Dropbox para Python.
Gracias por leerlo y no olvides compartir.