2014-12-01 47 views
0

使用C#和ASP.NET我想以編程方式填寫Web表單的值,然後'POST'這些值。c# - 以編程方式填寫並提交登錄

我已經看到了使用Web客戶端和其他類職位,如他人的例子:

How do you programmatically fill in a form and 'POST' a web page?

我期待開展類似的功能 - 在這裏我自動發佈的數據形式。在我的情況下,我正在尋找提交數據來模擬登錄。我有幾個問題:

1)使用此主題中的郵政編碼,如何確定郵政是否成功?我們實際上不能假定200響應是成功的。假定302重定向表示成功也不一定是正確的。有沒有任何確定的火災方式來確定我們在帖子後成功登錄?

2)一些網站是否阻止不是源於他們自己的域的請求?

+0

如果你知道表單域,那麼你不需要填寫表格。只需使用值進行發佈請求即可。除非網站使用反僞造令牌,那麼在這種情況下,您必須知道令牌和會話cookie。 – Andre 2014-12-01 16:34:50

+1

你應該假設200 OK意味着它說什麼。 是的一些網站阻止不是源自其自己的域的請求。 登錄序列通常是專門編寫的,以防止您嘗試執行的操作,即對登錄名的殭屍攻擊。它們可能包括2.5年因素認證,隨機生成的密碼短語和字形識別,因此您的問題沒有通用的解決方案。你應該只在你認識的系統上做這件事,在這種情況下,Fiddler會告訴你什麼是Http序列。 – PhillipH 2014-12-01 16:36:23

+0

不知道你是否可以假設200是好的,因爲你可以得到200響應(一切正常),但在HTML中有一個登錄失敗的消息。但聽起來似乎沒有任何解決方案適合所有評論。多謝你們! – 2014-12-01 16:40:08

回答

2

是的一些網站阻止請求。但您可以使用auth cookie檢查登錄。使用的HttpWebRequest/HttpWebResponse

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url)); 

byte[] data = Encoding.Default.GetBytes("item1=11111&item2=22222&Item3=33333"); 
request.Method = "POST"; 
request.ContentLength = data.Length; 

Stream sout = request.GetRequestStream(); 
sout.Write(data, 0, data.Length); 
sout.Flush(); 
sout.Close(); 

request.CookieContainer = new CookieContainer(); 
HttpWebResponse response = (HttpWebResponse) request.GetResponse(); 

現在檢查response.Cookies用於身份驗證的cookie

+0

是不是每個站點特定的auth cookie?所以你需要知道這一點。如果我要使用這種方法,有沒有辦法從我的請求傳遞給客戶端瀏覽器的cookie(這將運行在服務器端代碼中)?真的傳遞它。 – 2014-12-01 16:47:49

+1

認證cookie是Web服務器用來知道用戶是否登錄的最常用方法。是的,你可以通過cookie var CookieContainer = new CookieContainer(); \t Uri target = new Uri(「http://www.google.com/」); \t cookieContainer.Add(新Cookie(name,value){Domain = target.Host}); \t request.CookieContainer = cookieContainer;' – 2014-12-01 17:00:11