8

私はC#でWebページを操作するのは比較的新しいです。私がやろうとしているのは、特定のWebサイト(https://www15.swalife.com/PortalWeb/portal/cwaLogon.jsp)にログインし、ページをデフォルトページにリダイレクトできるようにしてから、そこから( https://www15.swalife.com/csswa/ea/plt/accessELITT.do)そしてソースコードをダウンロードして文字列に出力します。

HTTPWebRequestとHTTPWebResponseを介してソースコードをダウンロードする方法を理解しましたが、ログイン関数のコーディングに問題があります。POSTで何かしなければならないと思いますか?http://www.dreamincode.net/forums/topic/152297-c%23-log-in-to-website-programmatically/も確認しました。

前もって感謝します!!

編集:

jimmyjamblesによって提供されるコードは、必要なページのソースコードを完全に取得できないことを除いて、問題なく機能します。コードはログインプロセスが失敗したことを示唆していますが、少し調整することでそれを機能させることができると信じています...また、次の問題を抱えているすべての人に:

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(AcceptAllCertifications);

「publicstring」関数と「publicbool」関数をそれぞれ「publicstaticstring」と「publicstaticbool」に変更してみてください:)

編集2:

応答HTML:

"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<HTML>\n<HEAD>\n\n\n\n\n\n\n<META http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\n<META name=\"GENERATOR\" content=\"IBM WebSphere Studio\">\n<TITLE>endSession.jsp</TITLE>\n<LINK rel=\"stylesheet\" href=\"eipPortletStyles/swalife.css\" type=\"text/css\">\n\t<script type=\"text/javascript\" language=\"JavaScript\" \n\t\tsrc=\"eipCommonJavaScript/eipGeneralFunctions.js\"/> </script>\n\t\t\n<script type=\"text/javascript\">\n\n\tfunction refreshParent()\n\t{\n\t    if(window.parent)\n\t    {\n\t    if(window.parent.name == 'appMainFrame')\n\t       window.parent.location = \"/csswa/ea/plt/logout.do\";\n\t    //  alert('Your session has expired.  Please login again. ');\n\t    }\n\t}\n\n</script>\n</HEAD>\n<BODY onload=\"refreshParent();\">\n \n\t \t<div class=\"eipErrors\">\n  \t\t\t<div class=\"legendLabel\">Message</div>\n  \t\t\t\n  \t\t\t    <div class=\"errorsHeader formTitle\">You Have Exited Out of Crew Web Access.<br>  \t\t\t \n  \t\t\t    </div>\n  \t\t\t \n  \t\t\t<div class=\"errorsHeader formTitle\"> Please Close this Window and <font  size=\"+1\">Log Out of SWALife</font> to Complete the Log Out Process.  </div>\n  \t\t<div class=\"errorsText\">\n  \t\t  &nbsp;\n  \t\t\t\t\n  \t\t</div>\n  \t\t\n  \t\t\t\n  \t\t\n  \t\t<div class=\"errorsFooter\">You will need to log back in before continuing.</div>  \t\n  \t\t\n \t</div>\n  \n</BODY>\n</HTML>\n"
4

2 に答える 2

7

ログイン後にHttpWebRequestを使用してセカンダリURLにアクセスするには、いくつかの点に注意する必要があります。

まず、Casperahが述べたように、ログインフォームを調べて、ログインデータの受信に使用されるコントロールの「名前」属性を特定する必要があります。

これを行ったら、それに応じて投稿文字列をフォーマットし、WebRequestに提供する必要があります。

最後の考慮事項は、ログインした後、ログインを維持するサーバーから割り当てられたCookieを保存および維持する必要があるということです。

このmsdnの記事からWebRequestスニペットを取得し、ログイン後に2番目のページ要求を実行するように変更しました。

        string loginurl = "http://www.gmail.com";
        string secondurl = "http://mail.google.com/prefs";

        string username = "bob@gmail.com";
        string password = "12345";
        GetSecondaryLoginPage(loginurl, secondurl, username, password);



    public string GetSecondaryLoginPage(string loginurl, string secondurl, string username, string password, string cookieName = null)
    {
        // Create a request using a URL that can receive a post. 
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(loginurl);
        // Set the Method property of the request to POST.
        request.Method = "POST";

        CookieContainer container = new CookieContainer();

        if (cookieName != null)
            container.Add(new Cookie(cookieName, username, "/", new Uri(loginurl).Host));

        request.CookieContainer = container;

        // Create POST data and convert it to a byte array.  Modify this line accordingly
        string postData = String.Format("username={0}&password={1}", username, password);

        ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);

        byte[] byteArray = Encoding.UTF8.GetBytes(postData);
        // Set the ContentType property of the WebRequest.
        request.ContentType = "application/x-www-form-urlencoded";
        // Set the ContentLength property of the WebRequest.
        request.ContentLength = byteArray.Length;
        // Get the request stream.
        Stream dataStream = request.GetRequestStream();
        // Write the data to the request stream.
        dataStream.Write(byteArray, 0, byteArray.Length);
        // Close the Stream object.
        dataStream.Close();
        // Get the response.
        WebResponse response = request.GetResponse();
        // Get the stream containing content returned by the server.
        dataStream = response.GetResponseStream();
        // Open the stream using a StreamReader for easy access.
        StreamReader reader = new StreamReader(dataStream);
        // Read the content.
        string responseFromServer = reader.ReadToEnd();

        using (StreamWriter outfile =
        new StreamWriter("output.html"))
        {
            outfile.Write(responseFromServer.ToString());
        }

        // Clean up the streams.
        reader.Close();
        dataStream.Close();
        response.Close();

        request = (HttpWebRequest)WebRequest.Create(secondurl);
        request.CookieContainer = container;

        response = request.GetResponse();
        // Get the stream containing content returned by the server.
        dataStream = response.GetResponseStream();
        // Open the stream using a StreamReader for easy access.
        reader = new StreamReader(dataStream);
        // Read the content.
        responseFromServer = reader.ReadToEnd();

        // Clean up the streams.
        reader.Close();
        dataStream.Close();
        response.Close();

        return responseFromServer;
    }


    public bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
    {
        return true;
    }

追加された行は、postDataとCookieのみです。

行を変更する必要があります

string postData = String.Format("username={0}&password={1}", username, password);

フォームのコントロールに基づいて、あなたが一緒に作業しようとしているサイトを投稿したので、おそらくあなたが探していると推測できます

string postData = String.Format("uid={0}&portalBase=cwa&password={1}", username, password);
于 2012-06-08T19:31:09.867 に答える
0

フォームでWebBrowserを使用するのはかなり簡単です。まず、cwaLogon.jspページに移動し、入力コントロールを見つけて、送信ボタンの「クリック」を呼び出します。それか、HTTPWebRequestとResponseを使用して適切なGET/POSTを作成します。Fiddler2を使用して何を投稿するかを確認することは、すばらしいスタートです。

于 2012-06-08T18:43:43.203 に答える