4

ac# アプリケーションを構築しているとします。申請の目的:

  1. ユーザーからユーザー名とパスワードを取得します。
  2. ウェブサイトにある情報を表示します。

バックグラウンドで、ユーザー名とパスワードを取得した後、次のようにする必要があります。

  1. それらの資格情報を使用して Web サイトにログインします。
  2. ログイン後に表示されるアンカーリンクをクリックします。
  3. 情報を保持するスパンを見つけます。
  4. 情報を取得します。

それは例でした。私は実際に帯域幅の使用情報を表示するアプリを構築しています。サーバーはそのための API を公開しません。

同様の目的で利用できるチュートリアル/情報/記事はありますか? 何を検索すればいいのですか?

4

4 に答える 4

18

HttpWebRequests の基本的な紹介

まず、仕事に適したツールが必要になります。Firefox 用のライブ HTTP ヘッダープラグインをダウンロードします。これにより、HTTP ヘッダーをリアルタイムで表示できるため、Web サイトとやり取りするときに送信される POST データを表示できます。Web サイトに送信されるデータがわかったら、独自の HTTP Web 要求をプログラムで作成してプロセスをエミュレートできます。ツール > ライブ HTTP ヘッダー

[ツール] > [ライブ HTTP ヘッダー]に移動して、ライブ HTTP ヘッダーを読み込みます。ログインしたい Web サイトへの GUI ナビゲートをロードしたら、デモンストレーションのためにFacebookを使用します。ログインの準備ができている資格情報を入力しますが、その前に GUI テキスト ウィンドウをクリアし、Captureというラベルの付いたチェック ボックスがオンになっていることを確認します。ログインすると、必要な POST データを含むリクエストに関するさまざまな情報がテキスト ウィンドウに表示されます。

POST データを簡単に識別できるように、 [すべて保存... ] をクリックし、テキスト ドキュメントでユーザー名を検索するのが最善の方法です。私のリクエストでは、POST データは次のようになりました。

lsd=AVp-UAbD&display=&legacy_return=1&return_session=0&trynum=1&charset_test=%E2%82%AC%2C%C2%B4%2C%E2%82%AC%2C%C2%B4%2C%E6%B0%B4%2C %D0%94%2C%D0%84&timezone=0&lgnrnd=214119_mDgc&lgnjs=1356154880&email=%myfacebookemail40outlook.com&pass=myfacebookpassword&default_persistent=0

これは、次のように C# で定義できます。

StringBuilder postData = new StringBuilder();
postData.Append("lsd=AVqRGVie&display=");
postData.Append("&legacy_return=1");
postData.Append("&return_session=0");
postData.Append("&trynum=1");
postData.Append("&charset_test=%E2%82%AC%2C%C2%B4%2C%E2%82%AC%2C%C2%B4%2C%E6%B0%B4%2C%D0%94%2C%D0%84");
postData.Append("&timezone=0");
postData.Append("&lgnrnd=153743_eO6D");
postData.Append("&lgnjs=1355614667");
postData.Append(String.Format("&email={0}", "CUSTOM_EMAIL"));
postData.Append(String.Format("&pass={0}", "CUSTOM_PASSWORD"));
postData.Append("&default_persistent=0");

