Dropbox API desde Excel VBA | Gestión de archivos

Hola mundo! Hoy veremos cómo gestionar archivos usando Dropbox API desde Excel VBA

Vale! Trataré de hacer muy sencilla la explicación y empezaré desde un punto cero, quizá más adelante haga una segunda parte

Descargar Dropbox API desde Excel VBA (Contraseña: tutorialesexcel.com)

Los puntos que veremos serán:

  • Crear una cuenta en Dropbox y obtener nuestras credenciales
  • Subir un archivo a Dropbox desde VBA
  • Listar archivos en nuestro Dropbox desde VBA
  • Descargar archivos de nuestro Dropbox con VBA

Crear una cuenta en Dropbox y obtener nuestras credenciales

Vale! Como diría Franky esto es SÚPER NECESARIO, hay que hacerlo de la manera más apropiada

He creado el correo dropbox@tutorialesexcel.com, el cual usaremos para crear nuestra cuenta en Dropbox y obtener nuestras credenciales

Ingresamos a www.dropbox.com/login y creamos una cuenta

Dropbox API excel VBA

Te llegará un correo, es necesario que validez tu cuenta sino no podrás usar la API

Ahora debemos ingresar al enlace dropbox.github.io/dropbox-api-v2-explorer/

Dropbox API Explorer Excel

Damos click sobre token/from_oauth1 o podemos ir al siguiente enlace dropbox.github.io/dropbox-api-v2-explorer/#auth_token/from_oauth1

Ahora debemos dar clic sobre Get Token

Get Token Dropbox Excel

Luego click sobre permitir y obtenemos nuestro token

token/from_oauth1 dropbox excel

Muy bien y para el proceso que queremos hacer ya tenemos todo lo necesario

Subir un archivo a Dropbox desde Excel VBA

Vale, esta es la parte más difícil, trataré de explicarlo lo mejor posible así que mucha atención

Primero debemos crear la carpeta en donde subiremos nuestro archivo, vamos a dropbox.com/home y creamos la carpeta

Muy bien, ahora que ya está creada programaremos un código en Excel VBA que nos permita alojar un archivo en ésta carpeta

Y debido al periódico uso que vamos a realizar, he decidido programarlo en un módulo de clase

Public Token As String, rutaDescargar As String, carpetaDB As String

