Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: jagrane en 22 Junio 2011, 15:34 pm



Título: webbrowser como interceptar descarga de archivos y dirigirlos donde yo quiera
Publicado por: jagrane en 22 Junio 2011, 15:34 pm
Hola
Estoy desarrollando una aplicación en Visual Basic 2005 que abre una página web concreta y segura, selecciona apuntes y hace un click por código en el botón "comprimir y descargar".

Hasta ahí, todo bien, pero al hacer click, sale la clásica ventana pidiendo qué hacer con el archivo, si abrir, guardar o cancelar, para, seguidamente, pedir el nombre y carpeta donde guardar.

La pregunta que hago es:
Cómo puedo capturar la descarga del archivo antes de que aparezcan ventanas y guardarlo donde yo quiera y con el nombre que yo quiera, sin intervención del operador?
Muchas gracias


Título: Re: webbrowser como interceptar descarga de archivos y dirigirlos donde yo quiera
Publicado por: seba123neo en 23 Junio 2011, 01:49 am
Hola, te paso un ejemplo de lo que queres, haber si te sirve, lo que hace es al detectar una URL terminada en la extensión del archivo a descargar (por ejemplo .zip, .rar o .exe) lo que hace es cancelar esa ventana del internet explorer y mostrarte una ventana propia propia (crea un SaveFileDialog) donde vos le pones el nombre que quieras y lo guardas, la descarga se hace en segundo plano mediante WebClient().

