2011-02-07 8 views
5

と、HttpWebRequestとResponseを使用してGETとPOSTを行う方法についての記事やその他の情報が見つかりました私は自分が働くと思っているように仕事に就くのが苦労していることがわかります。保護されたWebサイトからのログイン、ナビゲート、返信はどうすればよいのですか?

私が発見したが、これまでのところ、何も作業していないいくつかのアイデアをプレーしてきた

...私は自分のコードを投稿します:

private void start_post() 
    { 
     string username = txtUser.Text; 
     string password = txtPassword.Text; 
     string strResponce; 
     byte[] buffer = Encoding.ASCII.GetBytes("username="+username+"&password="+password); 
     HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(txtLink.Text); 
     WebReq.Method = "POST"; 
     //WebReq.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"); 
     WebReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"; 
     WebReq.Headers.Add("Translate", "F"); 
     WebReq.AllowAutoRedirect = true; 
     WebReq.CookieContainer = cookieJar; 
     WebReq.KeepAlive = true; 
     WebReq.ContentType = "application/x-www-form-urlencoded"; 
     WebReq.ContentLength = buffer.Length; 
     Stream PostData = WebReq.GetRequestStream(); 
     PostData.Write(buffer, 0, buffer.Length); 
     PostData.Close(); 

     HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse(); 
     //txtResult.Text = WebResp.StatusCode.ToString() + WebResp.Server.ToString(); 

     Stream answer = WebResp.GetResponseStream(); 
     StreamReader _answer = new StreamReader(answer); 
     strResponce = _answer.ReadToEnd(); 
     //txtResult.Text = txtResult.Text + _answer.ReadToEnd(); 

     answer.Close(); 
     _answer.Close(); 

     foreach (Cookie cookie in WebResp.Cookies) 
     { 
      cookieJar.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), cookie.Path, cookie.Domain)); 
      txtResult.Text += cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString(); 
     } 

     if (strResponce.Contains("Log On Successful") || strResponce.Contains("already has a webseal session")) 
     { 
      MessageBox.Show("Login success"); 
      foreach (Control cont in this.Controls) 
      { 
       cont.Visible = true; 
      } 
     } 
     else 
     { 
      MessageBox.Show("Login Failed."); 
     } 


    } 

ここでのコードで、私が得ることができますよ私はフォームを作成し、そのフォームからパスワードとユーザー名を入力します。http://www.comicearth.com(自分のサイト、PHP、およびApache)に移動すると、ログインが失敗します。それができたら、失敗しました。これは大丈夫です。また、Fidderを使って、何が起こっているのかを見ています。

このように、私は以下のコードから何か間違っていることを知っています。私は別のWebアプリケーションに移動したときに

はしかし、私はライン上の次のエラーを取得:

HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse(); 

「のContent-Lengthまたはチャンクエンコーディングは、データを書き込まない動作に設定することはできません。」

私が間違っているものを見つけるためにしようとしている、とすべてが、私はそれが原因で302リダイレクトのだと述べている...

ので、フィドラーで探して、私は私が投稿しようとするとの大きな違いを見ることができますデータと私がウェブページを介してログインするとき。だから私は十分ではないことを知っているが、私はどこを見なければならないのか分からない。

私の目標は、Webサイトにログインできるアプリケーションを構築し、検索オプションを使用して、ユーザーが手動で行っている現在のデータを引き出すことです。面倒な作業を自動化できれば本当に皆を助けるだろう。しかし、私は現在、ログイン、クッキーの理解などについています...また、ウェブサイトはフレームを使用していますが、それが問題になるかどうかはわかりませんが、私はまだ出くわしていないもう一つのハードルです。

もっと多くのコードを見る必要があるかどうか教えてください。現在、httpwebrequestとhttpwebresponseを使用しています。ウェブクライアントに関するその他の情報を読んでいます。

私はhtmlagilitypackをダウンロードして遊んだことがありますが、現時点では、すべてのことがうまくいっているかどうかは100%わかりません。

良い記事や、このトピックを詳しく解説したり、試してみたいことがある場合は、教えてください。