Public Function cargarDropbox(archivoSubir As String, Optional nombreDropbox As String) As Boolean
    Dim enviado$, subida$

    Respuesta = ArchivoByte(archivoSubir)
    If nombreDropbox <> Empty Then
        subida = nombreDropbox
    Else
        subida = nombreArchivo(archivoSubir)
    End If
    
    subida = "/" & carpetaDB & "/" & subida
    
    enviado = "{""path"":""" & subida & """,""mode"":{"".tag"":""overwrite""},""autorename"":false,""mute"":true}"
    Set req = CreateObject("WINHTTP.WinHTTPRequest.5.1")
    
    req.Open "POST", "https://content.dropboxapi.com/2/files/upload", False
    req.setRequestHeader "Authorization", "Bearer " & Token
    req.setRequestHeader "Content-Type", "application/octet-stream"
    req.setRequestHeader "Dropbox-API-Arg", enviado
    req.setRequestHeader "User-Agent", "api-explorer-client"
    req.send (Respuesta)
    
    If req.Status = 200 Then
        cargarDropbox = True
    Else
        cargarDropbox = False
    End If
End Function

Private Function ArchivoByte(archivo As String) As Byte()
    Dim b() As Byte
    Open archivo For Binary As #1
    ReDim b(FileLen(archivo) - 1)
    Get #1, , b
    Close #1
    ArchivoByte = b
End Function

Private Function nombreArchivo(archivo As String) As String
    Dim ubi As Integer
    ubi = InStrRev(archivo, "\")
    nombreArchivo = Mid(archivo, ubi + 1, Len(archivo))
End Function

He creado una variable opcional por si necesitamos escribir un nuevo nombre a nuestro archivo a subir, la pregunta más frecuente con respecto a este código es el request

Los datos del request los he obtenido desde el mismo Dropbox API dropbox.github.io/dropbox-api-v2-explorer/#files_upload

API dropbox upload

Y para usar el módulo de clase creado, usaremos un módulo

Const TokenDropbox As String = "sl.AHg4FfCIfoib3ypkFypMXd2oBsJcIpYqPlxRFJ0QSH7SmcF8OxfXHiWGXRhBjj_1pZigidq68jnAha-CQUAWcVaL5cmMqISttG1OJKqklunngFYyb0vAP-MLXihP4AfsAtvpmjq_"
Const carpetaDropbox As String = "archivos"

Sub Carga()
    Dim nuevo As New Dropbox, archivo$, nombre$
    nuevo.Token = TokenDropbox
    nuevo.carpetaDB = carpetaDropbox
    
    archivo = Application.GetOpenFilename
    nombre = Dir(archivo)
    If nuevo.cargarDropbox(archivo, nombre) = True Then
        MsgBox "Archivo subido correctamente", vbInformation, "TutorialesExcel.com"
    Else
        MsgBox "Error al intentar subir el archivo", vbCritical, "TutorialesExcel.com"
    End If
End Sub

He definido dos constantes, para brindarle al lector la facilidad de sólo asignarle el valor que necesite para poder crear su propia conexión

Listar archivos en nuestro Dropbox desde VBA

Estamos viendo cómo usar la Dropbox API desde Excel VBA, este proceso será muy parecido al paso anterior

Esta vez trabajaremos con otro request, las cuales las podemos obtener desde aquí

Subir archivo a nube excel vba

Programaremos el código de listado y lo agregaremos a nuestro módulo de clase

Public Sub listarDropbox(Hoja As Worksheet, Optional fila As Long)
    
    Dim i As Long
    enviado = "{""path"": ""/" & carpetaDB & """}"
    Set req = CreateObject("WINHTTP.WinHTTPRequest.5.1")
    
    req.Open "POST", "https://api.dropboxapi.com/2/files/list_folder", False
    req.setRequestHeader "Authorization", "Bearer " & Token
    req.setRequestHeader "Content-Type", "application/json"
    req.setRequestHeader "User-Agent", "api-explorer-client"
    req.send (enviado)
    
    If req.Status = 200 Then
        Set jsonObject = JsonConverter.ParseJson(req.ResponseText)
        If fila <> Empty Then
            i = fila
        Else
            i = 10
        End If
        
        With Hoja
            .Range("A9", "A" & Rows.Count).EntireRow.Delete
            .Range("A" & i - 1) = "Name": .Range("B" & i - 1) = "ID": .Range("C" & i - 1) = "Client_modified": .Range("D" & i - 1) = "Server_modified"
            .Range("E" & i - 1) = "Rev": .Range("F" & i - 1) = "Size": .Range("G" & i - 1) = "Content_hash"
            
            For Each Item In jsonObject("entries")
                .Range("A" & i) = jsonObject("entries")(i - 9)("name")
                .Range("B" & i) = jsonObject("entries")(i - 9)("id")
                .Range("C" & i) = jsonObject("entries")(i - 9)("client_modified")
                .Range("D" & i) = jsonObject("entries")(i - 9)("server_modified")
                .Range("E" & i) = jsonObject("entries")(i - 9)("rev")
                .Range("F" & i) = jsonObject("entries")(i - 9)("size")
                .Range("G" & i) = jsonObject("entries")(i - 9)("content_hash")
                i = i + 1
            Next
        End With
        
    End If
    
End Sub

Usamos a la librería JsonConverter, la cual la puedes descargar del siguiente link (Contraseña: tutorialesexcel.com)

Y ahora sólo ejecutaremos un pequeño procedimiento

Sub listado()
    Dim nuevo As New Dropbox
    nuevo.Token = TokenDropbox
    nuevo.carpetaDB = carpetaDropbox
    nuevo.listarDropbox Hoja1, 10
