2013-07-17 87 views
0

我想从http://www.vatgia.com/home/security_code.php?0.6400910824330888下载图像验证码,但验证码仅在我登录时显示。 我使用Web Client下载它,但我无法在下载时添加请求cookie登录。从C#中的直接身份验证链接下载图像

System.Net.WebClient wc = new System.Net.WebClient(); 
    wc.Credentials = new System.Net.NetworkCredential("minhtrung3811", "Nguyen123");//Authenticates to the website - Call it only if the image url needs authentication first 
    wc.DownloadFile(url, "d:\\downloadedImage.jpg"); //Downloads the imageURL to the local file downloadedImage.jpg 

请帮帮我吗?

我更新我的问题!

感谢@Joseph,我有

private void Post(string url) 
     { 
      using (client = new WebClientWithCookies()) 
      { 
       client.OpenReadCompleted += 
        new OpenReadCompletedEventHandler(client_OpenReadCompleted); 
       var uri = new Uri(url, UriKind.RelativeOrAbsolute); 
       client.Headers.Add("Cookie", _cookies); 
       client.OpenReadAsync(uri); 
      } 
     } 

和方法下载文件

public static int DownloadFile(String remoteFilename, 
           String localFilename) 
     { 
      // Function will return the number of bytes processed 
      // to the caller. Initialize to 0 here. 
      int bytesProcessed = 0; 

      // Assign values to these objects here so that they can 
      // be referenced in the finally block 
      Stream remoteStream = null; 
      Stream localStream = null; 
      WebResponse response = null; 

      // Use a try/catch/finally block as both the WebRequest and Stream 
      // classes throw exceptions upon error 
      try 
      { 
       // Create a request for the specified remote file name 
       WebRequest request = WebRequest.Create(remoteFilename); 
       if (request != null) 
       { 
        // Send the request to the server and retrieve the 
        // WebResponse object 
        response = request.GetResponse(); 
        if (response != null) 
        { 
         // Once the WebResponse object has been retrieved, 
         // get the stream object associated with the response's data 
         remoteStream = response.GetResponseStream(); 

         // Create the local file 
         localStream = File.Create(localFilename); 

         // Allocate a 1k buffer 
         byte[] buffer = new byte[1024]; 
         int bytesRead; 

         // Simple do/while loop to read from stream until 
         // no bytes are returned 
         do 
         { 
          // Read data (up to 1k) from the stream 
          bytesRead = remoteStream.Read(buffer, 0, buffer.Length); 

          // Write the data to the local file 
          localStream.Write(buffer, 0, bytesRead); 

          // Increment total bytes processed 
          bytesProcessed += bytesRead; 
         } while (bytesRead > 0); 
        } 
       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
      } 
      finally 
      { 
       // Close the response and streams objects here 
       // to make sure they're closed even if an exception 
       // is thrown at some point 
       if (response != null) response.Close(); 
       if (remoteStream != null) remoteStream.Close(); 
       if (localStream != null) localStream.Close(); 
      } 

      // Return total bytes processed to caller. 
      return bytesProcessed; 
     } 

我下载的图像文件。 ....

String url = "link image captcha code"; 
Post(url); 
Download_file(url, "D:\\IMAGE.PNG"); 

但我不能够获取图像图形验证码:(

+1

这并不容易。您需要对他们的登录表单如何实现进行研究:需要发送哪些字段以及要保存哪些Cookie。 – zerkms

回答

1

一切取决于网站是否会解释您的用户名/密码,当您在提供它你的HTTP请求请看这个帖子WebRequest and WebResponse

除非你有权访问使用真实身份验证的版本,否则你可能需要使用HttpWebRequest和假POST请求到站点,而你有一个CookieContainer,这样你可以保留令牌那你就是abl e将该令牌包含在获取请求中以下载图像文件

+0

我已更新我的问题,请帮助我? –