2010-04-10 37 views
3

我需要一些幫助,我已經分配了一個工作項目。目前我們手動進入網站,登錄,然後每個月從供應商的網站下載2個excel文件。這些文件然後被加載到SQL中。從密碼保護網站下載自動化

我們想讓這個過程自動化。現在將文件加載到SQL我可以做到,但我不知道如何自動登錄到網站輸入我的用戶詳細信息和收集文件。我主要處理SQL,並且具有很少的.NET體驗,所以任何代碼示例都將非常感謝。

只是爲了確認。登錄表單位於aspx頁面上。只是一個包含用戶名&密碼字段,忘記密碼鏈接和登錄按鈕的表格的基本表單

+0

是否登錄通過頁面上的表單,或者瀏覽器對話框詢問用戶名和密碼? – 2010-04-10 14:55:50

+2

有許多不同的方法來密碼保護網站(HTTP基本;登錄頁面設置cookie,...)。你的網站使用什麼機制? – dtb 2010-04-10 14:56:31

回答

4

您可以使用webclient或httpwebrequest。

Login to the page with HttpWebRequest

How do you login to a webpage and retrieve its content in C#?

HttpWebRequest的例子:

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://sso.bhmobile.ba/sso/login"); 
    req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)"; 
    req.Method = "POST"; 
    req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
    req.Headers.Add("Accept-Language: en-us,en;q=0.5"); 
    req.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"); 
    req.KeepAlive = true; 
    req.Headers.Add("Keep-Alive: 300"); 
    req.Referer ="http://sso.bhmobile.ba/sso/login"; 

    req.ContentType = "application/x-www-form-urlencoded"; 

    String Username = "username"; 
    String PassWord = "Password"; 

    StreamWriter sw = new StreamWriter(req.GetRequestStream()); 
    sw.Write("application=portal&url=http%3A%2F%2Fwww.bhmobile.ba%2Fportal%2Fredirect%3Bjsessionid%3D1C568AAA1FB8B5C757CF5F68BE6ECE65%3Ftype%3Dssologin%26url%3D%2Fportal%2Fshow%3Bjsessionid%3D1C568AAA1FB8B5C757CF5F68BE6ECE65%3Fidc%3D1023278&realm=sso&userid=" + Username + "&password=" + password + "&x=16&y=11"); 
    sw.Close(); 

    HttpWebResponse response = (HttpWebResponse)req.GetResponse(); 


    StreamReader reader = new StreamReader(response.GetResponseStream()); 
    string tmp = reader.ReadToEnd(); 

    foreach (Cookie cook in response.Cookies) 
    { 
     tmp += "\n" + cook.Name + ": " + cook.Value; 
    } 


    Response.Write(tmp); 
    Response.End(); 

Web客戶端例如:

WebClient wc = new WebClient(); 
wc.Credentials = new NetworkCredential("username", "password"); 
string url = "http://foo.com";     
try 
{ 
     using (Stream stream = wc.OpenRead(new Uri(url))) 
     { 
       using (StreamReader reader = new StreamReader(stream)) 
      { 
       return reader.ReadToEnd(); 
      } 
     } 
} 
catch (WebException e) 
{ 
     //Error handeling 
} 
+1

好的答案,除了我會放棄「Accept-Encoding:gzip,deflate」標題,因爲您將不得不爲這種情況解壓流。 並使用像Fiddler這樣的東西來嗅探你應該如何發送實際的請求。 – 2010-04-10 15:11:02

+0

謝謝: - 它看起來像webclient是我所需要的。將進一步調查 – Andrew 2010-04-10 15:23:50

+0

@Mikael Svenson:好點! Yip,fiddler很棒,應該總是用來檢查在使用webclient或httpwebrequest模擬瀏覽器請求時需要發送哪些標題,表單域和隱藏字段。 +1 – 2010-04-10 15:25:23