6

まず、この件に関する私の素朴さをお許しください。私は DOS が登場する前に始めた引退したプログラマーです。私は ASP.NET の専門家ではありません。私が知る必要があることの一部は、私が知る必要があることです。(フォローしてくれたら…)

Web サイトにログインして、コンテンツをスクレイピングしたいと考えています。メモ帳と fiddler2 を使用して HTML ソースを確認したところ、サイトが ASP.NET テクノロジで実装されていることがわかりました。

私は、c# でスクリーン スクレーパーを作成する方法について、Google で検索し、見つけたすべての情報を読むことから始めました。いくつかの調査と多くの試みの後、私はそれが簡単ではないという結論に達したと思います.

問題の核心 (私が今見ているように) は、ASP がプログラマーが状態を維持するための多くの方法を提供していることです。Cookie、viewstate、セッション変数、ページ変数、get および post パラメーターなど。さらに、プログラマーは、サーバーとクライアントのスクリプト作成の間で作業を分割できます。IE、Safari、Chrome、Firefox などのリッチ Web クライアントは、プログラマーが記述したもの (および ASP フレームワークが内部で実装するもの) を処理する方法を知っています。

WebClient はリッチ Web クライアントではありません。クッキーの実装方法さえ知りません。

だから私は行き詰まっています。1 つの方法は、ASP アプリケーションが期待しているリッチ クライアントのすべての機能をリバース エンジニアリングし、リッチ クライアントを十分に模倣するステロイド クラスで WebClient を記述して、ログインできるようにすることです。

または、IE (またはその他のリッチ クライアント) をアプリに埋め込んでみて、公開されたインターフェイスが十分に充実していて、ユーザー名とパスワードのフィールドをプログラムで入力してフォームを POST で返すことができることを願っています。(そして、応答ストリームにアクセスして、HTML を解析して目的のデータをかき出すことができるようにします...)

または、WebClient よりもはるかにリッチなサードパーティ コントロールを探すこともできます。

どこに注意を向けるべきかについて、誰か鋭い洞察を与えることができますか?

これは、プロジェクトと同じくらい学習体験です。とはいえ、どうしても対象サイトへのログインや情報取得を自動化したい。

4

3 に答える 3

3

これは、WebサイトにログインしてCookieを取得するために使用する関数の例です

string loginSite(string url, string username, string password)
        {
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            string cookie = "";

            //this values will change depending on the website
            string values = "vb_login_username=" + username + "&vb_login_password=" + password
                                + "&securitytoken=guest&"
                                + "cookieuser=checked&"
                                + "do=login";
            req.Method = "POST";
            req.ContentType = "application/x-www-form-urlencoded";
            req.ContentLength = values.Length;
            CookieContainer a = new CookieContainer();
            req.CookieContainer = a;
            System.Net.ServicePointManager.Expect100Continue = false; // prevents 417 error
            using (StreamWriter writer = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII)) { writer.Write(values); }
            HttpWebResponse c = (HttpWebResponse)req.GetResponse();
            Stream ResponseStream = c.GetResponseStream();
            StreamReader LeerResult = new StreamReader(ResponseStream);
            string Source = LeerResult.ReadToEnd();


            foreach (Cookie cook in c.Cookies) { cookie = cookie + cook.ToString() + ";"; }
            return cookie;
        }  

そして、ここに呼び出しの例があります:

string Cookie = loginSite("http://theurl.comlogin.php?s=c29cea718f052eae2c6ed105df2b7172&do=login", "user", "passwd");

            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.theurl.com");
            //once you got the cookie you add it to the header.

            req.Headers.Add("cookie", Cookie);
            HttpWebResponse response = (HttpWebResponse)req.GetResponse();
            using (Stream respStream = response.GetResponseStream())
            {
                using (StreamReader sr = new StreamReader(respStream))
                {
                    string s = sr.ReadToEnd();
                    HtmlReturn = s;
                  //  System.Diagnostics.Debugger.Break();
                }
            }

Firefox では、拡張機能 HTTP-Headers を使用して、投稿によって設定されているパラメーターを把握し、変数値を変更できます。

 string values = "vb_login_username=" + username + "&vb_login_password=" + password
                                + "&securitytoken=guest&"
                                + "cookieuser=checked&"
                                + "do=login";

宛先 Web サイトのパラメーターと一致させるため。

Firefox に Live-HTTP-HEADers を使用することにした場合、Web サイトにログインすると、次のようなヘッダーから投稿情報が取得されます。

GET / HTTP/1.1 ホスト: www.microsoft.com ユーザーエージェント: Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0.1 Accept: text/html,application/xhtml+xml,application/ xml;q=0.9, / ;q=0.8 Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate 接続: キープアライブCookie: WT_FPC=id=82.144.112.152-154450144.30258861:lv=1351580394112:ss=1351575867559; WT_NVR_RU=0=msdn:1=:2=; omn​​iID=0d2276c2_bbdd_4386_a11d_f8da1dbc5489; MUID=349E06C547426937362B02CC434269B9; MC1=GUID=47b2ed8aeea0de4797d3a40cf549dcbb&HASH=8aed&LV=201210&V=4&LU=1351608258765; A=I&I=AxUFAAAAAAALBwAAukh4HjpMmS4eKtKpWV0ljg!!&V=4; msdn=L=en-US

于 2012-11-15T07:30:32.633 に答える
1

これを実行できるChrome拡張機能を構築できる可能性があると思います。

ちなみに、あなたは「セキュリティの専門家」ではありませんか?

于 2012-11-15T07:39:28.633 に答える
0

IE を使用しないのはなぜですか。Windows フォームで IE を自動化するのは非常に簡単です。さらに、プロキシも簡単に処理できます。

于 2012-11-29T07:58:43.983 に答える