2009-06-10 11 views
22

私はこの情報を得るために、私がウェブサイトにログインして情報を収集する必要がある、これは私のものではないウェブサイトからの情報を必要とします。これはHTMLフォームを通じて行われます。どのようにC#でこの認証されたスクリーンセーピングを行うことができますか?screenscapeにウェブサイトにプログラムでログインするにはどうすればいいですか?

追加情報:

  • クッキーベースの認証。
  • POSTアクションが必要です。

答えて

22

フォームに記入したようにリクエストします。たとえばPOSTと仮定すると、正しいデータでPOST要求を行います。今すぐスクラップしたい同じページにログインできない場合は、ログインリクエスト後に設定されたCookieをすべて追跡し、ログインを許可するためにスクレイピングリクエストに含める必要があります。

次のようになります。

HttpWebRequest http = WebRequest.Create(url) as HttpWebRequest; 
http.KeepAlive = true; 
http.Method = "POST"; 
http.ContentType = "application/x-www-form-urlencoded"; 
string postData="FormNameForUserId=" + strUserId + "&FormNameForPassword=" + strPassword; 
byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(postData); 
http.ContentLength = dataBytes.Length; 
using (Stream postStream = http.GetRequestStream()) 
{ 
    postStream.Write(dataBytes, 0, dataBytes.Length); 
} 
HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse; 
// Probably want to inspect the http.Headers here first 
http = WebRequest.Create(url2) as HttpWebRequest; 
http.CookieContainer = new CookieContainer(); 
http.CookieContainer.Add(httpResponse.Cookies); 
HttpWebResponse httpResponse2 = http.GetResponse() as HttpWebResponse; 

多分。

+0

ありがとう、これは私が使用できるもののように見えますが、私がプログラミングに戻ったときにこの答えを受け入れるでしょう。 :-) –

+0

これは、WebページがプレーンなHTML形式で、フォームがJavascript経由で動的に生成されている場合に機能します。これは機能しますか? – Souper

+0

@Superはおそらくそうではありません。サインインからあなたが掻きたいページへのリクエストが何であるかを調べ、その動作を模倣したリクエストを作成したいと思うでしょう。 – dlamblin

0

HTTPWebRequestを使用してPOSTを実行する必要があります。このリンクはあなたが始めるのを助けるはずです。重要なのは、ポストを送信するためにフォームに必要なすべてのパラメータを表示するために投稿しようとしているページのHTMLフォームを調べる必要があることです。

http://www.netomatix.com/httppostdata.aspx

http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx

+0

うん、私は(ほとんどの時代に使用されているので)私が次のページのために私と一緒にクッキーを保つことを言及することを忘れた最も難しい部分です。 –

5

あなたはWebBrowserコントロールを使用することができます。それにサイトのURLを入力し、DOMを使用してユーザー名とパスワードを正しいフィールドに設定し、最終的には送信ボタンにクリックを送信します。この方法では、2つの入力フィールドと送信ボタン以外は気にしません。クッキーの処理、生のHTML解析、HTTPスニッフィングがありません。これはすべてブラウザコントロールによって行われます。

あなたがその道を行く場合は、さらにいくつかの提案:

  1. あなたはアドインFlashなどを読み込みからコントロールを防ぐことができます - あなたにいくつかの時間を節約することができます。
  2. ログインすると、必要な情報をDOMから取得できます。生のHTMLを解析する必要はありません。
  3. 将来的にサイトが変更される場合に備えてツールを移植性の高いものにしたい場合は、明示的なDOM操作をJavaScriptの注入で置き換えることができます。 JSは外部リソースから取得することができ、一度呼び出されると、フィールドの人口とサブミットを行うことができます。答え をdlambinへの追加として
+0

問題は、アプリケーションのこの部分にGUIフォームを作成できないことです。 –

+0

これはあまりにも悪いことです。あなたが低レベルのものをやっていることに疲れたら、あなたはあなたのアプリから産み出される別のGUIアプリケーションを書こうと試みることができます。しかし、それはストレッチのようなものです... – eran

+0

@eran +1。あなたのソリューションはより完全に見えます。 – Souper

0

そうでない場合

HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse; 

それは別の要求がURLを初期するようになりますし、あなたが取得することはできません

http.AllowAutoRedirect=false; 

を持っていることが必要ですurl2。

2

場合によっては、httpResponse.Cookiesは空白になります。代わりにCookieContainerを使用してください。

CookieContainer cc = new CookieContainer(); 

HttpWebRequest http = WebRequest.Create(url) as HttpWebRequest; 
http.KeepAlive = true; 
http.Method = "POST"; 
http.ContentType = "application/x-www-form-urlencoded"; 

http.CookieContainer = cc; 

string postData="FormNameForUserId=" + strUserId + "&FormNameForPassword=" + strPassword; 
byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(postData); 
http.ContentLength = dataBytes.Length; 
using (Stream postStream = http.GetRequestStream()) 
{ 
    postStream.Write(dataBytes, 0, dataBytes.Length); 
} 
HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse; 
// Probably want to inspect the http.Headers here first 
http = WebRequest.Create(url2) as HttpWebRequest; 

http.CookieContainer = cc; 

HttpWebResponse httpResponse2 = http.GetResponse() as HttpWebResponse; 
+0

これは本当にうまくいった、ありがとう。 –

関連する問題