大学の図書館にある本の締め切りを延長する C# プログラムを作成しようとしています。私がやりたいことは次のとおりです: 1.) C# プログラムに入力されたユーザー名とパスワードを使用して、WebRequest & POST メソッドを介して図書館の Web サイトにログインします。 GET パラメータとしてのユーザー名 3.) 指定されたページのコンテンツをダウンロードして、C# プログラムでユーザーに表示します。 4.) ユーザーがプログラムの対応するボタンを押した場合、延長フォームを Web サイトに送信して、すべてのメディアを一度に延長します。
現在、1 と 2 の間で行き詰まっています。Web サイトに接続してユーザーデータを入力できるようですが、取得した WebResponse は再びログイン ページです (Web サイトで手動でログインする場合はそうではありません)。 )。
これは私がウェブサイトに接続するために書いた方法です:
// Login function, logs the user in, uses passed user number & password
public static Boolean userLogin(String unr, String pass)
{
// Login
// Cookie needed for maintaining php session
CookieContainer cContainer = new CookieContainer();
Console.WriteLine(unr+","+pass);
String postUrl = "https://universitylibrary.com/loan/DB=4/LNG=DU/USERINFO_LOGIN";
String formParams = String.Format("ACT={0}&HOST_NAME={1}&HOST_PORT={2}&HOST_SCRIPT={3}&LOGIN={4}&STATUS={5}&BOR_U={6}&BOR_PW={7}","UI_DATA","","","","KNOWNUSER","HML_OK", unr, pass);
String cookieHeader;
WebRequest wreq = WebRequest.Create(postUrl);
wreq.ContentType = "application/x-www-form-urlencoded";
wreq.Method = "POST";
byte[] bytes = Encoding.ASCII.GetBytes(formParams);
wreq.ContentLength = bytes.Length;
using (Stream os = wreq.GetRequestStream())
{
os.Write(bytes, 0, bytes.Length);
}
WebResponse resp = wreq.GetResponse();
cookieHeader = resp.Headers["Set-cookie"];
//Authentication trial
String PageSource;
String getUrl = "https://universitylibrary.com:443/loan/DB=4/USERINFO";
WebRequest getReq = WebRequest.Create(getUrl);
getReq.Headers.Add("Cookie",cookieHeader);
WebResponse getResp = getReq.GetResponse();
using (StreamReader sr = new StreamReader(getResp.GetResponseStream()))
{
PageSource = sr.ReadToEnd();
}
Console.Write(PageSource);
return true;
}
私の間違いがわかりますか?コンソールにソースコードとパラメーター (ユーザー名、パスワード) の出力が表示されますが、出力はやはりログイン ページです。私はただ php ページを見るだけですが、内部システム データにはアクセスできません。私が持っているのは HTML ページだけです。
どんな提案でも大歓迎です!
編集:
私はすべてを再考し、フィドラーによって記録されたように HTTP 要求ヘッダーを完全に再構築しました。関数のその部分は次のようになります。
// Login
// Cookie needed for maintaining php session
CookieContainer cContainer = new CookieContainer();
HttpCookie cookie = new HttpCookie("cookie", "PSC_4='xxxxxxx'; DB='n'");
CookieCollection cookieCol = new CookieCollection();
cookieCol.Add(cookieCol);
cContainer.Add(cookieCol);
Console.WriteLine(unr+","+pass);
String postUrl = "https://universitylibrary.com:443/loan/DB=4/USERINFO";
String formParams = String.Format("ACT={0}&HOST_NAME={1}&HOST_PORT={2}&HOST_SCRIPT={3}&LOGIN={4}&STATUS={5}&BOR_U={6}&BOR_PW={7}","UI_DATA","","","","KNOWNUSER","HML_OK", unr, pass);
String cookieHeader;
HttpWebRequest wreq = (HttpWebRequest) WebRequest.Create(postUrl);
wreq.Referer = "https://universitylibrary.com/loan/DB=4/LNG=DU/USERINFO_LOGIN";
wreq.KeepAlive = true;
wreq.ContentLength = 119;
wreq.Host = "universitylibrary.com";
wreq.ContentType = "application/x-www-form-urlencoded";
wreq.Method = "POST";
wreq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0";
wreq.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
wreq.SendChunked = true;
wreq.TransferEncoding = "gzip, deflate";
byte[] bytes = Encoding.ASCII.GetBytes(formParams);
wreq.ContentLength = bytes.Length;
using (Stream os = wreq.GetRequestStream())
{
os.Write(bytes, 0, bytes.Length);
}
cookieHeader = "";
try
{
HttpWebResponse resp = (HttpWebResponse) wreq.GetResponse();
cookieHeader = resp.Headers["Set-cookie"];
}
catch (WebException ex)
{
Console.WriteLine(ex.Status);
Console.WriteLine(ex.Response);
}
ただし、以前と同じ問題で、まだすべてが機能しません。HttpWebRequest が https を処理できない、または https が機能するために他に何か不足している可能性はありますか? (HTTP と HTTPS は構文的に同一のようで、ポートは正しく 443 に設定されています。本当の違いは追加の SSL/TLS レイヤーにあるようです。これをどこかに追加する必要があるのでしょうか?)