Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Agente Naranja en 26 Junio 2009, 16:41 pm



Título: Pregunta rápida sobre programa: Bajar imágenes de internet
Publicado por: Agente Naranja en 26 Junio 2009, 16:41 pm
Hola, se me ha ocurrido hacer un programa que baje una lista de imágenes de una página web, tipo Flickr, pero hacerlo en C++ se me haría bastante pesado, y he pensado que aprovecharía Visual basic para hacerlo, dada la facilidad de hacer interfaces gráficas en este lenguaje.

Pero mientras aprendo lo básico del lenguaje, me gustaría que me dijerais qué controles debo usar para cada una de las siguientes tareas, o que me dierais una recomendación sobre qué documentación leer, porque todo lo que encuentro de VB en internet es para crear HTML, y yo no quiero hacer eso.

1 - Descargar una página HTML y almacenar el contenido en alguna variable para luego
2 - Usar un parser XML para buscar las etiquetas IMG y copiar las URL de cada una, además buscar las etiquetas de enlace <A> para comprobar si hay más páginas de imágenes
3 - Descargar a una carpeta todas las imágenes.

Bueno, eso es lo que quiero hacer, no pido que me vais a hacer el código, ni mucho menos, solamente quiero saber qué funciones debería aprender, o qué controles voy a necesitar.

Gracias a todos :)


Título: Re: Pregunta rápida sobre programa: Bajar imágenes de internet
Publicado por: Karcrack en 26 Junio 2009, 17:58 pm
Bueno, te respondo a tus pasos con codigos ::)

1_
Código
  1. Public Function ReadURL(ByVal sURL As String) As String
  2.    Dim oWinHTTP        As Object 'As New WinHttp.WinHttpRequest
  3.  
  4.    Set oWinHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
  5.  
  6.    With oWinHTTP
  7.        Call .Open("GET", sURL)
  8.        Call .Send
  9.        ReadURL = .ResponseText
  10.    End With
  11.  
  12.    Set oWinHTTP = Nothing
  13. End Function

3_ (Se puede hacer de muchas formas...)
Código
  1. 'URLMON
  2. 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
  3.  
  4. Public Function DownloadToFolder(ByVal sURL As String, ByVal sFolder As String) As Boolean
  5.    Dim sPath           As String
  6.  
  7.    If Right$(sFolder, 1) <> "\" Then sFolder = sFolder & "\"
  8.  
  9.    sPath = sFolder & Mid$(sURL, InStrRev(sURL, "/") + 1)
  10.  
  11.    DownloadToFolder = (URLDownloadToFile(ByVal 0&, sURL, sPath, ByVal 0&, ByVal 0&) = 0)
  12. End Function

Lo de parsear te lo dejo a ti, es facil ;D (Split, Mid, Instr... blah, blah..xD)

Saludos :D


Título: Re: Pregunta rápida sobre programa: Bajar imágenes de internet
Publicado por: Agente Naranja en 26 Junio 2009, 18:32 pm
Ok, muchas gracias, ahora estoy usando la primera función, y estoy tratando de ver cómo hacer que durante el tiempo que dura la petición me muestre un mensaje "cargando" y que se detenga al acabar. He visto que el objeto winHTTP tiene algunos eventos como OnResponseFinished(), pero no se bien cómo usarlos. ¿He de declararlos como SUB dentro del evento del botón? O sea sería algo como...

Código
  1. Private Sub button1_click()
  2.   Private Sub oWinHTTP_OnResponseFinished
  3.   .....
  4.   End Sub
  5. End Sub


No lo se, estoy tratando de buscar la forma de usar esos eventos pero te digo que no tengo casi idea de Basic, así que perdona si hago alguna pregunta que parezca elemental o si el código no tiene sentido :P


Título: Re: Pregunta rápida sobre programa: Bajar imágenes de internet
Publicado por: Karcrack en 26 Junio 2009, 19:00 pm
No, no se puede poner un Sub dentro de otro... al menos no asi tal cual...

