Página 1 de 1

Descargar del Drive

Publicado: Mié Ene 10, 2018 12:38 am
por XeviCOMAS
Hay alguna manera de poder descargar un archivo del Drive desde Xailer, pero en modo "silencioso", sin actuación por parte del usuario de la aplicación. ???

Si hago...

Local cUrl := "https://drive.google.com/file/d/miarchivocompartido/"
ShellExecute( 0, "open", cURL, 0, 0, SW_SHOWNORMAL )

Me abre el explorador con el archivo correctamente que he solicitado... pero, claro, el usuario tiene que interactuar y clicar en descargar el archivo, y/o seleccionar la carpeta para guardar y finalmente cerrar la ventana.

Seria posible hacerlo sin interacción del usuario???

Gracias

Re: Descargar del Drive

Publicado: Mié Ene 10, 2018 1:35 pm
por ignacio
Buenos días,

Nunca he intentado hacerlo, pero estoy convencido que la única forma de hacerlo de forma silenciosa es con un Token para OAuth 2.0 https://developers.google.com/identity/protocols/OAuth2.

Tenemos algo hecho al respecto para GMail (\samples\Gmail), pero lógicamente habría que adaptarlo para GDrive. De momento no tenemos intención de meternos con ello. Lo siento. Es posible que haya algún ActiveX con dicha funcionalidad ya en el mercado.

Un saludo

Re: Descargar del Drive

Publicado: Dom Ene 14, 2018 4:40 pm
por XeviCOMAS
Solucionado.!!!

Solicité consejo a Cristobal Navarro, que dió la conferencia sobre las APIs de Google, y me proporcionó una funcioncilla para descargar ficheros sin necesidad de utilizar las APIs

Re: Descargar del Drive

Publicado: Dom Ene 14, 2018 6:08 pm
por jfgimenez
Xevi,

si el fichero que quieres descargar es público y conoces su URL puedes usar la clase TAsyncFileDownload para descargarlo en segundo plano. Supongo que lo que te ha dicho Cristobal es algo similar, porque si el fichero no es público creo que no hay ninguna forma de descargarlo sin usar la API de google, tal y como te dijo Ignacio. Si conoces alguna forma de hacerlo, sería bueno que la explicaras para que todos la conozcamos.

Re: Descargar del Drive

Publicado: Dom Ene 14, 2018 7:22 pm
por XeviCOMAS
El fichero es público... bien si, lo tengo compartido y lo descargo accediendo a un link https de Drive, que me lo facilita al compartir el fichero.
De hecho, igual no me expliqué bien o no se me preguntó bien como tenia el fichero en Drive.

Lo pruebo con TAsyncFileDownload como bien me has indicado.

Gracias.

Re: Descargar del Drive

Publicado: Dom Ene 14, 2018 8:06 pm
por XeviCOMAS
Jose,

No consigo hechar a andar TAsyncFileDownload

Código: Seleccionar todo

METHOD Button1Click( oSender ) CLASS TFrmConfiguracio

   WITH OBJECT ::oAsynFileDownload1
   :cLocalFile := "Prueba.zip"
   :cRemoteFile := "https://drive.google.com/file/d/151DYvK_Nvi1jdv9j6SnTXHE4OsASVRv6"
   :lConnected := .T.
LogDebug( :Run() )
LogDebug( :lSuccess )
LogDebug( :cError )
   END WITH

RETURN Nil

con un ShellExecute, si, pero no en silencioso...

Código: Seleccionar todo

METHOD HyperLinkDriveClick( oSender, nFlags, nPosX, nPosY ) CLASS TFrmConfiguracio
   ShellExecute( 0, "open", "https://drive.google.com/file/d/151DYvK_Nvi1jdv9j6SnTXHE4OsASVRv6/view?usp=sharing", 0, 0, SW_SHOWNORMAL )
RETURN Nil
Que hago mal en TAsyncFileDownload ???

Gracias.

Re: Descargar del Drive

Publicado: Dom Ene 14, 2018 9:03 pm
por jfgimenez
Xevi,

recuerda que TAsynFileDownload() descarga de forma asíncrona en segundo plano. Por lo tanto, después de ejecutar :Run(), el control vuelve a tu programa sin haber descargado todavía nada de nada. Lo que tienes que hacer es asignar el evento OnDisconnect, y en el código de ese evento hacer las comprobaciones correspondientes (si ha habido error o si el fichero se ha descargado correctamente). Si quieres, también puedes usar los eventos OnTotalLengthInfo y OnTotalDnLoadInfo si quieres mostrar una progressbar o indicar el porcentage que lleva descargado.

Re: Descargar del Drive

Publicado: Dom Ene 14, 2018 9:40 pm
por XeviCOMAS
Jose,

Puesto así...

Código: Seleccionar todo

METHOD Button1Click( oSender ) CLASS TFrmConfiguracio

   WITH OBJECT ::oAsynFileDownload1
   :cLocalFile := "Prueba.zip"
   :cRemoteFile := "https://drive.google.com/file/d/151DYvK_Nvi1jdv9j6SnTXHE4OsASVRv6"
   :lConnected := .T.
