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?