2013-10-22 105 views
0

你好有一個用MW 1.18.2構建的網站,它要求用戶登錄 - 沒有這個網站,你不能訪問它的任何頁面。我有手動從瀏覽器登錄的有效憑據,但我需要能夠從我的Windows窗體應用程序(C#)執行相同的操作:當用戶單擊一個按鈕時,我必須顯示(或導航到)來自網站的某個頁面,爲此我必須先以編程方式登錄。我已經在PHP和JScript中找到了這些示例,但在該Web工作人員中是新手,我不知道如何使用它們,我不確定它們可以在客戶端使用。如何以編程方式登錄到mediawiki網站

任何幫助將不勝感激。

+0

您使用的網絡瀏覽器控制或純代碼來顯示網頁? – Ben

+0

這沒關係 - 我可以做任何一種方式 – user2907621

回答

1

網站認證往往工作如下:憑據

  1. 用戶提交(通過HTTP POST操作)到服務器
  2. 如果憑據正確,服務器與令牌和潛在會話響應其他cookie令牌。瀏覽器存儲這些信息並將它們隨每個請求返回給服務器。

也許最簡單的選擇是以編程方式在WebBrowser控件中填寫表單並提交它。所需的步驟是discussed here。主要步驟是確定要操作的表單元素(用戶名和密碼字段),所有這些都可以使用大多數Web瀏覽器中提供的各種開發人員工具完成。

另一種選擇是使用HttpClient提交登錄詳細信息,然後將接收到的會話和cookie數據傳遞給WebBrowser控件。看着維基百科,登陸場似乎通過POST提交:

URL: https://en.wikipedia.org/w/index.php?title=Special:UserLogin&action=submitlogin&type=login&returnto=Main+Page 
wpName: <username> 
wpPassword: <password> 
wpRemember: 1|0 
wpLoginAttempt: Log in 
wpLoginToken: <a token from a hidden form input> 
wpForceHttps: 0 

我想通了這一點通過網絡標籤下使用谷歌Chrome瀏覽器的開發者工具(按F12)。如果您提交表單,通常可以找到包含表單信息的POST請求(而不是大多數HTTP GET請求)。

您在這裏遇到的最大問題可能是表單中隱藏的令牌。我會想象它現在停止從登錄表單以外的任何地方進行自動登錄。如果mediawiki默認使用此功能,則如果您不控制mediawiki安裝,則沒有簡單的方法繞過它。此時,您可能只需使用第一種方法(因爲您必須訪問DOM才能獲得令牌)。

+0

謝謝LeoR,它的工作原理! – user2907621

1

謝謝雷歐,它的工作原理:

private void buttonLoginAndShowMainPage_Click(object sender, EventArgs e) 
    { 
     this.webBrowser1.Navigate(mediawikisite); 
    } 

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     HtmlDocument doc = this.webBrowser1.Document; 

     HtmlElement LoginForm = doc.Forms[0]; 
     HtmlElement UserName = doc.GetElementById("wpName1"); 
     HtmlElement Password = doc.GetElementById("wpPassword1"); 

     UserName.SetAttribute("value", "myuserid"); 
     Password.SetAttribute("value", "mypassword"); 

     LoginForm.InvokeMember("submit"); 
    }