2

このページにアクセスするには、パスワードが必要です。パスワードを持っていて、ページにアクセスできます。

DownloadString(URL)関数は、必要な実際のページではなく、ログインページのコンテンツをダウンロードしています。なんで?

using (var client = new WebClient())
            {
                var credentials = new NetworkCredential { UserName = "username", Password = "password" };
                client.Credentials = credentials;

                string pageContents = client.DownloadString(url);

                if (pageContents.Contains("cheetah"))
                {
                    MessageBox.Show("yes!");
                }
                else
                {
                    MessageBox.Show("No");
                }
            }

上記は、私が本当に欲しいページではなく、ログインページのコンテンツを取得しています。どうすればこれに合格できますか?

4

1 に答える 1

3

認証されていないクライアント(WebClient.DownloadString)がページを要求している場合、通常、認証可能なログインフォームにリダイレクトされます。クレデンシャルが渡されて確認されると、クライアントは通常、最初に要求したページに戻ります。

これに合格するには、認証をシミュレートする必要があります。これには通常、ユーザー名とパスワードの受け渡し、Cookieの受け入れ、およびCookieを使用して以降の要求が含まれます。非常に基本的なレベルでは、これはアプローチを説明する必要があります。

using System.Text;
using System.Net;
using System.IO;
using System.Diagnostics;

namespace HttpsRequest
{
    public static class Program
    {
        public static void Main(string[] args)
        {
            var cookieContainer = new CookieContainer();
            var loginRequest = WebRequest.CreateHttp("https://your.url.net/login");
            loginRequest.CookieContainer = cookieContainer;
            var response = loginRequest.Post("Login=foo&Password=bar");
            Debug.Assert(response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.NoContent);

            var homeRequest = WebRequest.CreateHttp("https://your.url.net/home");
            homeRequest.CookieContainer = cookieContainer;
            Debug.Assert(response.StatusCode == HttpStatusCode.OK);
            homeRequest.GetResponse().Body();
        }

        internal static HttpWebResponse Post(this HttpWebRequest request, string data)
        {
            try
            {
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                var encoding = new ASCIIEncoding();
                var dataAsBytes = encoding.GetBytes(data);
                request.ContentLength = dataAsBytes.Length;
                var stream = request.GetRequestStream();
                stream.Write(dataAsBytes, 0, dataAsBytes.Length);
                stream.Close();
                return (HttpWebResponse)request.GetResponse();
            }
            catch (WebException we)
            {
                return (HttpWebResponse)we.Response;
            }
        }

        internal static string Body(this WebResponse response)
        {
            var stream = response.GetResponseStream();
            using (var reader = new StreamReader(stream, Encoding.GetEncoding("utf-8")))
            {
                return reader.ReadToEnd();
            }
        }
    }
}

これを機能させるには、Fiddler、FireBug、または同様のツールを使用してブラウザーからサイトに送信された実際のリクエストを確認し、可能な限りエミュレートしてみることをお勧めします。たとえば、サイトで追加または異なる投稿フィールド、HTTPヘッダーが必要な場合や、無効なSSL証明書がある場合があります。

于 2012-11-08T00:23:33.023 に答える