Automatize downloads de imagens do site com autenticação

Minha intenção é automatizar o download de todas as imagens em um site que requer um login (acho que um login baseado em formulário da Web)

O site:http://www.cgwallpapers.com

O URL de login:http://www.cgwallpapers.com/login.php

Os membros registrados url:http://www.cgwallpapers.com/members

Um URL aleatório de papel de parede que só é acessível e pode ser baixado por membros registrados:http://www.cgwallpapers.com/members/viewwallpaper.php?id=1764&res=1920x1080

Sabendo que oviewwallpaper.php postar dados requer dois parâmetros, o papel de paredeEu iria (de x para y) e o papel de parederes, Gostaria de escrever umPARA para gerar todas as combinações para automatizar os downloads do papel de parede.

A primeira coisa que tentei é usar um WebClient desta maneira:

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")

Mas isso não funcionou, ele retorna o conteúdo do texto html em vez de uma imagem, acho que é porque, como eu li, preciso passar o cookie de login.

Então, eu vi e pesquisei muitos exemplos ao longoStackOverflow e outros sites sobre como fazer login e baixar um arquivo atravésHttpWebRequests porque parece a maneira correta de fazer isso.

É assim que faço o login no site e recebo o cookie de login adequado (ou acho que sim)

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()

Neste ponto, eu estou preso porque não tenho certeza de como usar o cookie de login obtido para baixar as imagens.

Suponho que, depois de obter o cookie de login, faça outra solicitação para o URL de papel de parede desejado usando o cookie de login salvo, não ?, mas acho que estou fazendo errado, o próximo código não funciona,postresponse.ContentLength é sempre-1 então eu não posso escrever para o arquivo.

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)

Como posso corrigir os problemas para baixar os papéis de parede da maneira correta?

questionAnswers(2)

yourAnswerToTheQuestion