問題の解決策をインターネットで大雑把に検索しましたが、Web サイトに適切にログインする方法がまだわかりません。
まず、私が今までやってきたことを説明します。
»ログインしたいウェブサイトhttp://side.utad.pt/cursos/einformatica/を開きました。
» そのソース コードを開いた後、ログイン フォームの投稿先の URL を見つけました。
https://side.utad.pt/side-secure3/login.pl
開こうとしましたが、内部エラーが出たので、代わりに /login.pl なしでその URL にアクセスしようとしましたが、アクセス許可がありません。この URL が機能しないので、最初のリンク自体を使用することを考えました。
» 改ざんデータ拡張機能 (Firefox) を使用すると、post 引数が 3 つあることがわかりました: sessionid、username、password。ユーザー名とパスワードはユーザー自身が入力します。
sessionid を取得するには、ソース コード内で検索して、そこから取得しました。
String^ formUrl = "http://side.utad.pt/cursos/einformatica/";
String^ pageSource;
WebClient^ client = gcnew WebClient();
pageSource = client->DownloadString(formUrl);
delete client;
client = nullptr;int index = pageSource->IndexOf("sessionid");
int startIndex = index + 34;
String^ _sessionid = pageSource->Substring(startIndex, 32);
ここまでは、Url の問題以外は問題ありませんでした。
» 収集したすべてのデータのフォーマットを開始しました (これが正しい方法だと思います):
String^ formParams;
// format data
formParams = "sessionid="+ _sessionid+"&username="+username+"&password="+password;
» その後、コードの「本体」の作業を開始しました。
WebRequest^ req = WebRequest::Create(formUrl);
// encode our data
array<Byte>^ bytes = System::Text::Encoding::ASCII->GetBytes(formParams);
req->ContentType = "application/x-www-form-urlencoded";
req->Method = "POST";
req->ContentLength = bytes->Length;
Stream^ os = req->GetRequestStream();
os->Write(bytes,0,bytes->Length);
os->Close();
私はここまで正しくやっていますか?
» ログインしているかどうかを確認したいので、別のソースコードを入手しようと思いましたが、今回は pos-login ページ (ログインしなくてもアクセスできますが、ログイン後は常にそのページに移動します) ):
// this code is added below os->Close();
WebResponse^ resp = req->GetResponse();
String^ cookieHeader;
cookieHeader = resp->Headers["Set-cookie"];
WebRequest^ getRequest = WebRequest::Create("http://side.utad.pt/cursos/einformatica/principal"); // Exception 1
getRequest->Headers->Add("Cookie", cookieHeader);
WebResponse^ getResponse = getRequest->GetResponse();
StreamReader^ sr = gcnew StreamReader(getRequest->GetRequestStream()); // Exception 2
pageSource = ""; // reset
pageSource = sr->ReadToEnd();
まず、最初の行で例外が発生しますが、ほとんどの場合、原因がわかりません:「サーバーがプロトコル違反をコミットしました Section=ResponseStatusLine」
第二に、そして最後に、その行が例外を発生させない場合、これは発生します (この動詞タイプのコンテンツ本文を送信できません)。
StreamReader^ sr = gcnew StreamReader(getRequest->GetRequestStream());
これを機能させるためのアイデアはありますか?
ここでの問題は Cookie に関連していると思います。私はそれらを適切に保存しなかったかもしれません..
ありがとう