Código
  1. Imports System.Net
  2.  
  3. Public Class Form1
  4.  
  5.    Private Sub WebBrowser1_Navigating(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserNavigatingEventArgs) Handles WebBrowser1.Navigating
  6.        If e.Url.Segments(e.Url.Segments.Length - 1).EndsWith(".exe") Then
  7.  
  8.            e.Cancel = True
  9.  
  10.            Dim vPath As String = ""
  11.  
  12.            Dim vFileSave As New SaveFileDialog
  13.  
  14.            vFileSave.FileName = e.Url.Segments(e.Url.Segments.Length - 1)
  15.  
  16.            If vFileSave.ShowDialog() = DialogResult.OK Then
  17.  
  18.                vPath = vFileSave.FileName
  19.  
  20.                Dim vCliente As New WebClient()
  21.  
  22.                AddHandler vCliente.DownloadProgressChanged, AddressOf ProgresoDescarga
  23.                AddHandler vCliente.DownloadFileCompleted, AddressOf DescargaCompleta
  24.  
  25.                vCliente.DownloadFileAsync(e.Url, vPath)
  26.            End If
  27.        End If
  28.    End Sub
  29.  
  30.    Private Sub DescargaCompleta(ByVal sender As Object, ByVal e As EventArgs)
  31.        MessageBox.Show("Descarga Completa")
  32.    End Sub
  33.  
  34.    Private Sub ProgresoDescarga(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
  35.  
  36.        Dim bytesIn As Double = Double.Parse(e.BytesReceived.ToString())
  37.        Dim totalBytes As Double = Double.Parse(e.TotalBytesToReceive.ToString())
  38.        Dim percentage As Double = bytesIn / totalBytes * 100
  39.  
  40.        Me.Text = "Progreso Completado: " & Integer.Parse(Math.Truncate(percentage).ToString()) & " %"
  41.    End Sub
  42.  
  43.    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  44.        WebBrowser1.Navigate("http://releases.mozilla.org/pub/mozilla.org/firefox/releases/5.0/win32/es-AR/Firefox%20Setup%205.0.exe")
  45.    End Sub
  46. End Class
  47.  

este ejemplo descarga del FTP de mozilla firefox, el .exe de la version 5.0

tiene 2 manejadores de eventos, uno para la descarga completada y el otro para el progreso (que te lo muestra en la barra de titulo).

hasta si queres podes sacarle que no cree la ventana, y que lo ponga en el path que vos le digas, ahi si no tendria que apretar nada el usuario.

saludos.


Título: Re: webbrowser como interceptar descarga de archivos y dirigirlos donde yo quiera
Publicado por: jagrane en 23 Junio 2011, 13:53 pm
Gracias seba123neo
He probado tu rutina, pero no me funciona, porque debe trabajara de otra manera:
Al hacer click, solamente envía la url de la página, y entiendo que las identificaciones de los registros a comprimir irán por post. Acto seguido aparece la pantalla de petición.

He puesto un punto de control en el primer if y consultado la url, y en ningún caso pasa el zip por ahí, por lo que no me funciona en este caso.

¿Sabes si hay alguna forma de saber las variables que se envían por post?
¿O cómo cambiar la url para que la envíe a otro sitio?  Tengo instalado u servidor apache y podría dirigirlo a localhost/quevariables.php y hacer un volcado del post.

Y en este caso:
¿Cómo incluir las variables post al enviar la url con webclient?

O inyectar rutinas en java y que se puedan ejecutar.

Te incluyo un ejemplo muy reducido del código de la página:
Código:
<TABLE id=row>
  <THEAD>
  <TR>
    <TH></TH>
    <TH>Estado</TH>
    <TH>Remitente</TH>
    <TH>Destinatario</TH>
    <TH>Asunto</TH>
    <TH>Nº Ord</TH>
    <TH>Fecha envío</TH>
  </TR>
  </THEAD>
  <TBODY>
  <TR>
    <TD><INPUT id=idMensajeSeleccionado1 title="Seleccionar mensaje"
      onkeypress=actualizarSeleccionados(this);
      onclick=actualizarSeleccionados(this);
      value="000001"
      type=checkbox name=idMensajeSeleccionado><INPUT value=on type=hidden
      name=_idMensajeSeleccionado> </TD>
    <TD><IMG alt="Mensaje no leído" src="ico_noleido.gif"></TD>
    <TD>JUAN MARTINEZ PEREZ</TD>
    <TD>PEDRO SANCHEZ ETCETERA</TD>
    <TD>Orden de pedido</TD>
    <TD>20100000853</TD>
    <TD>02/06/2011 17:48:29</TD>
  </TR>
  <TR>
    <TD><INPUT id=idMensajeSeleccionado1 title="Seleccionar mensaje"
      onkeypress=actualizarSeleccionados(this);
      onclick=actualizarSeleccionados(this);
      value="000001"
      type=checkbox name=idMensajeSeleccionado><INPUT value=on type=hidden
      name=_idMensajeSeleccionado> </TD>
    <TD><IMG alt="Mensaje no leído" src="ico_noleido.gif"></TD>
    <TD>JUAN MARTINEZ PEREZ</TD>
    <TD>PEDRO SANCHEZ ETCETERA</TD>
    <TD>Orden de pedido</TD>
    <TD>20100000853</TD>
    <TD>02/06/2011 17:48:29</TD>
  </TR>
  <TR>
    <TD><INPUT id=idMensajeSeleccionado1 title="Seleccionar mensaje"
      onkeypress=actualizarSeleccionados(this);
      onclick=actualizarSeleccionados(this);
      value="000002"
      type=checkbox name=idMensajeSeleccionado><INPUT value=on type=hidden
      name=_idMensajeSeleccionado> </TD>
    <TD><IMG alt="Mensaje no leído" src="ico_noleido.gif"></TD>
    <TD>JUAN MARTINEZ PEREZ</TD>
    <TD>PEDRO SANCHEZ ETCETERA</TD>
    <TD>Orden de pedido</TD>
    <TD>20100000853</TD>
    <TD>02/06/2011 17:48:29</TD>
  </TR>
  <TR>
    <TD><INPUT id=idMensajeSeleccionado1 title="Seleccionar mensaje"
      onkeypress=actualizarSeleccionados(this);
      onclick=actualizarSeleccionados(this);
      value="000003"
      type=checkbox name=idMensajeSeleccionado><INPUT value=on type=hidden
      name=_idMensajeSeleccionado> </TD>
    <TD><IMG alt="Mensaje no leído" src="ico_noleido.gif"></TD>
    <TD>JUAN MARTINEZ PEREZ</TD>
    <TD>PEDRO SANCHEZ ETCETERA</TD>
    <TD>Orden de pedido</TD>
    <TD>20100000853</TD>
    <TD>02/06/2011 17:48:29</TD>
  </TR>
  </TBODY>
</TABLE>
<P>Mensajes seleccionados :<SPAN id=seleccionados>
<SCRIPT>imprimeValor(selec);</SCRIPT>
</SPAN></P>
 <INPUT class=botones title="Comprimir y descargar los mensajes seleccionados" value=Descargar type=submit name=descargar>

Este ultimo boton es el que yo estoy intentando gestionar.

No obstante, en mis búsquedas por la red, creo que hay más gente que busca una subrutina como la tuya.
Un saludo
Jagrane