C#WebClient Webサイトにログオンします
質問
(正しい)ユーザー名とパスワードを提供することにより、Webサイトにログオンしようとしています。
これがコードです:
string URL = @"https://www.t-mobile.co.uk/service/your-account/login/";
string username = "a_user";
string password = "a_password";
//ServicePointManager.Expect100Continue = false;
CookieAwareClient client = new CookieAwareClient();
NameValueCollection postData = new NameValueCollection();
postData.Add("username", username);
postData.Add("password", password);
byte[] response = client.UploadValues(URL, postData);
ASCIIEncoding enc = new ASCIIEncoding();
string Source = enc.GetString(response);
しかし、驚き、それはログオンしていません。ログオンページを取り戻すだけです。
どんな助けも感謝し、これは今私の頭をやっています!!
ありがとう、ジム
ここに完全性が私のWebClientクラスです -
public class CookieAwareClient : WebClient
{
private CookieContainer m_container = new CookieContainer();
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
if (request is HttpWebRequest)
{
(request as HttpWebRequest).CookieContainer = m_container;
}
return request;
}
}
解決
これは、ブラウザでログインしようとする場合、サーバーに投稿されます。
org.apache.struts.taglib.html.token = 81243ce1a02ff285745f7c25b86234a9&showlogin = true&upgrade =&username = username&password = password&password&submit = log+log+in
これらの値も追加してみて、トークンの生成方法を把握してください。
編集:そのページが与えられるCookieがあなたに提出されているかどうかを確認してください。
別の編集:リクエストまたは投稿データの使用を行っているときにサーバーとブラウザの間で何が起こっているのか(= firefox)を参照してください LiveHttPheaders アドオン。
他のヒント
次のようなユーザーエージェントを追加してみてください。
client.Headers.Add("user-agent", "your user agent here");
Webサイトは、特定のブラウザが使用されていること、および/または人間のふりをすることを保証したい場合があります。
最初の問題が1つ表示されます。送信URLではなくページURLに投稿しています(セッションIDがあり、私のコードでは有効なセッションIDをチェックします)。また、ユーザー名のCookieを作成している「ProcessSaveuserch()」の送信前に呼ばれるJavaScript関数もあります。これのいずれかの省略は、あなたのログインの成功を妨げている可能性があります。それは実験であり、私が恐れている運動を発見します。
また、Cookieawareclientnクラスを作成するたびに、新しいCookieContainerを作成していることに気付きます。これは、クッキーがリクエスト間で保存されていないことを意味します。そのメンバーを静的にして、常に同じcookiecontainerを使用するようにします。
また、他のと言われているように、あなたは実験する必要があります。私がしているのは、FireBugをダウンロードしてインストールし、ブラウザによってどのように送信されているか、ヘッダーなどが表示されることです。その後、httpwebrequest/webclientを使用して同じリクエストを複製します。