:OnDisconnect := {|o| LogDebug( "lSuccess", o:lSuccess ), LogDebug( "cError", o:cError ) }
LogDebug( :Run() )
   END WITH

RETURN Nil

lSucces me retorna .T.
cError me retorna vacio

Pero no descarga nada.

Crea el fichero Prueba.zip, pero bytes 0

El método Run() se encarga de hacer la descarga, no???
Los métodos OnTotalLengthInfo y OnTotalDnLoadInfo son por si quiero información MIENTRAS descarga, no???

Pues no descarga.

Re: Descargar del Drive

Publicado: Dom Ene 14, 2018 10:26 pm
por jfgimenez
Xevi,

esa URL no devuelve el archivo, sino una página web con un botón para descargarlo. Puedes verlo si copias la URL directamente al navegador. Lo que necesitas es la URL final de descarga, la que de verdad devuelve el archivo.

Has comentado que Cristobal te había dicho un truco para descargarlo... prueba con la URL que te haya dicho él.

Re: Descargar del Drive

Publicado: Dom Ene 14, 2018 11:55 pm
por XeviCOMAS
Jose,

no, con la direccion que me funciona que me ha pasado Cristóbal no funciona con TAsyncFileDowload
Sin embargo, con el "truco" que me ha pasado SI me está funcionando.

No posteo la direccion que me ha pasado / truco por deseo expreso de él.

Aunque el tema lo tenga resuelto por la parte que te he comentado, sólo es por utilizar la clase de Xailer ya que si está implementada, que mejor que usarla.
Pero el resultado final no es el deseado.

No se, algun fichero colgado en una web para poder probar la descarga con TAsyncFileDownload ???
O algun Sample???

Gracias por tu tiempo.

Re: Descargar del Drive

Publicado: Lun Ene 15, 2018 9:31 am
por jfgimenez
Xevi,

Por lo que he visto, el "truco" consiste en cambiar una parte de la URL. Afortunadamente, en Internet es casi imposible guardar un secreto ;-)

No te estaba funcionando porque al descargar el archivo, google no proporciona el tamaño del mismo antes de comenzar la descarga. O lo que es lo mismo, la clase recibía que el tamaño del archivo es de 0 bytes, y por eso no llegaba a descargarlo.

Adjunto un ejemplo funcionando correctamente con tu archivo. Dento del proyecto está el .o del módulo correspondiente corregido.

Re: Descargar del Drive

Publicado: Lun Ene 15, 2018 9:37 am
por XeviCOMAS
Jose,

Perfecto, como siempre!!!

También es verdad... hoy en dia, no hay secretos con internet!!!
Googleando un poco, un pocquiiiito solamente...

https://sites.google.com/site/sitescapt ... s-directos

Así pues habia un error y no todo era error mio!!!, jejeje.

Mucho mejor así, de esta manera, se controla la descarga e incorporo un ProgessBar.
Incorporo, pues, la descarga de archivos utilizando TAsyncFileDownload.

Gracias.

Re: Descargar del Drive

Publicado: Lun Ene 15, 2018 10:35 am
por XeviCOMAS
Una cosilla más...

Para que la descarga no sea en otro hilo, o sea que la aplicación no continue hasta que se haya descargado el archivo.

Existe una clase TFileDownload o alguna propiedad a la clase TAsyncFileDownload para que ésta no descargue en multihilo???

O lo tengo que controlar con los eventos/propiedades existentes en la clase???


Gracias.

Re: Descargar del Drive

Publicado: Lun Ene 15, 2018 10:42 am
por jfgimenez
Xevi,

siempre puedes crear un formulario modal, de forma que el usuario no pueda hacer nada hasta que termine la descarga. Por otro lado, también puedes usar la clase TInternet, que no es asíncrona.

Re: Descargar del Drive

Publicado: Lun Ene 15, 2018 10:43 am
por jfgimenez
Xevi,

lo que yo hago es descargar la actualización siempre en segundo plano, y sólo aviso al usuario cuando ya está lista la descarga. Así le evito tener que estar esperando. Personalmente me parece más elegante.

Re: Descargar del Drive

Publicado: Lun Ene 15, 2018 11:15 am
por XeviCOMAS
Gracias, Jose.

Como me interesa no cambiar en esta parte de mi aplicación, ya que la descarga del FTP la tengo hasta hoy así,... "bloqueo" la aplicación con una variable a .T. o a .F. en los eventos OnConnect/OnDisconnect

Y luego...

Código: Seleccionar todo

...
Static lDownLoadDrive := .F.
...
         WITH OBJECT ::oAsynFileDownload1
         :cRemoteFile := cUrl
         :cLocalFile := cMiFileLocal
         :OnConnect := {|| lDownloadDrive := .T. }
         :OnDisconnect := {|| lDownloadDrive := .F. }
         :Run()
         END WITH
         while lDownloadDrive
            ProcessMessages()
         EndDo
Ta funcionando perfectamente y correctamente!!!

Gracias.