3

問題の解決策をインターネットで大雑把に検索しましたが、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 に関連していると思います。私はそれらを適切に保存しなかったかもしれません..

ありがとう

4

0 に答える 0