0

http://www.conquerclub.com/game.php?game=13025037

プログラムでこのアドレスにログオンし、HttpWebRequest/HttpWebResponse などを使用して、ページのすべての html を文字列として取得する方法を知っている人はいますか?

ユーザー名 - 「testuser1」

パスワード - 「テスト」

(実際にログオンできるように、これらの資格情報を使用してサイトにアカウントを作成しました)

これまでのところ、私はこれを持っています

private void toolStripButton1_Click(object sender, EventArgs e)
{
    var request = WebRequest.Create("http://www.conquerclub.com/game.php?game=13025037");
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    StreamReader reader = new StreamReader(response.GetResponseStream());
    richTextBox1.Text = reader.ReadToEnd();
}

これにより、ログイン ページの html が自動的にリダイレクトされて返されます。ユーザー名とパスワードを渡して自動的にログインし、代わりにゲーム ページを取得するにはどうすればよいですか?

これにはかなりの数の同様の質問があることを知っており、さまざまなことを試すのに数時間を費やしましたが、何も機能しません。

編集:-

これをさらに調べたところ、このサイトはログインに Cookie を使用しています。

このコードを試してみましたが、まだログイン ページを返すだけです。

private void toolStripButton1_Click(object sender, EventArgs e)
{
    string loginUri = "http://www.conquerclub.com/login.php";
    string username = "testuser1";
    string password = "testing";
    string reqString = "username=" + username + "&password=" + password;
    byte[] requestData = Encoding.UTF8.GetBytes(reqString);

    CookieContainer cc = new CookieContainer();
    var request = (HttpWebRequest)WebRequest.Create(loginUri);
    request.Proxy = null;
    request.AllowAutoRedirect = false;
    request.CookieContainer = cc;
    request.Method = "post";
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = requestData.Length;
    using (Stream s = request.GetRequestStream())
        s.Write(requestData, 0, requestData.Length);

    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        if (response.Cookies != null)
        {
            foreach (Cookie c in response.Cookies)
                Console.WriteLine(c.Name + " = " + c.Value);
        }
    }

    string newloginUri = "http://www.conquerclub.com/game.php?game=13025037";
    HttpWebRequest newrequest = (HttpWebRequest)WebRequest.Create(newloginUri);
    newrequest.Proxy = null;
    newrequest.CookieContainer = cc;
    using (HttpWebResponse newresponse = (HttpWebResponse)newrequest.GetResponse())
    using (Stream resSteam = newresponse.GetResponseStream())
    using (StreamReader sr = new StreamReader(resSteam))
        richTextBox1.Text = sr.ReadToEnd();
}

ゲームページにログインするための下部のコードは、最初にFirefoxでフィドラーを使用して手動でログインし、Cookieをコピーして貼り付け、次のようにnewrequestにハードコーディングすることで機能させることができることがわかりました。

string newloginUri = "http://www.conquerclub.com/game.php?game=13025037";
HttpWebRequest newrequest = (HttpWebRequest)WebRequest.Create(newloginUri);
newrequest.Proxy = null;
newrequest.CookieContainer = new CookieContainer();
newrequest.CookieContainer.Add(new Uri("http://www.conquerclub.com"), new Cookie("PHPSESSID","86bte1ipainiq760vm2flv4h13"));
newrequest.CookieContainer.Add(new Uri("http://www.conquerclub.com"), new Cookie("phpbb3_jer7c_u", "648113"));
newrequest.CookieContainer.Add(new Uri("http://www.conquerclub.com"), new Cookie("phpbb3_jer7c_k", ""));
newrequest.CookieContainer.Add(new Uri("http://www.conquerclub.com"), new Cookie("phpbb3_jer7c_sid", "3eebb0771a68c4a58581e495c34b2c93"));
using (HttpWebResponse newresponse = (HttpWebResponse)newrequest.GetResponse())
using (Stream resSteam = newresponse.GetResponseStream())
using (StreamReader sr = new StreamReader(resSteam))
    richTextBox1.Text = sr.ReadToEnd();

これにより、必要に応じてゲームページが返されますが、ログインを機能させる方法がわかりません。これにより、正しい Cookie が返されます。コードをデバッグすると、戻ってくる Cookie は、フィドラーで見ているものとはまったく異なるため、ログインしていないように見えます。

4

2 に答える 2

2

作成したコードは、指定された URL の GET を実行します。ただし、ログイン時にページのコンテンツを取得するには、すべてのフォーム変数を渡して代わりに POST リクエストを発行することで、WebRequest が実際にフォームに入力しているように見せる必要があります。

http://msdn.microsoft.com/en-us/library/debx8sh9.aspxは、必要な手順の適切なウォークスルーを提供します。以下は 100% 完了したわけではありませんが、正しい方向への一歩となるはずです。

var request = WebRequest.Create("http://www.conquerclub.com/login.php");
request.Method = "POST";

var parameters = new Dictionary<string, string> { 
    { "username", "testuser1" }, 
    { "password", "testing" }, 
    { "redirect", "game.php?game=13025037" }, 
    { "direct", "63###www.conquerclub.com###" }, 
    { "protocol", "HTTP" }, 
    { "submit", "Login" } };

var content = string.Join( "&", ( from p in parameters select p.Key + "=" + HttpUtility.UrlEncode( p.Value) ).ToArray() ); ;

byte[] bytes = new byte[content.Length * sizeof(char)];
System.Buffer.BlockCopy(content.ToCharArray(), 0, bytes, 0, bytes.Length);

request.ContentLength = bytes.Length;
request.ContentType = "application/x-www-form-urlencoded";

Stream dataStream = request.GetRequestStream();
dataStream.Write( bytes, 0, bytes.Length );
dataStream.Close();

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string result = reader.ReadToEnd();

content画面には表示されないさまざまな値が含まれていることに注意してください。これらは、フォームのソースを表示するか、(より簡単に) ブラウザーのデバッグ ツールバーの [ネットワーク] タブを使用して、フォームが送信されたときに送信されるデータを監視することで確認できます。

于 2013-07-25T23:03:29.307 に答える