2013-02-07 4 views
4

я уже могу зайти на веб-страницу с переадресацией (я спасаю печенье) с этим кодомC# скачать файл из Интернета с логином

CookieCollection cookies = new CookieCollection(); 
     HttpWebRequest cookieRequest = (HttpWebRequest)WebRequest.Create("https://www.loginpage.com/"); 
     cookieRequest.CookieContainer = new CookieContainer(); 
     cookieRequest.CookieContainer.Add(cookies); 
     HttpWebResponse cookieResponse = (HttpWebResponse)cookieRequest.GetResponse(); 
     cookies = cookieResponse.Cookies; 

     string postData = "name=********&password=*********&submit=submit"; 
     HttpWebRequest loginRequest = (HttpWebRequest)WebRequest.Create("https://www.loginpage.com/"); 
     loginRequest.CookieContainer = new CookieContainer(); 
     loginRequest.CookieContainer.Add(cookies); 
     loginRequest.Method = WebRequestMethods.Http.Post; 
     loginRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2"; 
     loginRequest.AllowWriteStreamBuffering = true; 
     loginRequest.ProtocolVersion = HttpVersion.Version11; 
     loginRequest.AllowAutoRedirect = true; 
     loginRequest.ContentType = "application/x-www-form-urlencoded"; 

     byte[] byteArray = Encoding.ASCII.GetBytes(postData); 
     loginRequest.ContentLength = byteArray.Length; 
     Stream newStream = loginRequest.GetRequestStream(); //open connection 
     newStream.Write(byteArray, 0, byteArray.Length); // Send the data. 
     newStream.Close(); 

Это прекрасно работает, но мне нужно, чтобы загрузить файл .xls из там, она находится здесь (например)

https://www.loginpage.com/export_excel.php?export_type=list 

для этого я попробовал этот код

 HttpWebRequest wr = (HttpWebRequest)HttpWebRequest.Create("https://www.loginpage.com/export_excel.php?export_type=list"); 
     HttpWebResponse ws = (HttpWebResponse)wr.GetResponse(); 
     Stream str = ws.GetResponseStream(); 
     byte[] inBuf = new byte[100000]; 
     int bytesReadTotal = 0; 
     string path = @"d:\test.xlsx"; 
     FileStream fstr = new FileStream(path, FileMode.Create, FileAccess.Write); 
     while (true) 
     { 
      int n = str.Read(inBuf, 0, 100000); 
      if ((n == 0) || (n == -1)) 
      { 
       break; 
      } 

      fstr.Write(inBuf, 0, n); 

      bytesReadTotal += n; 
     } 
     str.Close(); 
     fstr.Close(); 

но не ш orking, и теперь я застрял с этим

 string dLink = "https://www.loginpage.com/export_excel.php?export_type=list"; 
     HttpWebRequest fileRequest = (HttpWebRequest)HttpWebRequest.Create(dLink); 
     fileRequest.CookieContainer = new CookieContainer(); 
     fileRequest.CookieContainer.Add(cookies); 
     fileRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2"; 
     HttpWebResponse fileResponse = (HttpWebResponse)fileRequest.GetResponse(); 

     for (int i = 0; i < fileResponse.Headers.Count; ++i) 
     richTextBox1.Text += "\nHeader Name: " + fileResponse.Headers.Keys[i] + ", Value :" + fileResponse.Headers[i]; 

Конечно, он не загружает файл. Я пытаюсь получить заголовки, чтобы просто понять, что я получаю из Интернета? Я уже загрузил некоторые файлы с моим скриптом из таких файлов, как rghost или filehippo, но этот не работает.

+2

Рассматривали ли вы попытку реорганизовать свой код и использовать 'WebClient' для загрузки ..? или вам нужно придерживаться «HttpWebRequest» ..? – MethodMan

+1

@DJKRAZE HttpWebRequest обычно более гибкий, чем WebClient, поскольку WebClient использует HttpWebRequest под ним. WebClient упрощает использование, но также иногда удаляет необходимую гибкость. –

+0

Мне не нужно, мне просто нужно скачать этот файл любым возможным способом :) – MyMomSaysIamSpecial

ответ

5

Это должно сработать!

 CookieContainer cookieJar = new CookieContainer(); 
     CookieAwareWebClient http = new CookieAwareWebClient(cookieJar); 

     string postData = "name=********&password=*********&submit=submit"; 
     string response = http.UploadString("https://www.loginpage.com/", postData); 

     // validate your login! 

     http.DownloadFile("https://www.loginpage.com/export_excel.php?export_type=list", "my_excel.xls"); 

Я использовал CookieAwareWebClient

public class CookieAwareWebClient : WebClient 
{ 
    public CookieContainer CookieContainer { get; set; } 
    public Uri Uri { get; set; } 

    public CookieAwareWebClient() 
     : this(new CookieContainer()) 
    { 
    } 

    public CookieAwareWebClient(CookieContainer cookies) 
    { 
     this.CookieContainer = cookies; 
    } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     WebRequest request = base.GetWebRequest(address); 
     if (request is HttpWebRequest) 
     { 
      (request as HttpWebRequest).CookieContainer = this.CookieContainer; 
     } 
     HttpWebRequest httpRequest = (HttpWebRequest)request; 
     httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
     return httpRequest; 
    } 

    protected override WebResponse GetWebResponse(WebRequest request) 
    { 
     WebResponse response = base.GetWebResponse(request); 
     String setCookieHeader = response.Headers[HttpResponseHeader.SetCookie]; 

     if (setCookieHeader != null) 
     { 
      //do something if needed to parse out the cookie. 
      if (setCookieHeader != null) 
      { 
       Cookie cookie = new Cookie(); //create cookie 
       this.CookieContainer.Add(cookie); 
      } 
     } 
     return response; 
    } 
} 

Source & Credit for : CookieAwareWebClient

+0

Не могли бы вы рассказать, что означает «// подтвердите свой логин!» Здесь? Я новичок C# :( – MyMomSaysIamSpecial

+0

после входа в систему, если вам нужно войти в систему, проверьте, был ли пароль неправильным или что-то в этом роде, если passwd или username ошибочны, в возвращаемом html есть текст, например 'invalid username или password' или что-то подобное –

+0

Ahh спасибо, теперь я пытаюсь войти в систему с вашим кодом :) http://i.imgur.com/Tamza4q.png Так что я отложил проверку на немного! – MyMomSaysIamSpecial

0

Если учетная запись клиента уже является действительным пользователем сайта вам просто нужно использовать учетные данные по умолчанию, перед загрузкой, как поэтому ..

WebClient Client=new WebClient(); 
Client.UseDefaultCredentials=true; 
Client.DownloadFile(url, destination); 
Смежные вопросы