Automatice las descargas de imágenes del sitio web con autenticación
Mi intención es automatizar la descarga de todas las imágenes en un sitio web que requiere un inicio de sesión (creo que un inicio de sesión basado en un formulario web)
El sitio web:http://www.cgwallpapers.com
La URL de inicio de sesión:http://www.cgwallpapers.com/login.php
Los miembros registrados url:http://www.cgwallpapers.com/members
Una URL de fondo de pantalla aleatoria que solo es accesible y descargable para miembros registrados:http://www.cgwallpapers.com/members/viewwallpaper.php?id=1764&res=1920x1080
Sabiendo que elviewwallpaper.php la publicación de datos toma dos parámetros, el fondo de pantallacarné de identidad (de xay) y el fondo de pantallaresMe gustaría escribir unPARA para generar todas las combinaciones para automatizar las descargas de fondos de pantalla.
Lo primero que probé es usar un WebClient de esta manera:
Dim client As New WebClient()
client.Credentials = New System.Net.NetworkCredential("user", "pass")
client.DownloadFile("http://www.cgwallpapers.com/members/viewwallpaper.php?id=1764&res=1920x1080", "C:\file.jpg")
Pero eso no funcionó, devuelve el contenido del texto html en lugar de una imagen, creo que es porque, como he leído, necesito pasar la cookie de inicio de sesión.
Entonces, he visto e investigado muchos ejemplos sobreDesbordamiento de pila y otros sitios sobre cómo iniciar sesión y descargar un archivo a través deHttpWebRequests
porque parece la forma correcta de hacerlo.
Así es como inicio sesión en el sitio web y obtengo la cookie de inicio de sesión adecuada (o eso creo)
Dim logincookie As CookieContainer
Dim url As String = "http://www.cgwallpapers.com/login.php"
Dim postData As String = "action=go&emailMyUsername=&wachtwoord=MyPassword"
Dim tempCookies As New CookieContainer
Dim encoding As New UTF8Encoding
Dim byteData As Byte() = encoding.GetBytes(postData)
Dim postReq As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
With postReq
.Method = "POST"
.Host = "www.cgwallpapers.com"
.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
.Headers.Add("Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3")
.Headers.Add("Accept-Encoding: gzip, deflate")
.ContentType = "application/x-www-form-urlencoded"
.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0"
.Referer = "http://www.cgwallpapers.com/login.php"
.KeepAlive = True
postReq.CookieContainer = tempCookies
postReq.ContentLength = byteData.Length
End With
Dim postreqstream As Stream = postReq.GetRequestStream()
With postreqstream
.Write(byteData, 0, byteData.Length)
.Close()
End With
Dim postresponse As HttpWebResponse = DirectCast(postReq.GetResponse(), HttpWebResponse)
tempCookies.Add(postresponse.Cookies)
logincookie = tempCookies
postresponse.Close()
postreqstream.Close()
En este punto, estoy atascado porque no estoy seguro de cómo usar la cookie de inicio de sesión obtenida para descargar las imágenes.
Supongo que después de obtener la cookie de inicio de sesión, solo debería realizar otra solicitud a la URL del fondo de pantalla deseada usando la cookie de inicio de sesión guardada, ¿no ?, pero creo que lo estoy haciendo mal, el siguiente código no funciona,postresponse.ContentLength
es siempre-1 así que no puedo escribir en el archivo.
Dim url As String = "http://www.cgwallpapers.com/members/viewwallpaper.php?"
Dim postData As String = "id=1764&res=1920x1080"
Dim byteData As Byte() = Encoding.GetBytes(postData)
Dim postReq As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
With postReq
.Method = "POST"
.Host = "www.cgwallpapers.com"
.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
.Headers.Add("Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3")
.Headers.Add("Accept-Encoding: gzip, deflate")
.ContentType = "application/x-www-form-urlencoded"
.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0"
.KeepAlive = True
' .Referer = ""
.CookieContainer = logincookie
.ContentLength = byteData.Length
End With
Dim postreqstream As Stream = postReq.GetRequestStream()
With postreqstream
.Write(byteData, 0, byteData.Length)
.Close()
End With
Dim postresponse As HttpWebResponse = DirectCast(postReq.GetResponse(), HttpWebResponse)
Dim memStream As MemoryStream
Using rdr As Stream = postresponse.GetResponseStream
Dim count As Integer = Convert.ToInt32(postresponse.ContentLength)
Dim buffer As Byte() = New Byte(count) {}
Dim bytesRead As Integer
Do
bytesRead += rdr.Read(buffer, bytesRead, count - bytesRead)
Loop Until bytesRead = count
rdr.Close()
memStream = New MemoryStream(buffer)
End Using
File.WriteAllBytes("c:\wallpaper.jpg", memStream.ToArray)
¿Cómo puedo solucionar los problemas para descargar los fondos de pantalla de la manera adecuada?