End Sub

Descargar archivos de nuestro Dropbox con VBA

Vale en este caso usaremos a dropbox.github.io/dropbox-api-v2-explorer/#files_get_temporary_link

request dropbox excel

Parseando el Json obtenido podemos obtener el link temporal de descarga, de la siguiente forma

Public Function descargarDropbox(Optional nombreArchivo As String) As Boolean
    Set req = CreateObject("WINHTTP.WinHTTPRequest.5.1")
    result = "{""path"": ""/" & carpetaDB & "/" & nombreArchivo & """}"
    
    req.Open "POST", "https://api.dropboxapi.com/2/files/get_temporary_link", False
    req.setRequestHeader "Authorization", "Bearer " & Token
    req.setRequestHeader "Content-Type", "application/json"
    req.setRequestHeader "User-Agent", "api-explorer-client"
    req.send (result)
    
    If req.Status = 200 Then
        descargarDropbox = True
        Set jsonObject = JsonConverter.ParseJson(req.ResponseText)
        Debug.Print jsonObject("link")
    Else
        descargarDropbox = False
    End If
End Function

Ahora usaremos una API para descargar el archivo temporal Descargar archivo web en 3 simples pasos VBA, quedando nuestro código de la siguiente forma

#If VBA7 And Win64 Then
    Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" _
      Alias "URLDownloadToFileA" ( _
        ByVal pCaller As LongPtr, _
        ByVal szURL As String, _
        ByVal szFileName As String, _
        ByVal dwReserved As LongPtr, _
        ByVal lpfnCB As LongPtr _
      ) As Long
#Else
    Private Declare Function URLDownloadToFile Lib "urlmon" _
      Alias "URLDownloadToFileA" ( _
        ByVal pCaller As Long, _
        ByVal szURL As String, _
        ByVal szFileName As String, _
        ByVal dwReserved As Long, _
        ByVal lpfnCB As Long _
      ) As Long
#End If

Public Token As String, rutaDescargar As String, carpetaDB As String

Public Function descargarDropbox(Optional nombreArchivo As String) As Boolean
    Set req = CreateObject("WINHTTP.WinHTTPRequest.5.1")
    result = "{""path"": ""/" & carpetaDB & "/" & nombreArchivo & """}"
    
    req.Open "POST", "https://api.dropboxapi.com/2/files/get_temporary_link", False
    req.setRequestHeader "Authorization", "Bearer " & Token
    req.setRequestHeader "Content-Type", "application/json"
    req.setRequestHeader "User-Agent", "api-explorer-client"
    req.send (result)
    
    If req.Status = 200 Then
        descargarDropbox = True
        Set jsonObject = JsonConverter.ParseJson(req.ResponseText)
        URLDownloadToFile 0, jsonObject("link"), rutaDescargar & nombreArchivo, 0, 0
    Else
        descargarDropbox = False
    End If
End Function

Crearemos un proceso adicional en el módulo

Sub descarga()
    Dim nuevo As New Dropbox
    nuevo.Token = TokenDropbox
    nuevo.carpetaDB = carpetaDropbox
    nuevo.rutaDescargar = rutaDropbox
    If nuevo.descargarDropbox("LuIS.jpg") = True Then
        MsgBox "Archivo descargado exitosamente " & Chr(13) & "Ruta: " & rutaDropbox, vbInformation, "TutorialesExcel.com"
    Else
        MsgBox "Problema al descargar archivo", vbCritical, "TutorialesExcel.com"
    End If
End Sub

Y listo hemos terminado, espero te haya gustado mi publicación

Cualquier consulta o asesoría puedes escribirme a Luisrojas@tutorialesexcel.com

Descargar Dropbox API desde Excel VBA (Contraseña: tutorialesexcel.com)

Recuerda que puedes descargar todos los archivos de mi blog completamente gratis desde tutorialesexcel.com/archivos/

Deja una respuesta