Web ブラウザーを介して「手動で」送信できる POST データと、そのデータを使用して C# で要求をエミュレートする方法との関係を示すことを目指しています。POST データの送信は決定論的とはほど遠いことを理解してください。さまざまな Web サイトがさまざまな方法で動作し、あらゆる種類のものを自分のやり方で投げることができます。以下は、Facebook の資格情報が正しいことを検証するためにまとめた関数です。クラスとそのメンバーは十分に自己文書化されているため、ここで非常に深く掘り下げることはできませんし、すべきでもありません。WebRequest.Method プロパティなど、MSDNで使用されているメソッドについては、私が提供できるよりも優れた情報を見つけることができます。

    private bool ValidateFacebookCredentials(string email, string password)
    {
        CookieContainer cookies = new CookieContainer();
        HttpWebRequest request = null;
        HttpWebResponse response = null;
        string returnData = string.Empty;

        //Need to retrieve cookies first
        request = (HttpWebRequest)WebRequest.Create(new Uri("https://www.facebook.com/login.php?login_attempt=1"));
        request.Method = "GET";
        request.CookieContainer = cookies;
        response = (HttpWebResponse)request.GetResponse();

        //Set up the request
        request = (HttpWebRequest)WebRequest.Create(new Uri("https://www.facebook.com/login.php?login_attempt=1"));
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
        request.Referer = "https://www.facebook.com/login.php?login_attempt=1";
        request.AllowAutoRedirect = true;
        request.KeepAlive = true;
        request.CookieContainer = cookies;

        //Format the POST data
        StringBuilder postData = new StringBuilder();
        postData.Append("lsd=AVqRGVie&display=");
        postData.Append("&legacy_return=1");
        postData.Append("&return_session=0");
        postData.Append("&trynum=1");
        postData.Append("&charset_test=%E2%82%AC%2C%C2%B4%2C%E2%82%AC%2C%C2%B4%2C%E6%B0%B4%2C%D0%94%2C%D0%84");
        postData.Append("&timezone=0");
        postData.Append("&lgnrnd=153743_eO6D");
        postData.Append("&lgnjs=1355614667");
        postData.Append(String.Format("&email={0}", email));
        postData.Append(String.Format("&pass={0}", password));
        postData.Append("&default_persistent=0");

        //write the POST data to the stream
        using(StreamWriter writer = new StreamWriter(request.GetRequestStream()))
            writer.Write(postData.ToString());

        response = (HttpWebResponse)request.GetResponse();

        //Read the web page (HTML) that we retrieve after sending the request
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            returnData = reader.ReadToEnd();

        return !returnData.Contains("Please re-enter your password");
    }
于 2012-12-22T06:12:05.917 に答える
2

コンテンツ取得のサンプルコード(スクリーンスクレイピング)

 Uri uri = new Uri("http://www.microsoft.com/default.aspx");
 if(uri.Scheme = Uri.UriSchemeHttp) 
 {
     HttpWebRequest request = HttpWebRequest.Create(uri);
     request.Method = WebRequestMethods.Http.Get;
     HttpWebResponse response = request.GetResponse();
     StreamReader reader = new StreamReader(response.GetResponseStream());
     string  tmp = reader.ReadToEnd();
     response.Close();
     Response.Write(tmp);
  }

HttpWebRequest を使用してリモート Web ページにデータを投稿する方法のサンプル コード

   Uri uri = new Uri("http://www.amazon.com/exec/obidos/search-handle-form/102-5194535-6807312");
   string data = "field-keywords=ASP.NET 2.0";
   if (uri.Scheme == Uri.UriSchemeHttp)
   {
       HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
       request.Method = WebRequestMethods.Http.Post;
       request.ContentLength = data.Length;
       request.ContentType = "application/x-www-form-urlencoded";
       StreamWriter writer = new StreamWriter(request.GetRequestStream());
       writer.Write(data);
       writer.Close();
       HttpWebResponse response = (HttpWebResponse)request.GetResponse();
       StreamReader reader = new StreamReader(response.GetResponseStream());
       string tmp = reader.ReadToEnd();
       response.Close();
       Response.Write(tmp);
   }

ソース

于 2012-12-22T05:16:39.353 に答える
1

(現在 DownloadString で使用している HTTP 動詞である GET の代わりに) WebClient を POST に引き続き使用できますが、(わずかに) 低レベルのクラス WebRequest および WebResponse を使用する方が簡単であることがわかると思います。

これには 2 つの部分があります。1 つ目は、ログイン フォームを投稿することです。2 つ目は、"Set-cookie" ヘッダーを回復し、GET 要求と共に "Cookie" としてサーバーに送り返すことです。サーバーはこの Cookie を使用して今後あなたを識別します (Cookie ベースの認証を使用していると仮定すると、そのページは "PHPSESSID" を含む Set-cookie ヘッダーを返すため、これはかなり確信しています)。

詳細はこちら

于 2012-12-22T05:07:02.877 に答える
1

HTTP クライアントの実装には、そのためのオープンソース ライブラリがたくさんあります。たとえばカールを見てください。何人かが.NET ラッパーを作成しました

于 2012-12-22T05:05:51.117 に答える