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 は、フィドラーで見ているものとはまったく異なるため、ログインしていないように見えます。