Si lo que quieres es utilizar los eventos del WinHTTP entonces tendras que declararlo con eventos... mira este ejemplo:
(Recuerda añadir el componente Microsoft HTTP)
Código
  1. Option Explicit
  2.  
  3. Dim WithEvents oWinHTTP         As WinHttp.WinHttpRequest
  4.  
  5. Private Sub Form_Load()
  6.    Set oWinHTTP = New WinHttp.WinHttpRequest
  7.    Debug.Print ReadURL("https://foro.elhacker.net/programacion_vb-b50.0/")
  8. End Sub
  9.  
  10. Public Function ReadURL(ByVal sURL As String) As String
  11. '    Dim oWinHTTP        As Object 'As New WinHttp.WinHttpRequest
  12. '
  13. '    Set oWinHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
  14.  
  15.    With oWinHTTP
  16.        Call .Open("GET", sURL)
  17.        Call .Send
  18.        ReadURL = .ResponseText
  19.    End With
  20.  
  21. '    Set oWinHTTP = Nothing
  22. End Function
  23.  
  24. Private Sub oWinHTTP_OnResponseStart(ByVal Status As Long, ByVal ContentType As String)
  25.    MsgBox "Se inicio la descarga"
  26. End Sub
  27.  
  28. Private Sub oWinHTTP_OnResponseFinished()
  29.    MsgBox "Se finalizo la descarga!!"
  30. End Sub

Saludos ;)


Título: Re: Pregunta rápida sobre programa: Bajar imágenes de internet
Publicado por: Agente Naranja en 26 Junio 2009, 19:19 pm
Creo que eso es lo que me pasa, que no sé como agregar el componente HTTP.

Acabo de agregar una referencia a winhttp.dll, de esta forma no me dice que no está definido WinHttpRequest, pero aún sigo luchando por que me salga un anuncio al acabar la carga.

Código
  1. Option Explicit On
  2.  
  3.  
  4. Public Class Form1
  5.  
  6.  
  7.    Dim WithEvents oWinHTTP As WinHttp.WinHttpRequest
  8.  
  9.  
  10.    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  11.        oWinHTTP = New WinHttp.WinHttpRequest
  12.    End Sub
  13.  
  14.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  15.  
  16.        Dim regreso As String
  17.  
  18.        lblEstado.Text = "Cargando..."
  19.  
  20.        oWinHTTP.Open("GET", txtURL.Text)
  21.        oWinHTTP.Send()
  22.  
  23.        regreso = oWinHTTP.ResponseText
  24.  
  25.        txtTexto1.Text = regreso
  26.  
  27.    End Sub
  28.  
  29.    Private Sub oWinHTTP_OnResponseFinished()
  30.        lblEstado.Text = "Finalizado"
  31.  
  32.    End Sub
  33.  
  34.  
  35. End Class

Con este código obtengo:

Código:
Excepción del tipo 'System.ArgumentException' en Microsoft.VisualBasic.dll
Excepción del tipo 'System.ArgumentException' en WindowsApplication1.exe
Excepción del tipo 'System.Runtime.InteropServices.COMException' en WindowsApplication1.exe


Título: Re: Pregunta rápida sobre programa: Bajar imágenes de internet
Publicado por: Karcrack en 26 Junio 2009, 19:56 pm
Eso que tu haces no es VB6....

Lo lamento, pero odio .NET :xD


Título: Re: Pregunta rápida sobre programa: Bajar imágenes de internet
Publicado por: Agente Naranja en 26 Junio 2009, 20:02 pm
Yo es que ni idea de si es o no .NET, me he bajado el visual basic express 2008 y ni idea si es .NET o qué. Vaya lio para programar una sola aplicación, me está sacando de quicio.

Ahora bien, sabiendo lo que quiero hacer, ¿tú recomendarías algún otro lenguaje? No se, alguien me dice que con python, pero me gustaría tener una GUI para que se viera mejor la cosa. Pero Basic me está dando bastantes dolores de cabeza (y eso que solo llevo un día :P )

AÑADO: He pensado una cosa, que llevo tiempo aprendiendo C/C++ y ahora que tengo que hacer un programa, ¿qué se me ocurre? Cambiar a otro lenguaje. Pues no! Me voy a pasar de nuevo a C++, para algo ha de servir todo lo que he aprendido :P

Saludos y gracias de todos modos.


Título: Re: Pregunta rápida sobre programa: Bajar imágenes de internet
Publicado por: Karcrack en 26 Junio 2009, 21:16 pm
Bueno, con C lo tienes que hacer con APIs... OpenURL* Para sacar el codigo de un URL... y para los formularios puedes hacerlo igual con C...

Saludos ;D