1

夜のかなりの部分をこれに費やしましたが、何が悪いのかわかりません。データはログイン ページに投稿され、問題なく処理されます。間違ったログイン/パスワードはエラー ページとして表示され、成功した場合は "Location" ヘッダーを含む空白の応答が返されます。ただし、そこまたは他の保護されたページに移動しようとすると、ログイン ページが返されます。私はどこかで些細なことを見逃しているに違いないと思います。以下は、もちろん実際のユーザー/パスワードを除いた完全なコードです。誰かが何が間違っているのかを理解してくれることを願っています:)

$class Program
{
    static void Main(string[] args)
    {
        try
        {
            var cookieContainer = new CookieContainer();
            var username = "user";
            var password = "pwd";

            // LOGIN
            Console.WriteLine("Logging in...");

            var postData = string.Format("username={0}&password={1}&remote=&action=auth&submit=Login&from=", username, password);
            var req = (HttpWebRequest)WebRequest.Create("https://freedns.afraid.org/zc.php");
            req.CookieContainer = cookieContainer;
            req.Method = "POST";
            req.ContentLength = postData.Length;
            req.ContentType = "application/x-www-form-urlencoded";

            // This is necessary to capture cookies
            // The response will contain a "Location" header for redirect
            req.AllowAutoRedirect = false;

            req.KeepAlive = true;
            req.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";

            var encoding = new ASCIIEncoding();
            var loginDataBytes = encoding.GetBytes(postData);
            req.ContentLength = loginDataBytes.Length;
            var stream = req.GetRequestStream();
            stream.Write(loginDataBytes, 0, loginDataBytes.Length);

            var webResp = (HttpWebResponse)req.GetResponse();

            var datastream = webResp.GetResponseStream();
            if (datastream == null) { throw new Exception("Data stream is null."); }

            var reader = new StreamReader(datastream);
            var response = reader.ReadToEnd();

            if (response.IndexOf("Invalid UserID/Pass") != -1) { throw new Exception("Invalid user/password."); }
            if (response.IndexOf("must enable cookies") != -1) { throw new Exception("Cookies not enabled."); }

            // ACCESS PAGE
            Console.WriteLine("Accessing page...");

            req = (HttpWebRequest)WebRequest.Create("https://freedns.afraid.org/dynamic/");
            req.CookieContainer = cookieContainer;
            req.Method = "GET";
            req.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";

            webResp = (HttpWebResponse)req.GetResponse();

            datastream = webResp.GetResponseStream();
            if (datastream == null) { throw new Exception("No response received."); }

            reader = new StreamReader(datastream);
            response = reader.ReadToEnd();
            Console.WriteLine(response);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
            Console.ReadKey();
        }
    }
}
4

1 に答える 1

0

HttpUtility.UrlEncode(string)次のような特殊文字を投稿するために使用する必要がある場合があります!@#$%^&*()_+<>?:;"'{[}]|\

これをプロジェクトへの参照として追加し、名前空間で参照する必要があります。

于 2015-01-14T23:24:31.470 に答える