ありがとうございました。 - リダイレクトのために、 "Content-Length or Chunked Encoding etc ..."というエラーメッセージが表示されていたので、私はこれを知りました。 allowAutoRedirect = falseにして、 "location"タグを探して、このメッセージを取り除いた自分自身をリダイレクトします。しかし、私はまだサイトにログインしていません。これは失望しています。なぜ現時点で?:S

private void start_post2() 
    { 
     string username = txtUser.Text; 
     string password = txtPassword.Text; 
     Uri link = new Uri(txtLink.Text); 
     string postArgs = string.Format(@"userId={0}&password={1}", username, password); 
     byte[] buffer = Encoding.ASCII.GetBytes(postArgs); 
     HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(txtLink.Text); 
     WebReq.Method = "POST"; 
     //WebReq.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"); 
     WebReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"; 
     //WebReq.ClientCertificates.Add("Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"); 
     WebReq.AllowAutoRedirect = false; 
     WebReq.Accept = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 
     WebReq.Accept = "*/*"; 
     //WebReq.Headers.Add(HttpRequestHeader.Cookie, cookieJar); 
     WebReq.CookieContainer = cookieJar; 
     WebReq.KeepAlive = true; 
     WebReq.ContentType = "application/x-www-form-urlencoded"; 
     WebReq.ContentLength = buffer.Length; 
     Stream PostData = WebReq.GetRequestStream(); 
     PostData.Write(buffer, 0, buffer.Length); 
     PostData.Close(); 

     HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse(); 
     if (WebResp == null) throw new Exception("Response is null"); 

     foreach (Cookie cookie in WebResp.Cookies) 
     { 
      cookieJar.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), cookie.Path, cookie.Domain)); 
      //txtResult.Text += cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString(); 
     } 

     if (!string.IsNullOrEmpty(WebResp.Headers["Location"])) 
     { 
      string newLocation = WebResp.Headers["Location"]; 

      //Request the new location 
      WebReq = (HttpWebRequest)WebRequest.Create(newLocation); 
      WebReq.Method = "GET"; 
      WebReq.ContentType = "application/x-www-form-unlencoded"; 
      WebReq.AllowAutoRedirect = false; 
      WebReq.CookieContainer = cookieJar; 
      WebReq.CookieContainer.Add(WebResp.Cookies); 

      buffer = Encoding.ASCII.GetBytes("userId=" + username + "&password=" + password); 

      WebReq.ContentLength = buffer.Length; 
      PostData = WebReq.GetRequestStream(); 
      PostData.Write(buffer, 0, buffer.Length); 
      PostData.Close(); 

      WebResp = (HttpWebResponse)WebReq.GetResponse(); 

      foreach (Cookie cookie in WebResp.Cookies) 
      { 
       cookieJar.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), cookie.Path, cookie.Domain)); 
       //txtResult.Text += cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString(); 
      } 
     } 
     else if (!string.IsNullOrEmpty(WebResp.Headers["Set-Cookie"])) 
     { 
      // thinking... 
     } 

     foreach (Cookie cookie in cookieJar.GetCookies(link)) 
     { 
      MessageBox.Show(cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString()); 
     } 

     StreamReader sr = new StreamReader(WebResp.GetResponseStream()); 
     string responseHtml = sr.ReadToEnd().Trim(); 

     SearchPatient(WebReq, username, password); 

    } 
+1

更新:私はリダイレクトのために、「Content-Length or Chunked Encoding etc ...」というエラーメッセージが表示されていたので、allowAutoRedirect = falseにして、タグをつけて、自分自身をリダイレクトして、このメッセージを取り除いたのですが、私はまだサイトにログインしていません。 ppointingと私はなぜ現時点では把握することはできません。 :S –

答えて

4

そのWinフォームアプリケーションとアプリケーションがちょうどスクリーンスクレーパーはなく、非常に大きなアプリケーションである場合、Uは、ここで廃棄

を行うためWatinを使用することができますが

を開始するため linkです
+0

ありがとう!!!これは私が必要としていたものです。 :) –

関連する問題