2

大学の図書館にある本の締め切りを延長する C# プログラムを作成しようとしています。私がやりたいことは次のとおりです: 1.) C# プログラムに入力されたユーザー名とパスワードを使用して、WebRequest & POST メソッドを介して図書館の Web サイトにログインします。 GET パラメータとしてのユーザー名 3.) 指定されたページのコンテンツをダウンロードして、C# プログラムでユーザーに表示します。 4.) ユーザーがプログラムの対応するボタンを押した場合、延長フォームを Web サイトに送信して、すべてのメディアを一度に延長します。

現在、1 と 2 の間で行き詰まっています。Web サイトに接続してユーザーデータを入力できるようですが、取得した WebResponse は再びログイン ページです (Web サイトで手動でログインする場合はそうではありません)。 )。

これは私がウェブサイトに接続するために書いた方法です:

// Login function, logs the user in, uses passed user number & password
    public static Boolean userLogin(String unr, String pass)
    {
        // Login
        // Cookie needed for maintaining php session
        CookieContainer cContainer = new CookieContainer();
        Console.WriteLine(unr+","+pass);
        String postUrl = "https://universitylibrary.com/loan/DB=4/LNG=DU/USERINFO_LOGIN";
        String formParams = String.Format("ACT={0}&HOST_NAME={1}&HOST_PORT={2}&HOST_SCRIPT={3}&LOGIN={4}&STATUS={5}&BOR_U={6}&BOR_PW={7}","UI_DATA","","","","KNOWNUSER","HML_OK", unr, pass);
        String cookieHeader;
        WebRequest wreq = WebRequest.Create(postUrl);
        wreq.ContentType = "application/x-www-form-urlencoded";
        wreq.Method = "POST";
        byte[] bytes = Encoding.ASCII.GetBytes(formParams);
        wreq.ContentLength = bytes.Length;
        using (Stream os = wreq.GetRequestStream())
        {
            os.Write(bytes, 0, bytes.Length);
        }
        WebResponse resp = wreq.GetResponse();
        cookieHeader = resp.Headers["Set-cookie"];

        //Authentication trial
        String PageSource;
        String getUrl = "https://universitylibrary.com:443/loan/DB=4/USERINFO";
        WebRequest getReq = WebRequest.Create(getUrl);
        getReq.Headers.Add("Cookie",cookieHeader);
        WebResponse getResp = getReq.GetResponse();
        using (StreamReader sr = new StreamReader(getResp.GetResponseStream()))
        {
            PageSource = sr.ReadToEnd();
        }
        Console.Write(PageSource);
        return true;
    }

私の間違いがわかりますか?コンソールにソースコードとパラメーター (ユーザー名、パスワード) の出力が表示されますが、出力はやはりログイン ページです。私はただ php ページを見るだけですが、内部システム データにはアクセスできません。私が持っているのは HTML ページだけです。

どんな提案でも大歓迎です!

編集:

私はすべてを再考し、フィドラーによって記録されたように HTTP 要求ヘッダーを完全に再構築しました。関数のその部分は次のようになります。

 // Login
        // Cookie needed for maintaining php session
        CookieContainer cContainer = new CookieContainer();
        HttpCookie cookie = new HttpCookie("cookie", "PSC_4='xxxxxxx'; DB='n'");
        CookieCollection cookieCol = new CookieCollection();
        cookieCol.Add(cookieCol);
        cContainer.Add(cookieCol);
        Console.WriteLine(unr+","+pass);
        String postUrl = "https://universitylibrary.com:443/loan/DB=4/USERINFO";
        String formParams = String.Format("ACT={0}&HOST_NAME={1}&HOST_PORT={2}&HOST_SCRIPT={3}&LOGIN={4}&STATUS={5}&BOR_U={6}&BOR_PW={7}","UI_DATA","","","","KNOWNUSER","HML_OK", unr, pass);
        String cookieHeader;
        HttpWebRequest wreq = (HttpWebRequest) WebRequest.Create(postUrl);
        wreq.Referer = "https://universitylibrary.com/loan/DB=4/LNG=DU/USERINFO_LOGIN";
        wreq.KeepAlive = true;
        wreq.ContentLength = 119;
        wreq.Host = "universitylibrary.com";
        wreq.ContentType = "application/x-www-form-urlencoded";
        wreq.Method = "POST";
        wreq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0";
        wreq.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        wreq.SendChunked = true;
        wreq.TransferEncoding = "gzip, deflate";
        byte[] bytes = Encoding.ASCII.GetBytes(formParams);
        wreq.ContentLength = bytes.Length;
        using (Stream os = wreq.GetRequestStream())
        {
            os.Write(bytes, 0, bytes.Length);
        }
        cookieHeader = "";
        try
        {
            HttpWebResponse resp = (HttpWebResponse) wreq.GetResponse();
            cookieHeader = resp.Headers["Set-cookie"];
        }
        catch (WebException ex)
        {
            Console.WriteLine(ex.Status);
            Console.WriteLine(ex.Response);
        }

ただし、以前と同じ問題で、まだすべてが機能しません。HttpWebRequest が https を処理できない、または https が機能するために他に何か不足している可能性はありますか? (HTTP と HTTPS は構文的に同一のようで、ポートは正しく 443 に設定されています。本当の違いは追加の SSL/TLS レイヤーにあるようです。これをどこかに追加する必要があるのでしょうか?)

4

2 に答える 2

1

ログイン ページが返された場合、正しく認証されていない可能性があります。これにはいくつかの理由が考えられますが、最終的には、Web サイトの手動ログインからの HTTP 通信を正しくミラーリングしていないことが原因です。

私が通常行っていることは、Fiddler などのモニターを使用して、手動ログインから完全な要求/応答パターンをキャプチャし、後でコードにミラーリングすることです。

于 2013-10-10T21:12:10.847 に答える
-1

たとえば、ログイン データを確認した後、ログイン ページを変更して、"SuccessfullySignIn" だけを出力することができます。これがあなたが受け取るデータである場合、 $if (getReq == "SuccessfullySignIn") { //何かを行う } そして、あなたのウェブページでリダイレクト機能を使用してみてください

于 2013-10-10T20:55:12.063 に答える