C# 経由で Web サイトにログインします
-
06-09-2019 - |
質問
私は C# を使用するのが比較的初めてで、Web サイト上のソース コードの一部を読み取るアプリケーションを持っています。それはすべてうまくいきます。しかし問題は、問題のページでは、このソース コードにアクセスするためにユーザーがログインする必要があることです。私のプログラムには、最初にユーザーを Web サイトにログインさせる方法が必要です。それが完了すると、ソース コードにアクセスして読み取ることができるようになります。
ログインする必要がある Web サイトは次のとおりです。mmoinn.com/index.do?PageModule=UsersLogin
これを行う方法について一日中検索し、例を試しましたが、うまくいきませんでした。
前もって感謝します
正しい解決策はありません
他のヒント
WebClient を引き続き使用して POST (GET の代わりに) を使用できます。 HTTP動詞 現在 DownloadString で使用しています) ですが、(わずかに) 低レベルのクラスである WebRequest および WebResponse を使用する方が簡単であることがわかると思います。
これには 2 つの部分があります。1 つ目はログイン フォームを送信することで、2 つ目は「Set-cookie」ヘッダーを回復し、それを GET リクエストとともに「Cookie」としてサーバーに送り返すことです。サーバーは今後、この Cookie を使用してユーザーを識別します (Cookie ベースの認証を使用していると仮定します。ページが「PHPSESSID」を含む Set-Cookie ヘッダーを返すため、これはかなり確信しています)。
ログインフォームへのPOST
フォーム投稿は簡単にシミュレートできます。投稿データを次のようにフォーマットするだけです。
field1=value1&field2=value2
WebRequest と元のコードを使用する スコット・ハンセルマン, 、フォーム データをログイン フォームに POST する方法は次のとおりです。
string formUrl = "http://www.mmoinn.com/index.do?PageModule=UsersAction&Action=UsersLogin"; // NOTE: This is the URL the form POSTs to, not the URL of the form (you can find this in the "action" attribute of the HTML's form tag
string formParams = string.Format("email_address={0}&password={1}", "your email", "your password");
string cookieHeader;
WebRequest req = WebRequest.Create(formUrl);
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
byte[] bytes = Encoding.ASCII.GetBytes(formParams);
req.ContentLength = bytes.Length;
using (Stream os = req.GetRequestStream())
{
os.Write(bytes, 0, bytes.Length);
}
WebResponse resp = req.GetResponse();
cookieHeader = resp.Headers["Set-cookie"];
ログイン フォームの Set-cookie ヘッダーに表示される内容の例を次に示します。
PHPSESSID=c4812cffcf2c45e0357a5a93c137642e; path=/; domain=.mmoinn.com,wowmine_referer=directenter; path=/; domain=.mmoinn.com,lang=en; path=/;domain=.mmoinn.com,adt_usertype=other,adt_host=-
ログインフォームの背後にあるページを取得する
これで、ログインが必要なページに対して GET リクエストを実行できるようになります。
string pageSource;
string getUrl = "the url of the page behind the login";
WebRequest getRequest = WebRequest.Create(getUrl);
getRequest.Headers.Add("Cookie", cookieHeader);
WebResponse getResponse = getRequest.GetResponse();
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
{
pageSource = sr.ReadToEnd();
}
編集:
最初の POST の結果を表示する必要がある場合は、次のようにして返された HTML を復元できます。
using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
{
pageSource = sr.ReadToEnd();
}
これを真下に置きます cookieHeader = resp.Headers["Set-cookie"];
次に、pageSource に保持されている文字列を検査します。
あなたはそのGetWebRequestメソッドをオーバーライドし、その上にCookieContainerオブジェクトを設定し、Webクライアントから派生するクラスを作成することによって、物事をかなり単純化することができます。あなたが常に同じCookieContainerのインスタンスを設定すると、クッキーの管理があなたのために自動的に処理されます。
しかし、それが送信される前には、HttpWebRequestで取得する唯一の方法は、Webクライアントから継承し、そのメソッドをオーバーライドすることです。
public class CookieAwareWebClient : WebClient
{
private CookieContainer cookie = new CookieContainer();
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
if (request is HttpWebRequest)
{
(request as HttpWebRequest).CookieContainer = cookie;
}
return request;
}
}
var client = new CookieAwareWebClient();
client.BaseAddress = @"https://www.site.com/any/base/url/";
var loginData = new NameValueCollection();
loginData.Add("login", "YourLogin");
loginData.Add("password", "YourPassword");
client.UploadValues("login.php", "POST", loginData);
//Now you are logged in and can request pages
string htmlSource = client.DownloadString("index.php");
マシューブリンドレイに、あなたのコードは、私が(ログインして)必要に応じていくつかのウェブサイトのための非常に良い働いたが、私は必要なHttpWebRequest
とHttpWebResponse
に変更するそう私は、リモートサーバーからの404不正なリクエストのを取得します。また、私はあなたのコードを使用して、私の回避策を共有したい、と私はMoodleののに基づいてのウェブサイトにログインすることを試みたということですが、それはのページを取得して、」あなたのステップでは動作しませんでしたでしょう首尾よくがのログイン、ヘッダー'Set-Cookie'
は、他のウェブサイトにもかかわらず、何も返さなかった投稿するときので、ない「ログインフォームの背後にあるの。
だから私たちは次の要求のためにクッキーを保存する必要があり、この場所だと思うので、私はこれを追加しました。
"ログインフォームへの投稿の" コード・ブロック:
var cookies = new CookieContainer();
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(formUrl);
req.CookieContainer = cookies;
そして、To "のログインフォームの後ろにページを取得するの" ます:
HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(getUrl);
getRequest.CookieContainer = new CookieContainer();
getRequest.CookieContainer.Add(resp.Cookies);
getRequest.Headers.Add("Cookie", cookieHeader);
これをやって、私たちが最初に求めることができるので、の私は、これはCookieContainer
とHTTPCookiesのあいまいな使用である知っているの中で私にログインし、「ログイン背後ページ」(ウェブサイトベースのmoodle)のソースコードを取得し、私をされることができますそこには、以前のサーバーにリクエストを送信する前に保存されたクッキーのセット。これは、とにかく問題なく動作しますが、ここではサンプルプロジェクトとチュートリアルとWebRequest
とWebResponse
について読むには良い情報です:
どの.NET の
時には、それはAllowAutoRedirect
のスイッチをオフにし、両方のログインPOST
とページGET
が同じユーザー・エージェントを要求した設定に役立つことがあります。
request.UserAgent = userAgent;
request.AllowAutoRedirect = false;