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?

Respuestas a la pregunta(2)

Su respuesta a la pregunta